diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 8ce85cf6bb9a06ac31c4377c7650a0ffd4c39846..a1e0a17c882ef273c881aa34cd6d520b874771fe 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -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 diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 6e670c58c6af5df4474389b3627a44816944b8dd..1d4d1235c963415b017c50b0c12998888d02b8ce 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -197,10 +197,6 @@ public: this->TLSSupported = false; } - virtual const char *getUnicodeStringSymbolPrefix() const { - return "__utf16_string_"; - } - virtual const char *getUnicodeStringSection() const { return "__TEXT,__ustring"; } diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 4c8ef5836770906775c5dd8e5fe3795a7158fbdc..a7658e5e14fa9d1cfc528d166691544b45cc91a9 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -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) { diff --git a/clang/test/CodeGen/darwin-string-literals.c b/clang/test/CodeGen/darwin-string-literals.c index 3be24b1bce93db5c3b0c0e9909e7113fcdea17e8..04e43a234d19d6489f878711252aa69820c4e230 100644 --- a/clang/test/CodeGen/darwin-string-literals.c +++ b/clang/test/CodeGen/darwin-string-literals.c @@ -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");