]> granicus.if.org Git - clang/commitdiff
CodeGen: further merge cstring literal construction
authorSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 20 Sep 2016 18:38:54 +0000 (18:38 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 20 Sep 2016 18:38:54 +0000 (18:38 +0000)
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

lib/CodeGen/CGObjCMac.cpp
test/CodeGenObjCXX/arc-blocks.mm

index 1b435d33acc463145d86f0eed9e43fe989b15bd4..70fefec574d7bd92952cb9ab7a9d48f64d981d16 100644 (file)
@@ -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,
index 50579d7a0e4d886a41c9378e41548dbf83635ed7..2bae18a19b3fc1d4fe94e7c6f273b6cd2d178536 100644 (file)
@@ -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*