From: Saleem Abdulrasool Date: Tue, 20 Sep 2016 18:38:54 +0000 (+0000) Subject: CodeGen: further merge cstring literal construction X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f127b477d729338923d8b916be540c141efd189c;p=clang CodeGen: further merge cstring literal construction Use the new CreateCStringLiteral in an additional site. Now all the C string literals are created in one function. Furthermore, mark the additional literal as an `unnamed_addr constant`. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281997 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 1b435d33ac..70fefec574 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -1026,7 +1026,9 @@ public: bool AddToUsed); llvm::GlobalVariable *CreateCStringLiteral(StringRef Name, - ObjCLabelType LabelType); + ObjCLabelType LabelType, + bool ForceNonFragileABI = false, + bool NullTerminate = true); protected: CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF, @@ -2586,10 +2588,9 @@ llvm::Constant *CGObjCCommonMac::getBitmapBlockLayout(bool ComputeByrefLayout) { } } - llvm::GlobalVariable *Entry = CreateMetadataVar( - "OBJC_CLASS_NAME_", - llvm::ConstantDataArray::getString(VMContext, BitMap, false), - "__TEXT,__objc_classname,cstring_literals", CharUnits::One(), true); + auto *Entry = CreateCStringLiteral(BitMap, ObjCLabelType::ClassName, + /*ForceNonFragileABI=*/true, + /*NullTerminate=*/false); return getConstantGEP(VMContext, Entry, 0, 0); } @@ -3661,7 +3662,9 @@ llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name, } llvm::GlobalVariable * -CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type) { +CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type, + bool ForceNonFragileABI, + bool NullTerminate) { StringRef Label; switch (Type) { case ObjCLabelType::ClassName: Label = "OBJC_CLASS_NAME_"; break; @@ -3670,26 +3673,29 @@ CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type) { case ObjCLabelType::PropertyName: Label = "OBJC_PROP_NAME_ATTR_"; break; } + bool NonFragile = ForceNonFragileABI || isNonFragileABI(); + StringRef Section; switch (Type) { case ObjCLabelType::ClassName: - Section = isNonFragileABI() ? "__TEXT,__objc_classname,cstring_literals" - : "__TEXT,__cstring,cstring_literals"; + Section = NonFragile ? "__TEXT,__objc_classname,cstring_literals" + : "__TEXT,__cstring,cstring_literals"; break; case ObjCLabelType::MethodVarName: - Section = isNonFragileABI() ? "__TEXT,__objc_methname,cstring_literals" - : "__TEXT,__cstring,cstring_literals"; + Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals" + : "__TEXT,__cstring,cstring_literals"; break; case ObjCLabelType::MethodVarType: - Section = isNonFragileABI() ? "__TEXT,__objc_methtype,cstring_literals" - : "__TEXT,__cstring,cstring_literals"; + Section = NonFragile ? "__TEXT,__objc_methtype,cstring_literals" + : "__TEXT,__cstring,cstring_literals"; break; case ObjCLabelType::PropertyName: Section = "__TEXT,__cstring,cstring_literals"; break; } - llvm::Constant *Value = llvm::ConstantDataArray::getString(VMContext, Name); + llvm::Constant *Value = + llvm::ConstantDataArray::getString(VMContext, Name, NullTerminate); llvm::GlobalVariable *GV = new llvm::GlobalVariable(CGM.getModule(), Value->getType(), /*isConstant=*/true, diff --git a/test/CodeGenObjCXX/arc-blocks.mm b/test/CodeGenObjCXX/arc-blocks.mm index 50579d7a0e..2bae18a19b 100644 --- a/test/CodeGenObjCXX/arc-blocks.mm +++ b/test/CodeGenObjCXX/arc-blocks.mm @@ -2,7 +2,7 @@ // CHECK: [[A:.*]] = type { i64, [10 x i8*] } -// CHECK: [[LAYOUT0:@.*]] = private global [3 x i8] c" 9\00" +// CHECK: [[LAYOUT0:@.*]] = private unnamed_addr constant [3 x i8] c" 9\00" // rdar://13045269 // If a __block variable requires extended layout information *and*