]> granicus.if.org Git - clang/commitdiff
fix some cfstring related issues:
authorChris Lattner <sabre@nondot.org>
Wed, 14 Oct 2009 05:55:45 +0000 (05:55 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 14 Oct 2009 05:55:45 +0000 (05:55 +0000)
1) -fwritable-string does affect the non-utf16 version of cfstrings
   just not the utf16 ones.
2) utf16 strings should always be marked constant, as the __TEXT segment
   is readonly.
3) The name of the global doesn't matter, remove it from TargetInfo.
4) Trust the asmprinter to drop cstrings into the right section, like llvmgcc does now.

This fixes rdar://7115750

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84077 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 8ce85cf6bb9a06ac31c4377c7650a0ffd4c39846..a1e0a17c882ef273c881aa34cd6d520b874771fe 100644 (file)
@@ -300,12 +300,6 @@ public:
 
   virtual bool useGlobalsForAutomaticVariables() const { return false; }
 
-  /// getUnicodeStringSymbolPrefix - Get the default symbol prefix to
-  /// use for string literals.
-  virtual const char *getUnicodeStringSymbolPrefix() const {
-    return ".str";
-  }
-
   /// getUnicodeStringSection - Return the section to use for unicode
   /// string literals, or 0 if no special section is used.
   virtual const char *getUnicodeStringSection() const {
@@ -318,14 +312,6 @@ public:
     return "__DATA,__cfstring";
   }
 
-  /// getCFStringDataSection - Return the section to use for the
-  /// constant string data associated with a CFString literal, or 0 if
-  /// no special section is used.
-  virtual const char *getCFStringDataSection() const {
-    return "__TEXT,__cstring,cstring_literals";
-  }
-
-
   /// isValidSectionSpecifier - This is an optional hook that targets can
   /// implement to perform semantic checking on attribute((section("foo")))
   /// specifiers.  In this case, "foo" is passed in to be checked.  If the
index 6e670c58c6af5df4474389b3627a44816944b8dd..1d4d1235c963415b017c50b0c12998888d02b8ce 100644 (file)
@@ -197,10 +197,6 @@ public:
       this->TLSSupported = false;
     }
 
-  virtual const char *getUnicodeStringSymbolPrefix() const {
-    return "__utf16_string_";
-  }
-
   virtual const char *getUnicodeStringSection() const {
     return "__TEXT,__ustring";
   }
index 4c8ef5836770906775c5dd8e5fe3795a7158fbdc..a7658e5e14fa9d1cfc528d166691544b45cc91a9 100644 (file)
@@ -1434,27 +1434,24 @@ CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
   // String pointer.
   llvm::Constant *C = llvm::ConstantArray::get(VMContext, Entry.getKey().str());
 
-  const char *Sect, *Prefix;
-  bool isConstant;
+  const char *Sect = 0;
   llvm::GlobalValue::LinkageTypes Linkage;
+  bool isConstant;
   if (isUTF16) {
-    Prefix = getContext().Target.getUnicodeStringSymbolPrefix();
     Sect = getContext().Target.getUnicodeStringSection();
-    // FIXME: why do utf strings get "l" labels instead of "L" labels?
+    // FIXME: why do utf strings get "_" labels instead of "L" labels?
     Linkage = llvm::GlobalValue::InternalLinkage;
-    // FIXME: Why does GCC not set constant here?
-    isConstant = false;
+    // Note: -fwritable-strings doesn't make unicode CFStrings writable, but
+    // does make plain ascii ones writable.
+    isConstant = true;
   } else {
-    Prefix = ".str";
-    Sect = getContext().Target.getCFStringDataSection();
     Linkage = llvm::GlobalValue::PrivateLinkage;
-    // FIXME: -fwritable-strings should probably affect this, but we
-    // are following gcc here.
-    isConstant = true;
+    isConstant = !Features.WritableStrings;
   }
+  
   llvm::GlobalVariable *GV =
-    new llvm::GlobalVariable(getModule(), C->getType(), isConstant,
-                             Linkage, C, Prefix);
+    new llvm::GlobalVariable(getModule(), C->getType(), isConstant, Linkage, C,
+                             ".str");
   if (Sect)
     GV->setSection(Sect);
   if (isUTF16) {
index 3be24b1bce93db5c3b0c0e9909e7113fcdea17e8..04e43a234d19d6489f878711252aa69820c4e230 100644 (file)
@@ -1,14 +1,14 @@
 // RUN: clang-cc -triple i386-apple-darwin9 -emit-llvm %s -o - | FileCheck -check-prefix LSB %s &&
 
 // CHECK-LSB: @.str = private constant [8 x i8] c"string0\00"
-// CHECK-LSB: @.str1 = private constant [8 x i8] c"string1\00", section "__TEXT,__cstring,cstring_literals"
-// CHECK-LSB: @__utf16_string_ = internal global [36 x i8] c"h\00e\00l\00l\00o\00 \00\92! \00\03& \00\90! \00w\00o\00r\00l\00d\00\00\00", section "__TEXT,__ustring", align 2
+// CHECK-LSB: @.str1 = private constant [8 x i8] c"string1\00"
+// CHECK-LSB: @.str2 = internal constant [36 x i8] c"h\00e\00l\00l\00o\00 \00\92! \00\03& \00\90! \00w\00o\00r\00l\00d\00\00\00", section "__TEXT,__ustring", align 2
 
 // RUN: clang-cc -triple powerpc-apple-darwin9 -emit-llvm %s -o - | FileCheck -check-prefix MSB %s
 
 // CHECK-MSB: @.str = private constant [8 x i8] c"string0\00"
-// CHECK-MSB: @.str1 = private constant [8 x i8] c"string1\00", section "__TEXT,__cstring,cstring_literals"
-// CHECK-MSB: @__utf16_string_ = internal global [36 x i8] c"\00h\00e\00l\00l\00o\00 !\92\00 &\03\00 !\90\00 \00w\00o\00r\00l\00d\00\00", section "__TEXT,__ustring", align 2
+// CHECK-MSB: @.str1 = private constant [8 x i8] c"string1\00"
+// CHECK-MSB: @.str2 = internal constant [36 x i8] c"\00h\00e\00l\00l\00o\00 !\92\00 &\03\00 !\90\00 \00w\00o\00r\00l\00d\00\00", section "__TEXT,__ustring", align 2
 
 const char *g0 = "string0";
 const void *g1 = __builtin___CFStringMakeConstantString("string1");