]> granicus.if.org Git - clang/commitdiff
Add target hook for setting symbol prefix and section of unicode
authorDaniel Dunbar <daniel@zuster.org>
Fri, 3 Apr 2009 00:57:44 +0000 (00:57 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 3 Apr 2009 00:57:44 +0000 (00:57 +0000)
string literals.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68363 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/TargetInfo.h
lib/Basic/Targets.cpp
lib/CodeGen/CodeGenModule.cpp
test/CodeGen/darwin-string-literals.c

index d9a8bc1f500d24eea883d4dce94db09d230babed..4fd624a6269d2e48f1f99b230e011e9c7853be85 100644 (file)
@@ -257,6 +257,18 @@ public:
     return "";
   }
 
+  /// getUnicodeStringSymbolPrefix - Get the default symbol prefix to
+  /// use for string literals.
+  virtual const char *getUnicodeStringSymbolPrefix() const { 
+    return ".str";
+  }
+
+  /// getUnicodeStringSymbolPrefix - Get the default symbol prefix to
+  /// use for string literals.
+  virtual const char *getUnicodeStringSection() const { 
+    return 0;
+  }
+
   /// getCFStringSection - Return the section to use for the CFString
   /// literals, or 0 if no special section is used.
   virtual const char *getCFStringSection() const { 
index ce55ec8046535a12c466abdd498f064efdb13c48..5f5ba60e85853f0b510ceac5a6264262e8caa8a9 100644 (file)
@@ -658,6 +658,14 @@ public:
     return IsConstant ? "\01LC" : "\01lC";
   }
 
+  virtual const char *getUnicodeStringSymbolPrefix() const { 
+    return "__utf16_string_";
+  }
+
+  virtual const char *getUnicodeStringSection() const { 
+    return "__TEXT,__ustring";
+  }
+
   virtual const char *getCFStringSymbolPrefix() const { 
     return "\01LC";
   }
@@ -810,6 +818,14 @@ public:
     return IsConstant ? "\01LC" : "\01lC";
   }
 
+  virtual const char *getUnicodeStringSymbolPrefix() const { 
+    return "__utf16_string_";
+  }
+
+  virtual const char *getUnicodeStringSection() const { 
+    return "__TEXT,__ustring";
+  }
+
   virtual const char *getCFStringSymbolPrefix() const { 
     return "\01L_unnamed_cfstring_";
   }
index fa475ced6e8faba0024034baa760993d0563b832..1132c3f721dfcd53e50268ceebe0c43aec501c83 100644 (file)
@@ -1082,13 +1082,31 @@ GetAddrOfConstantCFString(const StringLiteral *Literal) {
   CurField = NextField;
   NextField = *Field++;
   llvm::Constant *C = llvm::ConstantArray::get(str);
+
+  const char *Sect, *Prefix;
+  bool isConstant;
+  if (isUTF16) {
+    Prefix = getContext().Target.getUnicodeStringSymbolPrefix();
+    Sect = getContext().Target.getUnicodeStringSection();
+    // FIXME: Why does GCC not set constant here?
+    isConstant = false;
+  } else {
+    Prefix = getContext().Target.getStringSymbolPrefix(true);
+    Sect = getContext().Target.getCFStringDataSection();
+    // FIXME: -fwritable-strings should probably affect this, but we
+    // are following gcc here.
+    isConstant = true;
+  }
   llvm::GlobalVariable *GV = 
-    new llvm::GlobalVariable(C->getType(), true
+    new llvm::GlobalVariable(C->getType(), isConstant
                              llvm::GlobalValue::InternalLinkage,
-                             C, getContext().Target.getStringSymbolPrefix(true),
-                             &getModule());
-  if (const char *Sect = getContext().Target.getCFStringDataSection())
+                             C, Prefix, &getModule());
+  if (Sect)
     GV->setSection(Sect);
+  if (isUTF16) {
+    unsigned Align = getContext().getTypeAlign(getContext().ShortTy)/8;
+    GV->setAlignment(Align); 
+  }
   appendFieldAndPadding(*this, Fields, CurField, NextField,
                         llvm::ConstantExpr::getGetElementPtr(GV, Zeros, 2),
                         CFRD, STy);
index 5bfb84e91d44134833f4f631c64a8b19c8bb94bc..ff245fcc7a5c1f8d1cba7f8c8615e213eb6796ab 100644 (file)
@@ -2,8 +2,9 @@
 
 // RUN: grep -F '@"\01LC" = internal constant [8 x i8] c"string0\00"' %t &&
 // RUN: grep -F '@"\01LC1" = internal constant [8 x i8] c"string1\00", section "__TEXT,__cstring,cstring_literals"' %t &&
-
+// RUN: grep -F '@__utf16_string_ = internal global [35 x i8] c"h\00e\00l\00l\00o\00 \00\92! \00\03& \00\90! \00w\00o\00r\00l\00d\00\00", section "__TEXT,__ustring", align 2' %t &&
 // RUN: true
 
 const char *g0 = "string0";
 const void *g1 = __builtin___CFStringMakeConstantString("string1");
+const void *g2 = __builtin___CFStringMakeConstantString("hello \u2192 \u2603 \u2190 world");