CodeGen: mark ObjC cstring literals as unnamed_addr

These are all emitted into a section with a cstring_literal attribute.  The
attribute permits the linker to coalesce the string contents.  The address of
the strings are not important.

llvm-svn: 281855
This commit is contained in:
Saleem Abdulrasool 2016-09-18 16:12:14 +00:00
parent 0c54dc862e
commit 3f307518f8
19 changed files with 82 additions and 80 deletions

View File

@ -3694,7 +3694,9 @@ CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type) {
new llvm::GlobalVariable(CGM.getModule(), Value->getType(),
/*isConstant=*/true,
llvm::GlobalValue::PrivateLinkage, Value, Label);
GV->setSection(Section);
if (CGM.getTriple().isOSBinFormatMachO())
GV->setSection(Section);
GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
GV->setAlignment(CharUnits::One().getQuantity());
CGM.addCompilerUsedGlobal(GV);

View File

@ -53,17 +53,17 @@ typedef signed char BOOL;
+ (id)stringWithUTF8String:(const char *)nullTerminatedCString;
@end
// CHECK: [[WithIntMeth:@.*]] = private constant [15 x i8] c"numberWithInt:\00"
// CHECK: [[WithIntMeth:@.*]] = private unnamed_addr constant [15 x i8] c"numberWithInt:\00"
// CHECK: [[WithIntSEL:@.*]] = private externally_initialized global i8* getelementptr inbounds ([15 x i8], [15 x i8]* [[WithIntMeth]]
// CHECK: [[WithCharMeth:@.*]] = private constant [16 x i8] c"numberWithChar:\00"
// CHECK: [[WithCharMeth:@.*]] = private unnamed_addr constant [16 x i8] c"numberWithChar:\00"
// CHECK: [[WithCharSEL:@.*]] = private externally_initialized global i8* getelementptr inbounds ([16 x i8], [16 x i8]* [[WithCharMeth]]
// CHECK: [[WithBoolMeth:@.*]] = private constant [16 x i8] c"numberWithBool:\00"
// CHECK: [[WithBoolMeth:@.*]] = private unnamed_addr constant [16 x i8] c"numberWithBool:\00"
// CHECK: [[WithBoolSEL:@.*]] = private externally_initialized global i8* getelementptr inbounds ([16 x i8], [16 x i8]* [[WithBoolMeth]]
// CHECK: [[WithIntegerMeth:@.*]] = private constant [19 x i8] c"numberWithInteger:\00"
// CHECK: [[WithIntegerMeth:@.*]] = private unnamed_addr constant [19 x i8] c"numberWithInteger:\00"
// CHECK: [[WithIntegerSEL:@.*]] = private externally_initialized global i8* getelementptr inbounds ([19 x i8], [19 x i8]* [[WithIntegerMeth]]
// CHECK: [[WithUnsignedIntegerMeth:@.*]] = private constant [27 x i8] c"numberWithUnsignedInteger:\00"
// CHECK: [[WithUnsignedIntegerMeth:@.*]] = private unnamed_addr constant [27 x i8] c"numberWithUnsignedInteger:\00"
// CHECK: [[WithUnsignedIntegerSEL:@.*]] = private externally_initialized global i8* getelementptr inbounds ([27 x i8], [27 x i8]* [[WithUnsignedIntegerMeth]]
// CHECK: [[stringWithUTF8StringMeth:@.*]] = private constant [22 x i8] c"stringWithUTF8String:\00"
// CHECK: [[stringWithUTF8StringMeth:@.*]] = private unnamed_addr constant [22 x i8] c"stringWithUTF8String:\00"
// CHECK: [[stringWithUTF8StringSEL:@.*]] = private externally_initialized global i8* getelementptr inbounds ([22 x i8], [22 x i8]* [[stringWithUTF8StringMeth]]
int main() {

View File

@ -13,8 +13,8 @@ void f0(A *a) {
a.y += a1;
}
// CHECK-LP64: private constant [13 x i8] c"COMPLEX_PROP
// CHECK-LP64: private constant [17 x i8] c"setCOMPLEX_PROP
// CHECK-LP64: private unnamed_addr constant [13 x i8] c"COMPLEX_PROP
// CHECK-LP64: private unnamed_addr constant [17 x i8] c"setCOMPLEX_PROP
// rdar: // 7351147
@interface B

View File

@ -8,4 +8,4 @@
@implementation Foo
- (id)test:(id )one, id two {return two; } @end
// CHECK-LP64: private constant [11 x i8] c"@24@0:8@16
// CHECK-LP64: private unnamed_addr constant [11 x i8] c"@24@0:8@16

View File

@ -14,8 +14,8 @@ typedef struct {} Z;
-(void)foo:(Z)a: (char*)b : (Z)c : (double) d {}
@end
// CHECK: private constant [14 x i8] c"v16@0:8{?=}16
// CHECK: private constant [26 x i8] c"v32@0:8{?=}16*16{?=}24d24
// CHECK: private unnamed_addr constant [14 x i8] c"v16@0:8{?=}16
// CHECK: private unnamed_addr constant [26 x i8] c"v32@0:8{?=}16*16{?=}24d24
// rdar://13190095
@ -34,7 +34,7 @@ typedef BABugExample BABugExampleRedefinition;
@synthesize property = _property;
@end
// CHECK: private constant [24 x i8] c"^{BABugExample=@}16
// CHECK: private unnamed_addr constant [24 x i8] c"^{BABugExample=@}16
// rdar://14408244
@class SCNCamera;
@ -52,7 +52,7 @@ typedef struct
C3DCameraStorage _storage;
}
@end
// CHECK: private constant [39 x i8] c"{?=\22presentationInstance\22^{SCNCamera}}\00"
// CHECK: private unnamed_addr constant [39 x i8] c"{?=\22presentationInstance\22^{SCNCamera}}\00"
// rdar://16655340
int i;

View File

@ -1,7 +1,7 @@
// RUN: %clang_cc1 -triple i686-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o %t %s
// RUN: FileCheck < %t %s
//
// CHECK: @OBJC_METH_VAR_TYPE_.34 = private constant [16 x i8] c"v12@0:4[3[4@]]8\00"
// CHECK: @OBJC_METH_VAR_TYPE_.34 = private unnamed_addr constant [16 x i8] c"v12@0:4[3[4@]]8\00"
@class Int1;

View File

@ -16,9 +16,9 @@
// GLOBALS-LABEL @OBJC_METACLASS_A
// Strong layout: scan the first word.
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private constant [2 x i8] c"\01\00"
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [2 x i8] c"\01\00"
// Weak layout: skip the first word, scan the second word.
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private constant [2 x i8] c"\11\00"
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [2 x i8] c"\11\00"
// 0x04002001
// ^ is compiled by ARC (controls interpretation of layouts)
@ -119,9 +119,9 @@
// GLOBALS-LABEL: @OBJC_METACLASS_C
// Strong layout: skip five, scan four, skip three, scan seven
// 'T' == 0x54, '7' == 0x37
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private constant [3 x i8] c"T7\00"
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [3 x i8] c"T7\00"
// Weak layout: skip nine, scan three
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private constant [2 x i8] c"\93\00"
// GLOBALS: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant [2 x i8] c"\93\00"
extern void useBlock(void (^block)(void));

View File

@ -33,9 +33,9 @@ __weak B *f2;
@property int p3;
@end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"C\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\11p\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"!`\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"C\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11p\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!`\00"
@implementation C
@ -48,9 +48,9 @@ __weak B *f2;
@property (assign) __weak id p2;
@end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"A\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\11q\10\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"!q\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"A\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11q\10\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!q\00"
@implementation A
@synthesize p0 = _p0;
@ -62,9 +62,9 @@ __weak B *f2;
@property int p3;
@end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"D\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\11p\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"!`\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"D\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11p\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!`\00"
@implementation D
@synthesize p3 = _p3;
@ -89,8 +89,8 @@ typedef unsigned int FSCatalogInfoBitmap;
}
@end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"NSFileLocationComponent\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\01\14\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"NSFileLocationComponent\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\01\14\00"
@implementation NSFileLocationComponent @end
@ -108,8 +108,8 @@ typedef unsigned int FSCatalogInfoBitmap;
}
@end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"Foo\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\02\10\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"Foo\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\10\00"
@implementation Foo @end
@ -124,8 +124,8 @@ struct __attribute__((packed)) PackedStruct {
}
@end
@implementation Packed @end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"Packed\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\01 \00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"Packed\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\01 \00"
// ' ' == 0x20
// Ensure that layout descends into anonymous unions and structs.
@ -142,8 +142,8 @@ struct __attribute__((packed)) PackedStruct {
}
@end
@implementation AnonymousUnion @end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"AnonymousUnion\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\02\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"AnonymousUnion\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\00"
@interface AnonymousStruct : NSObject {
struct {
@ -155,7 +155,7 @@ struct __attribute__((packed)) PackedStruct {
}
@end
@implementation AnonymousStruct @end
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"AnonymousStruct\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"\02\10\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private constant {{.*}} c"!\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"AnonymousStruct\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\10\00"
// CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!\00"
// '!' == 0x21

View File

@ -2,11 +2,11 @@
// CHECK: .lazy_reference .objc_class_name_J0
// CHECK: @OBJC_METH_VAR_NAME_{{[0-9]*}} = private constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @OBJC_METH_VAR_TYPE_{{[0-9]*}} = private constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @OBJC_METH_VAR_NAME_{{[0-9]*}} = private unnamed_addr constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @OBJC_METH_VAR_TYPE_{{[0-9]*}} = private unnamed_addr constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @"\01l_OBJC_PROTOCOLEXT_P" = private global
// CHECK-NOT: section
// CHECK: @OBJC_CLASS_NAME_{{[0-9]*}} = private constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @OBJC_CLASS_NAME_{{[0-9]*}} = private unnamed_addr constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @OBJC_PROTOCOL_INSTANCE_METHODS_P = private global {{.*}}section "__OBJC,__cat_inst_meth,regular,no_dead_strip", align 4
// CHECK: @OBJC_PROTOCOL_CLASS_METHODS_P = private global {{.*}}section "__OBJC,__cat_cls_meth,regular,no_dead_strip", align 4
// CHECK: @OBJC_PROTOCOL_P = private global {{.*}}section "__OBJC,__protocol,regular,no_dead_strip", align 4
@ -15,7 +15,7 @@
// CHECK: @OBJC_METACLASS_A = private global {{.*}}section "__OBJC,__meta_class,regular,no_dead_strip", align 4
// CHECK: @OBJC_INSTANCE_VARIABLES_A = private global {{.*}}section "__OBJC,__instance_vars,regular,no_dead_strip", align 4
// CHECK: @OBJC_INSTANCE_METHODS_A = private global {{.*}}section "__OBJC,__inst_meth,regular,no_dead_strip", align 4
// CHECK: @OBJC_PROP_NAME_ATTR_{{[0-9]*}} = private constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @OBJC_PROP_NAME_ATTR_{{[0-9]*}} = private unnamed_addr constant {{.*}}section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @"\01l_OBJC_$_PROP_LIST_A" = private global {{.*}}section "__OBJC,__property,regular,no_dead_strip", align 4
// CHECK: @OBJC_CLASSEXT_A = private global {{.*}}section "__OBJC,__class_ext,regular,no_dead_strip", align 4
// CHECK: @OBJC_CLASS_A = private global {{.*}}section "__OBJC,__class,regular,no_dead_strip", align 4

View File

@ -5,9 +5,9 @@
// CHECK: @_objc_empty_vtable = external global
// CHECK: @"OBJC_CLASS_$_A" = global
// CHECK: @"OBJC_METACLASS_$_A" = global {{.*}} section "__DATA, __objc_data", align 8
// CHECK: @OBJC_CLASS_NAME_{{[0-9]*}} = private constant {{.*}} section "__TEXT,__objc_classname,cstring_literals", align 1
// CHECK: @OBJC_METH_VAR_NAME_{{[0-9]*}} = private constant {{.*}} section "__TEXT,__objc_methname,cstring_literals", align 1
// CHECK: @OBJC_METH_VAR_TYPE_{{[0-9]*}} = private constant {{.*}} section "__TEXT,__objc_methtype,cstring_literals", align 1
// CHECK: @OBJC_CLASS_NAME_{{[0-9]*}} = private unnamed_addr constant {{.*}} section "__TEXT,__objc_classname,cstring_literals", align 1
// CHECK: @OBJC_METH_VAR_NAME_{{[0-9]*}} = private unnamed_addr constant {{.*}} section "__TEXT,__objc_methname,cstring_literals", align 1
// CHECK: @OBJC_METH_VAR_TYPE_{{[0-9]*}} = private unnamed_addr constant {{.*}} section "__TEXT,__objc_methtype,cstring_literals", align 1
// CHECK: @"\01l_OBJC_$_CLASS_METHODS_A" = private global {{.*}} section "__DATA, __objc_const", align 8
// CHECK: @"\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_P" = private global {{.*}} section "__DATA, __objc_const", align 8
// CHECK: @"\01l_OBJC_$_PROTOCOL_CLASS_METHODS_P" = private global {{.*}} section "__DATA, __objc_const", align 8
@ -17,7 +17,7 @@
// CHECK: @"\01l_OBJC_METACLASS_RO_$_A" = private global {{.*}} section "__DATA, __objc_const", align 8
// CHECK: @"\01l_OBJC_$_INSTANCE_METHODS_A" = private global {{.*}} section "__DATA, __objc_const", align 8
// CHECK: @"\01l_OBJC_$_INSTANCE_VARIABLES_A" = private global {{.*}} section "__DATA, __objc_const", align 8
// CHECK: @OBJC_PROP_NAME_ATTR_{{[0-9]*}} = private constant {{.*}} section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @OBJC_PROP_NAME_ATTR_{{[0-9]*}} = private unnamed_addr constant {{.*}} section "__TEXT,__cstring,cstring_literals", align 1
// CHECK: @"\01l_OBJC_$_PROP_LIST_A" = private global {{.*}} section "__DATA, __objc_const", align 8
// CHECK: @"\01l_OBJC_CLASS_RO_$_A" = private global {{.*}} section "__DATA, __objc_const", align 8
// CHECK: @"\01l_OBJC_$_CATEGORY_INSTANCE_METHODS_A_$_Cat" = private global {{.*}} section "__DATA, __objc_const", align 8

View File

@ -5,7 +5,7 @@
// CHECK: [[CLASS:@.*]] = external global %struct._class_t
// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}}
// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=II{{.*}}
// CHECK: [[METH:@.*]] = private constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[METH:@.*]] = private unnamed_addr constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}}
// CHECK: [[POINT_STR:.*]] = {{.*}}CGPoint=dd{{.*}}
// CHECK: [[SIZE_STR:.*]] = {{.*}}CGSize=dd{{.*}}

View File

@ -5,7 +5,7 @@
// CHECK: [[CLASS:@.*]] = external global %struct._class_t
// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}}
// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=II{{.*}}
// CHECK: [[METH:@.*]] = private constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[METH:@.*]] = private unnamed_addr constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}}
// CHECK: [[POINT_STR:.*]] = {{.*}}CGPoint=dd{{.*}}
// CHECK: [[SIZE_STR:.*]] = {{.*}}CGSize=dd{{.*}}

View File

@ -5,7 +5,7 @@
// CHECK: [[CLASS:@.*]] = external global %struct._class_t
// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}}
// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=QQ{{.*}}
// CHECK: [[METH:@.*]] = private constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[METH:@.*]] = private unnamed_addr constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}}
// CHECK: [[POINT_STR:.*]] = {{.*}}_NSPoint=dd{{.*}}
// CHECK: [[SIZE_STR:.*]] = {{.*}}_NSSize=dd{{.*}}

View File

@ -5,7 +5,7 @@
// CHECK: [[CLASS:@.*]] = external global %struct._class_t
// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}}
// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=QQ{{.*}}
// CHECK: [[METH:@.*]] = private constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[METH:@.*]] = private unnamed_addr constant {{.*}}valueWithBytes:objCType:{{.*}}
// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}}
// CHECK: [[POINT_STR:.*]] = {{.*}}_NSPoint=dd{{.*}}
// CHECK: [[SIZE_STR:.*]] = {{.*}}_NSSize=dd{{.*}}

View File

@ -59,9 +59,9 @@ id Test16877359() {
// CHECK: @"OBJC_CLASS_$_MySecretNamespace.Message" = global %struct._class_t
// CHECK: @"OBJC_METACLASS_$_MySecretNamespace.Message" = global %struct._class_t
// CHECK: private constant [42 x i8] c"T@\22MySecretNamespace.Message\22,&,V_msgProp\00"
// CHECK: private constant [76 x i8] c"T@\22MySecretNamespace.Message<MySecretNamespace.Protocol3>\22,&,V_msgProtoProp\00"
// CHECK: private constant [50 x i8] c"T@\22<MySecretNamespace.Protocol3>\22,&,V_idProtoProp\00"
// CHECK: private unnamed_addr constant [42 x i8] c"T@\22MySecretNamespace.Message\22,&,V_msgProp\00"
// CHECK: private unnamed_addr constant [76 x i8] c"T@\22MySecretNamespace.Message<MySecretNamespace.Protocol3>\22,&,V_msgProtoProp\00"
// CHECK: private unnamed_addr constant [50 x i8] c"T@\22<MySecretNamespace.Protocol3>\22,&,V_idProtoProp\00"
// CHECK: @"OBJC_CLASS_$_foo" = external global %struct._class_t
// CHECK: define internal i8* @"\01-[Message MyMethod]"

View File

@ -17,7 +17,7 @@ __attribute__((objc_root_class))
@end
// Metadata for _myprop should be present, and PROP_LIST for Foo should have
// only one entry.
// CHECK: = private constant [12 x i8] c"Ti,V_myprop\00",
// CHECK: = private unnamed_addr constant [12 x i8] c"Ti,V_myprop\00",
// CHECK: @"\01l_OBJC_$_PROP_LIST_Foo" = private global { i32, i32, [1 x %struct._prop_t] }
// Readonly property in interface made readwrite in a category:
@ -40,8 +40,8 @@ __attribute__((objc_root_class))
// Metadata for _evolvingprop should be present, and PROP_LIST for FooRO should
// still have only one entry, and the one entry should point to the version of
// the property with a getter and setter.
// CHECK: [[evolvinggetter:@OBJC_PROP_NAME_ATTR[^ ]+]] = private constant [13 x i8] c"evolvingprop\00"
// CHECK: [[evolvingsetter:@OBJC_PROP_NAME_ATTR[^ ]+]] = private constant [18 x i8] c"Ti,V_evolvingprop\00",
// CHECK: [[booleanmetadata:@OBJC_PROP_NAME_ATTR[^ ]+]] = private constant [34 x i8] c"Ti,N,GisBooleanProp,V_booleanProp\00"
// CHECK: [[weakmetadata:@OBJC_PROP_NAME_ATTR[^ ]+]] = private constant [23 x i8] c"T@\22Foo\22,W,N,V_weakProp\00"
// CHECK: [[evolvinggetter:@OBJC_PROP_NAME_ATTR[^ ]+]] = private unnamed_addr constant [13 x i8] c"evolvingprop\00"
// CHECK: [[evolvingsetter:@OBJC_PROP_NAME_ATTR[^ ]+]] = private unnamed_addr constant [18 x i8] c"Ti,V_evolvingprop\00",
// CHECK: [[booleanmetadata:@OBJC_PROP_NAME_ATTR[^ ]+]] = private unnamed_addr constant [34 x i8] c"Ti,N,GisBooleanProp,V_booleanProp\00"
// CHECK: [[weakmetadata:@OBJC_PROP_NAME_ATTR[^ ]+]] = private unnamed_addr constant [23 x i8] c"T@\22Foo\22,W,N,V_weakProp\00"
// CHECK: @"\01l_OBJC_$_PROP_LIST_FooRO" = private global { i32, i32, [3 x %struct._prop_t] }{{.*}}[[evolvinggetter]]{{.*}}[[evolvingsetter]]{{.*}}[[booleanmetadata]]

View File

@ -38,21 +38,21 @@ typedef signed char BOOL;
}
@end
// CHECK: @{{.*}} = private constant [10 x i8] c"_boolean1
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean2
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean3
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean4
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean5
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean6
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean7
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean8
// CHECK-NEXT: @{{.*}} = private constant [10 x i8] c"_boolean9
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object1
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object2
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object3
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object4
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object5
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object6
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object7
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object8
// CHECK-NEXT: @{{.*}} = private constant [9 x i8] c"_object9
// CHECK: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean1
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean2
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean3
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean4
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean5
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean6
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean7
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean8
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [10 x i8] c"_boolean9
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object1
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object2
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object3
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object4
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object5
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object6
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object7
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object8
// CHECK-NEXT: @{{.*}} = private unnamed_addr constant [9 x i8] c"_object9

View File

@ -213,7 +213,7 @@ public:
dynamic_class dynamic_class_ivar;
}
@end
// CHECK: private constant [41 x i8] c"{dynamic_class=\22_vptr$dynamic_class\22^^?}\00"
// CHECK: private unnamed_addr constant [41 x i8] c"{dynamic_class=\22_vptr$dynamic_class\22^^?}\00"
namespace PR17142 {
struct A { virtual ~A(); };

View File

@ -6,8 +6,8 @@ fp f() { auto x = []{ return 3; }; return x; }
// ARC: %[[LAMBDACLASS:.*]] = type { i32 }
// MRC: @OBJC_METH_VAR_NAME{{.*}} = private constant [5 x i8] c"copy\00"
// MRC: @OBJC_METH_VAR_NAME{{.*}} = private constant [12 x i8] c"autorelease\00"
// MRC: @OBJC_METH_VAR_NAME{{.*}} = private unnamed_addr constant [5 x i8] c"copy\00"
// MRC: @OBJC_METH_VAR_NAME{{.*}} = private unnamed_addr constant [12 x i8] c"autorelease\00"
// MRC-LABEL: define i32 ()* @_Z1fv(
// MRC-LABEL: define internal i32 ()* @"_ZZ1fvENK3$_0cvU13block_pointerFivEEv"
// MRC: store i8* bitcast (i8** @_NSConcreteStackBlock to i8*)