diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 1b435d33acc463145d86f0eed9e43fe989b15bd4..70fefec574d7bd92952cb9ab7a9d48f64d981d16 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 50579d7a0e4d886a41c9378e41548dbf83635ed7..2bae18a19b3fc1d4fe94e7c6f273b6cd2d178536 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*