diff options
Diffstat (limited to 'test/CodeGenObjCXX')
28 files changed, 250 insertions, 141 deletions
diff --git a/test/CodeGenObjCXX/arc-blocks.mm b/test/CodeGenObjCXX/arc-blocks.mm index 2695b4d..50579d7 100644 --- a/test/CodeGenObjCXX/arc-blocks.mm +++ b/test/CodeGenObjCXX/arc-blocks.mm @@ -18,15 +18,15 @@ namespace test0 { } // CHECK-LABEL: define void @_ZN5test03fooEv() // CHECK: [[V:%.*]] = alloca [[BYREF_A:%.*]], align 8 - // CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]]* [[V]], i32 0, i32 4 + // CHECK: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[V]], i32 0, i32 4 // CHECK-NEXT: store i8* bitcast (void (i8*, i8*)* [[COPY_HELPER:@.*]] to i8*), i8** [[T0]] - // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]]* [[V]], i32 0, i32 5 + // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[V]], i32 0, i32 5 // CHECK-NEXT: store i8* bitcast (void (i8*)* [[DISPOSE_HELPER:@.*]] to i8*), i8** [[T0]] - // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]]* [[V]], i32 0, i32 6 - // CHECK-NEXT: store i8* getelementptr inbounds ([3 x i8]* [[LAYOUT0]], i32 0, i32 0), i8** [[T0]] - // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]]* [[V]], i32 0, i32 7 + // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[V]], i32 0, i32 6 + // CHECK-NEXT: store i8* getelementptr inbounds ([3 x i8], [3 x i8]* [[LAYOUT0]], i32 0, i32 0), i8** [[T0]] + // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[V]], i32 0, i32 7 // CHECK-NEXT: call void @_ZN5test01AC1Ev([[A]]* [[T0]]) - // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]]* [[V]], i32 0, i32 7 + // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[V]], i32 0, i32 7 // CHECK-NEXT: [[T1:%.*]] = bitcast [[BYREF_A]]* [[V]] to i8* // CHECK-NEXT: call void @_Block_object_dispose(i8* [[T1]], i32 8) // CHECK-NEXT: call void @_ZN5test01AD1Ev([[A]]* [[T0]]) @@ -34,16 +34,16 @@ namespace test0 { // CHECK: define internal void [[COPY_HELPER]]( // CHECK: [[T0:%.*]] = bitcast i8* {{.*}} to [[BYREF_A]]* - // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_A]]* [[T0]], i32 0, i32 7 + // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[T0]], i32 0, i32 7 // CHECK-NEXT: load // CHECK-NEXT: [[T2:%.*]] = bitcast i8* {{.*}} to [[BYREF_A]]* - // CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [[BYREF_A]]* [[T2]], i32 0, i32 7 + // CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[T2]], i32 0, i32 7 // CHECK-NEXT: call void @_ZN5test01AC1ERKS0_([[A]]* [[T1]], [[A]]* dereferenceable({{[0-9]+}}) [[T3]]) // CHECK-NEXT: ret void // CHECK: define internal void [[DISPOSE_HELPER]]( // CHECK: [[T0:%.*]] = bitcast i8* {{.*}} to [[BYREF_A]]* - // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_A]]* [[T0]], i32 0, i32 7 + // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[BYREF_A]], [[BYREF_A]]* [[T0]], i32 0, i32 7 // CHECK-NEXT: call void @_ZN5test01AD1Ev([[A]]* [[T1]]) // CHECK-NEXT: ret void } diff --git a/test/CodeGenObjCXX/arc-cxx11-member-init.mm b/test/CodeGenObjCXX/arc-cxx11-member-init.mm index 5129f9fa..89683ba 100644 --- a/test/CodeGenObjCXX/arc-cxx11-member-init.mm +++ b/test/CodeGenObjCXX/arc-cxx11-member-init.mm @@ -22,9 +22,9 @@ class XClipboardDataSet } @end -// CHECK: [[mClipData:%.*]] = getelementptr inbounds %class.XClipboardDataSet* -// CHECK: [[ZERO:%.*]] = load %struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" -// CHECK: [[ONE:%.*]] = load i8** @OBJC_SELECTOR_REFERENCES_ +// CHECK: [[mClipData:%.*]] = getelementptr inbounds %class.XClipboardDataSet, %class.XClipboardDataSet* +// CHECK: [[ZERO:%.*]] = load %struct._class_t*, %struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" +// CHECK: [[ONE:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_ // CHECK: [[TWO:%.*]] = bitcast %struct._class_t* [[ZERO]] to i8* // CHECK: [[CALL:%.*]] = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* [[TWO]], i8* [[ONE]]) // CHECK: [[THREE:%.*]] = bitcast i8* [[CALL]] to [[T:%.*]]* diff --git a/test/CodeGenObjCXX/arc-exceptions.mm b/test/CodeGenObjCXX/arc-exceptions.mm index 0bb11d5..cc2206d 100644 --- a/test/CodeGenObjCXX/arc-exceptions.mm +++ b/test/CodeGenObjCXX/arc-exceptions.mm @@ -94,12 +94,12 @@ namespace test4 { throw 0; } // CHECK-LABEL: define void @_ZN5test41AC2Ev( - // CHECK: [[THIS:%.*]] = load [[A:%.*]]** {{%.*}} + // CHECK: [[THIS:%.*]] = load [[A:%.*]]*, [[A:%.*]]** {{%.*}} // Construct single. - // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[A]]* [[THIS]], i32 0, i32 0 + // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0 // CHECK-NEXT: store i8* null, i8** [[SINGLE]], align 8 // Construct array. - // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[A]]* [[THIS]], i32 0, i32 1 + // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 1 // CHECK-NEXT: [[T0:%.*]] = bitcast [2 x [3 x i8*]]* [[ARRAY]] to i8* // CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[T0]], i8 0, i64 48, i32 8, i1 false) // throw 0; @@ -107,11 +107,11 @@ namespace test4 { // Landing pad from throw site: // CHECK: landingpad // - First, destroy all of array. - // CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x i8*]]* [[ARRAY]], i32 0, i32 0, i32 0 - // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds i8** [[ARRAYBEGIN]], i64 6 + // CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x i8*]], [2 x [3 x i8*]]* [[ARRAY]], i32 0, i32 0, i32 0 + // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds i8*, i8** [[ARRAYBEGIN]], i64 6 // CHECK-NEXT: br label // CHECK: [[AFTER:%.*]] = phi i8** [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ] - // CHECK-NEXT: [[ELT]] = getelementptr inbounds i8** [[AFTER]], i64 -1 + // CHECK-NEXT: [[ELT]] = getelementptr inbounds i8*, i8** [[AFTER]], i64 -1 // CHECK-NEXT: call void @objc_storeStrong(i8** [[ELT]], i8* null) [[NUW]] // CHECK-NEXT: [[DONE:%.*]] = icmp eq i8** [[ELT]], [[ARRAYBEGIN]] // CHECK-NEXT: br i1 [[DONE]], diff --git a/test/CodeGenObjCXX/arc-globals.mm b/test/CodeGenObjCXX/arc-globals.mm index 8ba3fb8..c8be8c0 100644 --- a/test/CodeGenObjCXX/arc-globals.mm +++ b/test/CodeGenObjCXX/arc-globals.mm @@ -22,6 +22,6 @@ id global_obj2 = getObject(); // CHECK-LABEL: define internal void @_GLOBAL__sub_I_arc_globals.mm // CHECK: call i8* @objc_autoreleasePoolPush() // CHECK-NEXT: call void @__cxx_global_var_init -// CHECK-NEXT: call void @__cxx_global_var_init1 +// CHECK-NEXT: call void @__cxx_global_var_init.1 // CHECK-NEXT: call void @objc_autoreleasePoolPop( // CHECK-NEXT: ret void diff --git a/test/CodeGenObjCXX/arc-move.mm b/test/CodeGenObjCXX/arc-move.mm index d7b9f55..76fb15b 100644 --- a/test/CodeGenObjCXX/arc-move.mm +++ b/test/CodeGenObjCXX/arc-move.mm @@ -2,9 +2,9 @@ // define void @_Z11simple_moveRU8__strongP11objc_objectS2_ void simple_move(__strong id &x, __strong id &y) { - // CHECK: = load i8** + // CHECK: = load i8*, i8** // CHECK: store i8* null - // CHECK: = load i8** + // CHECK: = load i8*, i8** // CHECK: store i8* // CHECK-NEXT: call void @objc_release x = static_cast<__strong id&&>(y); @@ -34,10 +34,10 @@ typename remove_reference<T>::type&& move(T &&x) { // CHECK-LABEL: define void @_Z12library_moveRU8__strongP11objc_objectS2_ void library_move(__strong id &x, __strong id &y) { // CHECK: call dereferenceable({{[0-9]+}}) i8** @_Z4moveIRU8__strongP11objc_objectEON16remove_referenceIT_E4typeEOS5_ - // CHECK: load i8** + // CHECK: load i8*, i8** // CHECK: store i8* null, i8** - // CHECK: load i8*** - // CHECK-NEXT: load i8** + // CHECK: load i8**, i8*** + // CHECK-NEXT: load i8*, i8** // CHECK-NEXT: store i8* // CHECK-NEXT: call void @objc_release // CHECK-NEXT: ret void @@ -46,19 +46,29 @@ void library_move(__strong id &x, __strong id &y) { // CHECK-LABEL: define void @_Z12library_moveRU8__strongP11objc_object void library_move(__strong id &y) { + // CHECK: [[X:%.*]] = alloca i8*, align 8 + // CHECK: [[I:%.*]] = alloca i32, align 4 + // CHECK: [[XPTR1:%.*]] = bitcast i8** [[X]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[XPTR1]]) // CHECK: [[Y:%[a-zA-Z0-9]+]] = call dereferenceable({{[0-9]+}}) i8** @_Z4moveIRU8__strongP11objc_objectEON16remove_referenceIT_E4typeEOS5_ // Load the object - // CHECK-NEXT: [[OBJ:%[a-zA-Z0-9]+]] = load i8** [[Y]] + // CHECK-NEXT: [[OBJ:%[a-zA-Z0-9]+]] = load i8*, i8** [[Y]] // Null out y // CHECK-NEXT: store i8* null, i8** [[Y]] // Initialize x with the object // CHECK-NEXT: store i8* [[OBJ]], i8** [[X:%[a-zA-Z0-9]+]] id x = move(y); + // CHECK-NEXT: [[IPTR1:%.*]] = bitcast i32* [[I]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.start(i64 4, i8* [[IPTR1]]) // CHECK-NEXT: store i32 17 int i = 17; - // CHECK-NEXT: [[OBJ:%[a-zA-Z0-9]+]] = load i8** [[X]] + // CHECK-NEXT: [[IPTR2:%.*]] = bitcast i32* [[I]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.end(i64 4, i8* [[IPTR2]]) + // CHECK-NEXT: [[OBJ:%[a-zA-Z0-9]+]] = load i8*, i8** [[X]] // CHECK-NEXT: call void @objc_release(i8* [[OBJ]]) + // CHECK-NEXT: [[XPTR2:%.*]] = bitcast i8** [[X]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[XPTR2]]) // CHECK-NEXT: ret void } @@ -66,10 +76,10 @@ void library_move(__strong id &y) { void const_move(const __strong id &x) { // CHECK: [[Y:%.*]] = alloca i8*, // CHECK: [[X:%.*]] = call dereferenceable({{[0-9]+}}) i8** @_Z4moveIRKU8__strongP11objc_objectEON16remove_referenceIT_E4typeEOS5_( - // CHECK-NEXT: [[T0:%.*]] = load i8** [[X]] + // CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[X]] // CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]]) // CHECK-NEXT: store i8* [[T1]], i8** [[Y]] - // CHECK-NEXT: [[T0:%.*]] = load i8** [[Y]] + // CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[Y]] // CHECK-NEXT: call void @objc_release(i8* [[T0]]) id y = move(x); } diff --git a/test/CodeGenObjCXX/arc-new-delete.mm b/test/CodeGenObjCXX/arc-new-delete.mm index 9d42b03..9a61f18 100644 --- a/test/CodeGenObjCXX/arc-new-delete.mm +++ b/test/CodeGenObjCXX/arc-new-delete.mm @@ -57,7 +57,7 @@ void test_array_new() { // CHECK-LABEL: define void @_Z11test_deletePU8__strongP11objc_objectPU6__weakS0_ void test_delete(__strong id *sptr, __weak id *wptr) { // CHECK: br i1 - // CHECK: load i8** + // CHECK: load i8*, i8** // CHECK-NEXT: call void @objc_release // CHECK: call void @_ZdlPv delete sptr; @@ -72,22 +72,22 @@ void test_delete(__strong id *sptr, __weak id *wptr) { // CHECK-LABEL: define void @_Z17test_array_deletePU8__strongP11objc_objectPU6__weakS0_ void test_array_delete(__strong id *sptr, __weak id *wptr) { // CHECK: icmp eq i8** [[BEGIN:%.*]], null - // CHECK: [[LEN:%.*]] = load i64* {{%.*}} - // CHECK: [[END:%.*]] = getelementptr inbounds i8** [[BEGIN]], i64 [[LEN]] + // CHECK: [[LEN:%.*]] = load i64, i64* {{%.*}} + // CHECK: [[END:%.*]] = getelementptr inbounds i8*, i8** [[BEGIN]], i64 [[LEN]] // CHECK-NEXT: icmp eq i8** [[BEGIN]], [[END]] // CHECK: [[PAST:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], - // CHECK-NEXT: [[CUR]] = getelementptr inbounds i8** [[PAST]], i64 -1 + // CHECK-NEXT: [[CUR]] = getelementptr inbounds i8*, i8** [[PAST]], i64 -1 // CHECK-NEXT: call void @objc_storeStrong(i8** [[CUR]], i8* null) // CHECK-NEXT: icmp eq i8** [[CUR]], [[BEGIN]] // CHECK: call void @_ZdaPv delete [] sptr; // CHECK: icmp eq i8** [[BEGIN:%.*]], null - // CHECK: [[LEN:%.*]] = load i64* {{%.*}} - // CHECK: [[END:%.*]] = getelementptr inbounds i8** [[BEGIN]], i64 [[LEN]] + // CHECK: [[LEN:%.*]] = load i64, i64* {{%.*}} + // CHECK: [[END:%.*]] = getelementptr inbounds i8*, i8** [[BEGIN]], i64 [[LEN]] // CHECK-NEXT: icmp eq i8** [[BEGIN]], [[END]] // CHECK: [[PAST:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], - // CHECK-NEXT: [[CUR]] = getelementptr inbounds i8** [[PAST]], i64 -1 + // CHECK-NEXT: [[CUR]] = getelementptr inbounds i8*, i8** [[PAST]], i64 -1 // CHECK-NEXT: call void @objc_destroyWeak(i8** [[CUR]]) // CHECK-NEXT: icmp eq i8** [[CUR]], [[BEGIN]] // CHECK: call void @_ZdaPv diff --git a/test/CodeGenObjCXX/arc-pseudo-destructors.mm b/test/CodeGenObjCXX/arc-pseudo-destructors.mm index 0a69487..b79d9a3 100644 --- a/test/CodeGenObjCXX/arc-pseudo-destructors.mm +++ b/test/CodeGenObjCXX/arc-pseudo-destructors.mm @@ -2,16 +2,16 @@ // CHECK-LABEL: define void @_Z28test_objc_object_pseudo_dtorPU8__strongP11objc_objectPU6__weakS0_ void test_objc_object_pseudo_dtor(__strong id *ptr, __weak id *wptr) { - // CHECK: load i8*** - // CHECK-NEXT: load i8** + // CHECK: load i8**, i8*** + // CHECK-NEXT: load i8*, i8** // CHECK-NEXT: call void @objc_release ptr->~id(); // CHECK: call void @objc_destroyWeak(i8** {{%.*}}) wptr->~id(); - // CHECK: load i8*** - // CHECK-NEXT: load i8** + // CHECK: load i8**, i8*** + // CHECK-NEXT: load i8*, i8** // CHECK-NEXT: call void @objc_release (*ptr).~id(); diff --git a/test/CodeGenObjCXX/arc-references.mm b/test/CodeGenObjCXX/arc-references.mm index 0acb6d5..8397abe 100644 --- a/test/CodeGenObjCXX/arc-references.mm +++ b/test/CodeGenObjCXX/arc-references.mm @@ -38,11 +38,14 @@ typedef __strong id strong_id; //CHECK: define void @_Z5test3v void test3() { + // CHECK: [[REF:%.*]] = alloca i8**, align 8 // CHECK: call i8* @objc_initWeak // CHECK-NEXT: store i8** const __weak id &ref = strong_id(); // CHECK-NEXT: call void @_Z6calleev() callee(); + // CHECK-NEXT: [[PTR:%.*]] = bitcast i8*** [[REF]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[PTR]]) // CHECK-NEXT: call void @objc_destroyWeak // CHECK-NEXT: ret void } @@ -62,16 +65,21 @@ void sink(__strong A* &&); // CHECK-LABEL: define void @_Z5test5RU8__strongP11objc_object void test5(__strong id &x) { // CHECK: [[REFTMP:%.*]] = alloca {{%.*}}*, align 8 + // CHECK: [[I:%.*]] = alloca i32, align 4 // CHECK: [[OBJ_ID:%.*]] = call i8* @objc_retain( // CHECK-NEXT: [[OBJ_A:%.*]] = bitcast i8* [[OBJ_ID]] to [[A:%[a-zA-Z0-9]+]]* // CHECK-NEXT: store [[A]]* [[OBJ_A]], [[A]]** [[REFTMP:%[a-zA-Z0-9]+]] // CHECK-NEXT: call void @_Z4sinkOU8__strongP1A sink(x); - // CHECK-NEXT: [[OBJ_A:%[a-zA-Z0-9]+]] = load [[A]]** [[REFTMP]] + // CHECK-NEXT: [[OBJ_A:%[a-zA-Z0-9]+]] = load [[A]]*, [[A]]** [[REFTMP]] // CHECK-NEXT: [[OBJ_ID:%[a-zA-Z0-9]+]] = bitcast [[A]]* [[OBJ_A]] to i8* // CHECK-NEXT: call void @objc_release + // CHECK-NEXT: [[IPTR1:%.*]] = bitcast i32* [[I]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.start(i64 4, i8* [[IPTR1]]) // CHECK-NEXT: store i32 17, i32 int i = 17; + // CHECK-NEXT: [[IPTR2:%.*]] = bitcast i32* [[I]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.end(i64 4, i8* [[IPTR2]]) // CHECK-NEXT: ret void } diff --git a/test/CodeGenObjCXX/arc-special-member-functions.mm b/test/CodeGenObjCXX/arc-special-member-functions.mm index 8b002d5..df3c229 100644 --- a/test/CodeGenObjCXX/arc-special-member-functions.mm +++ b/test/CodeGenObjCXX/arc-special-member-functions.mm @@ -92,73 +92,73 @@ void test_ObjCBlockMember_copy_assign(ObjCBlockMember m1, ObjCBlockMember m2) { // Implicitly-generated copy assignment operator for ObjCBlockMember // CHECK: define linkonce_odr dereferenceable({{[0-9]+}}) {{%.*}}* @_ZN15ObjCBlockMemberaSERKS_( -// CHECK: [[T0:%.*]] = getelementptr inbounds [[T:%.*]]* {{%.*}}, i32 0, i32 0 -// CHECK-NEXT: [[T1:%.*]] = load i32 (i32)** [[T0]], align 8 +// CHECK: [[T0:%.*]] = getelementptr inbounds [[T:%.*]], [[T:%.*]]* {{%.*}}, i32 0, i32 0 +// CHECK-NEXT: [[T1:%.*]] = load i32 (i32)*, i32 (i32)** [[T0]], align 8 // CHECK-NEXT: [[T2:%.*]] = bitcast i32 (i32)* [[T1]] to i8* // CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retainBlock(i8* [[T2]]) // CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i32 (i32)* -// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [[T]]* {{%.*}}, i32 0, i32 0 -// CHECK-NEXT: [[T6:%.*]] = load i32 (i32)** [[T5]], align 8 +// CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [[T]], [[T]]* {{%.*}}, i32 0, i32 0 +// CHECK-NEXT: [[T6:%.*]] = load i32 (i32)*, i32 (i32)** [[T5]], align 8 // CHECK-NEXT: store i32 (i32)* [[T4]], i32 (i32)** [[T5]] // CHECK-NEXT: [[T7:%.*]] = bitcast i32 (i32)* [[T6]] to i8* // CHECK-NEXT: call void @objc_release(i8* [[T7]]) // CHECK-NEXT: ret -// Implicitly-generated copy constructor for ObjCBlockMember -// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCBlockMemberC2ERKS_ -// CHECK: call i8* @objc_retainBlock -// CHECK: ret - -// Implicitly-generated destructor for ObjCBlockMember -// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCBlockMemberD2Ev -// CHECK: call void @objc_storeStrong(i8* -// CHECK: ret - -// Implicitly-generated default constructor for ObjCBlockMember -// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCBlockMemberC2Ev -// CHECK: store {{.*}} null, +// Implicitly-generated default constructor for ObjCMember +// CHECK-LABEL: define linkonce_odr void @_ZN10ObjCMemberC2Ev +// CHECK-NOT: objc_release +// CHECK: store i8* null // CHECK-NEXT: ret void -// Implicitly-generated copy constructor for ObjCArrayMember -// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCArrayMemberC2ERKS_ -// CHECK: br i1 +// Implicitly-generated destructor for ObjCMember +// CHECK-LABEL: define linkonce_odr void @_ZN10ObjCMemberD2Ev +// CHECK: call void @objc_storeStrong +// CHECK: ret void + +// Implicitly-generated copy constructor for ObjCMember +// CHECK-LABEL: define linkonce_odr void @_ZN10ObjCMemberC2ERKS_ +// CHECK-NOT: objc_release // CHECK: call i8* @objc_retain // CHECK-NEXT: store i8* -// CHECK-NEXT: br label +// CHECK-NEXT: ret void + +// Implicitly-generated default constructor for ObjCArrayMember +// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCArrayMemberC2Ev +// CHECK: call void @llvm.memset.p0i8.i64 // CHECK: ret // Implicitly-generated destructor for ObjCArrayMember // CHECK-LABEL: define linkonce_odr void @_ZN15ObjCArrayMemberD2Ev -// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [2 x [3 x i8*]]* -// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8** [[BEGIN]], i64 6 +// CHECK: [[BEGIN:%.*]] = getelementptr inbounds [2 x [3 x i8*]], [2 x [3 x i8*]]* +// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8*, i8** [[BEGIN]], i64 6 // CHECK-NEXT: br label // CHECK: [[PAST:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ] -// CHECK-NEXT: [[CUR]] = getelementptr inbounds i8** [[PAST]], i64 -1 +// CHECK-NEXT: [[CUR]] = getelementptr inbounds i8*, i8** [[PAST]], i64 -1 // CHECK-NEXT: call void @objc_storeStrong(i8** [[CUR]], i8* null) // CHECK-NEXT: [[T1:%.*]] = icmp eq i8** [[CUR]], [[BEGIN]] -// CHECK-NEXT: br i1 [[T1]], +// CHECK-NEXT: br i1 [[T1]], // CHECK: ret void -// Implicitly-generated default constructor for ObjCArrayMember -// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCArrayMemberC2Ev -// CHECK: call void @llvm.memset.p0i8.i64 -// CHECK: ret - -// Implicitly-generated copy constructor for ObjCMember -// CHECK-LABEL: define linkonce_odr void @_ZN10ObjCMemberC2ERKS_ -// CHECK-NOT: objc_release +// Implicitly-generated copy constructor for ObjCArrayMember +// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCArrayMemberC2ERKS_ +// CHECK: br i1 // CHECK: call i8* @objc_retain // CHECK-NEXT: store i8* +// CHECK-NEXT: br label +// CHECK: ret + +// Implicitly-generated default constructor for ObjCBlockMember +// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCBlockMemberC2Ev +// CHECK: store {{.*}} null, // CHECK-NEXT: ret void -// Implicitly-generated destructor for ObjCMember -// CHECK-LABEL: define linkonce_odr void @_ZN10ObjCMemberD2Ev -// CHECK: call void @objc_storeStrong -// CHECK: ret void +// Implicitly-generated destructor for ObjCBlockMember +// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCBlockMemberD2Ev +// CHECK: call void @objc_storeStrong(i8* +// CHECK: ret -// Implicitly-generated default constructor for ObjCMember -// CHECK-LABEL: define linkonce_odr void @_ZN10ObjCMemberC2Ev -// CHECK-NOT: objc_release -// CHECK: store i8* null -// CHECK-NEXT: ret void +// Implicitly-generated copy constructor for ObjCBlockMember +// CHECK-LABEL: define linkonce_odr void @_ZN15ObjCBlockMemberC2ERKS_ +// CHECK: call i8* @objc_retainBlock +// CHECK: ret diff --git a/test/CodeGenObjCXX/arc.mm b/test/CodeGenObjCXX/arc.mm index 6b42a4c..4ce59df 100644 --- a/test/CodeGenObjCXX/arc.mm +++ b/test/CodeGenObjCXX/arc.mm @@ -21,7 +21,7 @@ void test0(__weak id *wp, __weak volatile id *wvp) { // CHECK: [[T0:%.*]] = call i8* @_Z12test0_helperv() // CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]]) - // CHECK-NEXT: [[T2:%.*]] = load i8*** {{%.*}}, align 8 + // CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** {{%.*}}, align 8 // CHECK-NEXT: [[T3:%.*]] = call i8* @objc_storeWeak(i8** [[T2]], i8* [[T1]]) // CHECK-NEXT: [[T4:%.*]] = call i8* @objc_retain(i8* [[T3]]) // CHECK-NEXT: store i8* [[T4]], i8** @@ -30,7 +30,7 @@ void test0(__weak id *wp, __weak volatile id *wvp) { // CHECK: [[T0:%.*]] = call i8* @_Z12test0_helperv() // CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]]) - // CHECK-NEXT: [[T2:%.*]] = load i8*** {{%.*}}, align 8 + // CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** {{%.*}}, align 8 // CHECK-NEXT: [[T3:%.*]] = call i8* @objc_storeWeak(i8** [[T2]], i8* [[T1]]) // CHECK-NEXT: [[T4:%.*]] = call i8* @objc_loadWeakRetained(i8** [[T2]]) // CHECK-NEXT: store i8* [[T4]], i8** @@ -64,31 +64,35 @@ void test34(int cond) { // CHECK-NEXT: [[CONDCLEANUPSAVE:%.*]] = alloca i8* // CHECK-NEXT: [[CONDCLEANUP:%.*]] = alloca i1 // CHECK-NEXT: store i32 + // CHECK-NEXT: [[STRONGP:%.*]] = bitcast i8** [[STRONG]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[STRONGP]]) // CHECK-NEXT: store i8* null, i8** [[STRONG]] + // CHECK-NEXT: [[WEAKP:%.*]] = bitcast i8** [[WEAK]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[WEAKP]]) // CHECK-NEXT: call i8* @objc_initWeak(i8** [[WEAK]], i8* null) - // CHECK-NEXT: [[T0:%.*]] = load i32* [[COND]] + // CHECK-NEXT: [[T0:%.*]] = load i32, i32* [[COND]] // CHECK-NEXT: [[T1:%.*]] = icmp ne i32 [[T0]], 0 // CHECK: [[ARG:%.*]] = phi i8** // CHECK-NEXT: [[T0:%.*]] = icmp eq i8** [[ARG]], null // CHECK-NEXT: [[T1:%.*]] = select i1 [[T0]], i8** null, i8** [[TEMP1]] // CHECK-NEXT: br i1 [[T0]], - // CHECK: [[T0:%.*]] = load i8** [[ARG]] + // CHECK: [[T0:%.*]] = load i8*, i8** [[ARG]] // CHECK-NEXT: store i8* [[T0]], i8** [[TEMP1]] // CHECK-NEXT: br label // CHECK: [[W0:%.*]] = phi i8* [ [[T0]], {{%.*}} ], [ undef, {{%.*}} ] // CHECK: call void @_Z11test34_sinkPU15__autoreleasingP11objc_object(i8** [[T1]]) // CHECK-NEXT: [[T0:%.*]] = icmp eq i8** [[ARG]], null // CHECK-NEXT: br i1 [[T0]], - // CHECK: [[T0:%.*]] = load i8** [[TEMP1]] + // CHECK: [[T0:%.*]] = load i8*, i8** [[TEMP1]] // CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]]) - // CHECK-NEXT: call void (...)* @clang.arc.use(i8* [[W0]]) - // CHECK-NEXT: [[T2:%.*]] = load i8** [[ARG]] + // CHECK-NEXT: call void (...) @clang.arc.use(i8* [[W0]]) + // CHECK-NEXT: [[T2:%.*]] = load i8*, i8** [[ARG]] // CHECK-NEXT: store i8* [[T1]], i8** [[ARG]] // CHECK-NEXT: call void @objc_release(i8* [[T2]]) // CHECK-NEXT: br label - // CHECK: [[T0:%.*]] = load i32* [[COND]] + // CHECK: [[T0:%.*]] = load i32, i32* [[COND]] // CHECK-NEXT: [[T1:%.*]] = icmp ne i32 [[T0]], 0 // CHECK: [[ARG:%.*]] = phi i8** // CHECK-NEXT: [[T0:%.*]] = icmp eq i8** [[ARG]], null @@ -103,7 +107,7 @@ void test34(int cond) { // CHECK: call void @_Z11test34_sinkPU15__autoreleasingP11objc_object(i8** [[T1]]) // CHECK-NEXT: [[T0:%.*]] = icmp eq i8** [[ARG]], null // CHECK-NEXT: br i1 [[T0]], - // CHECK: [[T0:%.*]] = load i8** [[TEMP2]] + // CHECK: [[T0:%.*]] = load i8*, i8** [[TEMP2]] // CHECK-NEXT: call i8* @objc_storeWeak(i8** [[ARG]], i8* [[T0]]) // CHECK-NEXT: br label @@ -120,56 +124,77 @@ struct Test35_Helper { // CHECK-LABEL: define void @_Z6test3513Test35_HelperPS_ void test35(Test35_Helper x0, Test35_Helper *x0p) { + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* @_ZN13Test35_Helper11makeObject1Ev // CHECK-NOT: call i8* @objc_retain id obj1 = Test35_Helper::makeObject1(); + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* @_ZN13Test35_Helper11makeObject2Ev // CHECK-NOT: call i8* @objc_retain id obj2 = x0.makeObject2(); + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* @_ZN13Test35_Helper11makeObject2Ev // CHECK-NOT: call i8* @objc_retain id obj3 = x0p->makeObject2(); id (Test35_Helper::*pmf)() __attribute__((ns_returns_retained)) = &Test35_Helper::makeObject2; + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* % // CHECK-NOT: call i8* @objc_retain id obj4 = (x0.*pmf)(); + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* % // CHECK-NOT: call i8* @objc_retain id obj5 = (x0p->*pmf)(); // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK-NEXT: ret void } // CHECK-LABEL: define void @_Z7test35b13Test35_HelperPS_ void test35b(Test35_Helper x0, Test35_Helper *x0p) { + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* @_ZN13Test35_Helper11makeObject3Ev // CHECK: call i8* @objc_retain id obj1 = Test35_Helper::makeObject3(); + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* @_ZN13Test35_Helper11makeObject4Ev // CHECK: call i8* @objc_retain id obj2 = x0.makeObject4(); + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* @_ZN13Test35_Helper11makeObject4Ev // CHECK: call i8* @objc_retain id obj3 = x0p->makeObject4(); id (Test35_Helper::*pmf)() = &Test35_Helper::makeObject4; + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* % // CHECK: call i8* @objc_retain id obj4 = (x0.*pmf)(); + // CHECK: call void @llvm.lifetime.start // CHECK: call i8* % // CHECK: call i8* @objc_retain id obj5 = (x0p->*pmf)(); // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK: call void @objc_release + // CHECK: call void @llvm.lifetime.end // CHECK-NEXT: ret void } @@ -203,7 +228,7 @@ template void test37<Test37>(Test37 *a); // CHECK-NEXT: [[COLL:%.*]] = bitcast i8* [[T2]] to [[NSARRAY]]* // Make sure it's not immediately released before starting the iteration. -// CHECK-NEXT: load i8** @OBJC_SELECTOR_REFERENCES_ +// CHECK-NEXT: load i8*, i8** @OBJC_SELECTOR_REFERENCES_ // CHECK-NEXT: [[T0:%.*]] = bitcast [[NSARRAY]]* [[COLL]] to i8* // CHECK-NEXT: @objc_msgSend @@ -290,10 +315,12 @@ template void test40_helper<int>(); // CHECK-LABEL: define weak_odr void @_Z13test40_helperIiEvv() // CHECK: [[X:%.*]] = alloca i8* // CHECK-NEXT: [[TEMP:%.*]] = alloca i8* +// CHECK-NEXT: [[XP:%.*]] = bitcast i8** [[X]] to i8* +// CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[XP]]) // CHECK-NEXT: store i8* null, i8** [[X]] -// CHECK: [[T0:%.*]] = load i8** [[X]] +// CHECK: [[T0:%.*]] = load i8*, i8** [[X]] // CHECK-NEXT: store i8* [[T0]], i8** [[TEMP]] // CHECK: @objc_msgSend -// CHECK-NEXT: [[T0:%.*]] = load i8** [[TEMP]] +// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[TEMP]] // CHECK-NEXT: call i8* @objc_retain(i8* [[T0]]) diff --git a/test/CodeGenObjCXX/debug-info-cyclic.mm b/test/CodeGenObjCXX/debug-info-cyclic.mm new file mode 100644 index 0000000..8983fe5 --- /dev/null +++ b/test/CodeGenObjCXX/debug-info-cyclic.mm @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin -g -emit-llvm %s -o - | FileCheck %s + +struct B { +// CHECK: ![[B:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "B" +// CHECK-SAME: line: [[@LINE-2]], +// CHECK-SAME: size: 8, align: 8, +// CHECK-NOT: offset: +// CHECK-NOT: DIFlagFwdDecl +// CHECK-SAME: elements: ![[BMEMBERS:[0-9]+]] +// CHECK: ![[BMEMBERS]] = !{![[BB:[0-9]+]]} + B(struct A *); +// CHECK: ![[BB]] = !DISubprogram(name: "B", scope: ![[B]] +// CHECK-SAME: line: [[@LINE-2]], +// CHECK-SAME: type: ![[TY:[0-9]+]], +// CHECK: ![[TY]] = !DISubroutineType(types: ![[ARGS:[0-9]+]]) +// CHECK: ![[ARGS]] = !{null, ![[THIS:[0-9]+]], !{{[^,]+}}} +// CHECK: ![[THIS]] = !DIDerivedType(tag: DW_TAG_pointer_type, +// CHECK-SAME: baseType: ![[B]] +}; + +struct C { + B b; + C(struct A *); + virtual ~C(); +}; + +C::C(struct A *a) + : b(a) { +} diff --git a/test/CodeGenObjCXX/debug-info-line.mm b/test/CodeGenObjCXX/debug-info-line.mm index 4c934f1..a7d6a15 100644 --- a/test/CodeGenObjCXX/debug-info-line.mm +++ b/test/CodeGenObjCXX/debug-info-line.mm @@ -26,5 +26,5 @@ void f1() { } @end -// CHECK: [[DBG_F1]] = !MDLocation(line: 100, -// CHECK: [[DBG_TNSO]] = !MDLocation(line: 200, +// CHECK: [[DBG_F1]] = !DILocation(line: 100, +// CHECK: [[DBG_TNSO]] = !DILocation(line: 200, diff --git a/test/CodeGenObjCXX/destroy.mm b/test/CodeGenObjCXX/destroy.mm index c53ac39..5d797d3 100644 --- a/test/CodeGenObjCXX/destroy.mm +++ b/test/CodeGenObjCXX/destroy.mm @@ -43,8 +43,8 @@ void test4() { // CHECK: call void @_ZN8tderivedIiEC1Ev // CHECK: call void @_ZN8tderivedIiED1Ev -// CHECK-LABEL: define linkonce_odr void @_ZN8tderivedIiED2Ev +// CHECK-LABEL: define linkonce_odr void @_ZN7derivedD2Ev // CHECK: call void @objc_storeStrong(i8** {{.*}}, i8* null) -// CHECK-LABEL: define linkonce_odr void @_ZN7derivedD2Ev +// CHECK-LABEL: define linkonce_odr void @_ZN8tderivedIiED2Ev // CHECK: call void @objc_storeStrong(i8** {{.*}}, i8* null) diff --git a/test/CodeGenObjCXX/exceptions-legacy.mm b/test/CodeGenObjCXX/exceptions-legacy.mm index 5de90bb..f6cd296 100644 --- a/test/CodeGenObjCXX/exceptions-legacy.mm +++ b/test/CodeGenObjCXX/exceptions-legacy.mm @@ -16,7 +16,7 @@ void test0(id obj) { // Enter the @synchronized block. // CHECK: call i32 @objc_sync_enter(i8* [[OBJ:%.*]]) // CHECK: call void @objc_exception_try_enter([[BUF_T:%.*]]* [[BUF:%.*]]) -// CHECK-NEXT: [[T0:%.*]] = getelementptr [[BUF_T]]* [[BUF]], i32 0, i32 0, i32 0 +// CHECK-NEXT: [[T0:%.*]] = getelementptr [[BUF_T]], [[BUF_T]]* [[BUF]], i32 0, i32 0, i32 0 // CHECK-NEXT: [[T1:%.*]] = call i32 @_setjmp(i32* [[T0]]) // CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0 // CHECK-NEXT: br i1 [[T2]], @@ -26,7 +26,7 @@ void test0(id obj) { // Leave the @synchronized. The reload of obj here is unnecessary. // CHECK: call void @objc_exception_try_exit([[BUF_T]]* [[BUF]]) -// CHECK-NEXT: [[T0:%.*]] = load i8** +// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** // CHECK-NEXT: call i32 @objc_sync_exit(i8* [[T0]]) // CHECK-NEXT: ret void @@ -34,12 +34,12 @@ void test0(id obj) { // CHECK: [[T0:%.*]] = landingpad // CHECK-NEXT: cleanup // CHECK-NEXT: call void @objc_exception_try_exit([[BUF_T]]* [[BUF]]) -// CHECK-NEXT: [[T0:%.*]] = load i8** +// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** // CHECK-NEXT: call i32 @objc_sync_exit(i8* [[T0]]) // CHECK-NEXT: resume // ObjC EH "cleanup". -// CHECK: [[T0:%.*]] = load i8** +// CHECK: [[T0:%.*]] = load i8*, i8** // CHECK-NEXT: call i32 @objc_sync_exit(i8* [[T0]]) // CHECK-NEXT: [[T0:%.*]] = call i8* @objc_exception_extract([[BUF_T]]* [[BUF]]) // CHECK-NEXT: call void @objc_exception_throw(i8* [[T0]]) @@ -55,7 +55,7 @@ void test1(id obj, bool *failed) { // CHECK-LABEL: define void @_Z5test1P11objc_objectPb( // Enter the @try block. // CHECK: call void @objc_exception_try_enter([[BUF_T]]* [[BUF:%.*]]) -// CHECK-NEXT: [[T0:%.*]] = getelementptr [[BUF_T]]* [[BUF]], i32 0, i32 0, i32 0 +// CHECK-NEXT: [[T0:%.*]] = getelementptr [[BUF_T]], [[BUF_T]]* [[BUF]], i32 0, i32 0, i32 0 // CHECK-NEXT: [[T1:%.*]] = call i32 @_setjmp(i32* [[T0]]) // CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0 // CHECK-NEXT: br i1 [[T2]], @@ -75,6 +75,6 @@ void test1(id obj, bool *failed) { // CHECK-NEXT: resume // Catch handler. Reload of 'failed' address is unnecessary. -// CHECK: [[T0:%.*]] = load i8** +// CHECK: [[T0:%.*]] = load i8*, i8** // CHECK-NEXT: store i8 1, i8* [[T0]], // CHECK-NEXT: br label diff --git a/test/CodeGenObjCXX/gc.mm b/test/CodeGenObjCXX/gc.mm index 1659dbf..2e2ad0f 100644 --- a/test/CodeGenObjCXX/gc.mm +++ b/test/CodeGenObjCXX/gc.mm @@ -12,9 +12,9 @@ namespace test0 { // CHECK-LABEL: define void @_ZN5test01AC2Ev( // CHECK: [[THIS:%.*]] = alloca [[TEST0:%.*]]*, align 8 // CHECK-NEXT: store -// CHECK-NEXT: [[T0:%.*]] = load [[TEST0]]** [[THIS]] -// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[TEST0]]* [[T0]], i32 0, i32 0 -// CHECK-NEXT: [[T2:%.*]] = load i8** @_ZN5test01xE +// CHECK-NEXT: [[T0:%.*]] = load [[TEST0]]*, [[TEST0]]** [[THIS]] +// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [[TEST0]], [[TEST0]]* [[T0]], i32 0, i32 0 +// CHECK-NEXT: [[T2:%.*]] = load i8*, i8** @_ZN5test01xE // CHECK-NEXT: call i8* @objc_assign_strongCast(i8* [[T2]], i8** [[T1]]) // CHECK-NEXT: ret void } diff --git a/test/CodeGenObjCXX/lambda-expressions.mm b/test/CodeGenObjCXX/lambda-expressions.mm index 9129ff0..0c309c0 100644 --- a/test/CodeGenObjCXX/lambda-expressions.mm +++ b/test/CodeGenObjCXX/lambda-expressions.mm @@ -10,8 +10,8 @@ fp f() { auto x = []{ return 3; }; return x; } // MRC-LABEL: define internal i32 ()* @"_ZZ1fvENK3$_0cvU13block_pointerFivEEv" // MRC: store i8* bitcast (i8** @_NSConcreteStackBlock to i8*) // MRC: store i8* bitcast (i32 (i8*)* @"___ZZ1fvENK3$_0cvU13block_pointerFivEEv_block_invoke" to i8*) -// MRC: call i32 ()* (i8*, i8*)* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 ()* (i8*, i8*)*) -// MRC: call i32 ()* (i8*, i8*)* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 ()* (i8*, i8*)*) +// MRC: call i32 ()* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 ()* (i8*, i8*)*) +// MRC: call i32 ()* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 ()* (i8*, i8*)*) // MRC: ret i32 ()* // ARC-LABEL: define i32 ()* @_Z1fv( @@ -60,10 +60,12 @@ void take_block(void (^block)()) { block(); } } @end +// ARC-LABEL: define linkonce_odr i32 ()* @_ZZNK13StaticMembersIfE1fMUlvE_clEvENKUlvE_cvU13block_pointerFivEEv + // Check lines for BlockInLambda test below // ARC-LABEL: define internal i32 @___ZZN13BlockInLambda1X1fEvENKUlvE_clEv_block_invoke -// ARC: [[Y:%.*]] = getelementptr inbounds %"struct.BlockInLambda::X"* {{.*}}, i32 0, i32 1 -// ARC-NEXT: [[YVAL:%.*]] = load i32* [[Y]], align 4 +// ARC: [[Y:%.*]] = getelementptr inbounds %"struct.BlockInLambda::X", %"struct.BlockInLambda::X"* {{.*}}, i32 0, i32 1 +// ARC-NEXT: [[YVAL:%.*]] = load i32, i32* [[Y]], align 4 // ARC-NEXT: ret i32 [[YVAL]] typedef int (^fptr)(); @@ -73,7 +75,6 @@ template<typename T> struct StaticMembers { template<typename T> fptr StaticMembers<T>::f = [] { auto f = []{return 5;}; return fptr(f); }(); template fptr StaticMembers<float>::f; -// ARC-LABEL: define linkonce_odr i32 ()* @_ZZNK13StaticMembersIfE1fMUlvE_clEvENKUlvE_cvU13block_pointerFivEEv namespace BlockInLambda { struct X { diff --git a/test/CodeGenObjCXX/literals.mm b/test/CodeGenObjCXX/literals.mm index f21bba7..7089de2 100644 --- a/test/CodeGenObjCXX/literals.mm +++ b/test/CodeGenObjCXX/literals.mm @@ -16,17 +16,20 @@ struct Y { // CHECK-LABEL: define void @_Z10test_arrayv void test_array() { + // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca i8* // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*] // Initializing first element - // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 0 + // CHECK: [[PTR1:%.*]] = bitcast i8** [[ARR]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[PTR1]]) + // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i32 0, i32 0 // CHECK-NEXT: call void @_ZN1XC1Ev // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT0]]) // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]] // Initializing the second element - // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 1 + // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i32 0, i32 1 // CHECK-NEXT: invoke void @_ZN1YC1Ev // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT1]]) @@ -47,6 +50,8 @@ void test_array() { // CHECK-NEXT: call void @_ZN1XD1Ev // CHECK-NOT: ret void // CHECK: call void @objc_release + // CHECK-NEXT: [[PTR2:%.*]] = bitcast i8** [[ARR]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[PTR2]]) // CHECK-NEXT: ret void // Check cleanups @@ -63,17 +68,20 @@ void test_array() { // CHECK-LABEL: define weak_odr void @_Z24test_array_instantiationIiEvv template<typename T> void test_array_instantiation() { + // CHECK: [[ARR:%[a-zA-Z0-9.]+]] = alloca i8* // CHECK: [[OBJECTS:%[a-zA-Z0-9.]+]] = alloca [2 x i8*] // Initializing first element - // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 0 + // CHECK: [[PTR1:%.*]] = bitcast i8** [[ARR]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.start(i64 8, i8* [[PTR1]]) + // CHECK: [[ELEMENT0:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i32 0, i32 0 // CHECK-NEXT: call void @_ZN1XC1Ev // CHECK-NEXT: [[OBJECT0:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1XcvP11objc_objectEv // CHECK: [[RET0:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT0]]) // CHECK: store i8* [[RET0]], i8** [[ELEMENT0]] // Initializing the second element - // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*]* [[OBJECTS]], i32 0, i32 1 + // CHECK: [[ELEMENT1:%[a-zA-Z0-9.]+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[OBJECTS]], i32 0, i32 1 // CHECK-NEXT: invoke void @_ZN1YC1Ev // CHECK: [[OBJECT1:%[a-zA-Z0-9.]+]] = invoke i8* @_ZNK1YcvP11objc_objectEv // CHECK: [[RET1:%[a-zA-Z0-9.]+]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[OBJECT1]]) @@ -94,6 +102,8 @@ void test_array_instantiation() { // CHECK-NEXT: call void @_ZN1XD1Ev // CHECK-NOT: ret void // CHECK: call void @objc_release + // CHECK-NEXT: [[PTR2]] = bitcast i8** [[ARR]] to i8* + // CHECK-NEXT: call void @llvm.lifetime.end(i64 8, i8* [[PTR2]]) // CHECK-NEXT: ret void // Check cleanups diff --git a/test/CodeGenObjCXX/lvalue-reference-getter.mm b/test/CodeGenObjCXX/lvalue-reference-getter.mm index 87c1320..3547ebe 100644 --- a/test/CodeGenObjCXX/lvalue-reference-getter.mm +++ b/test/CodeGenObjCXX/lvalue-reference-getter.mm @@ -22,7 +22,7 @@ static SetSection gSetSection; @end // CHECK: [[SELF:%.*]] = alloca [[T6:%.*]]*, align -// CHECK: [[T0:%.*]] = load {{.*}}* [[SELF]], align -// CHECK: [[T1:%.*]] = load {{.*}}* @OBJC_SELECTOR_REFERENCES_ +// CHECK: [[T0:%.*]] = load {{.*}}, {{.*}}* [[SELF]], align +// CHECK: [[T1:%.*]] = load {{.*}}, {{.*}}* @OBJC_SELECTOR_REFERENCES_ // CHECK: [[C:%.*]] = call dereferenceable({{[0-9]+}}) %struct.SetSection* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend // CHECK: call dereferenceable({{[0-9]+}}) i32* @_ZN10SetSection2atEi(%struct.SetSection* [[C]] diff --git a/test/CodeGenObjCXX/mangle-blocks.mm b/test/CodeGenObjCXX/mangle-blocks.mm index 1f3f163..283996d 100644 --- a/test/CodeGenObjCXX/mangle-blocks.mm +++ b/test/CodeGenObjCXX/mangle-blocks.mm @@ -1,8 +1,8 @@ // RUN: %clang_cc1 -emit-llvm -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 %s | FileCheck %s // CHECK: @_ZZZN26externally_visible_statics1S3fooEiEd_Ub0_E1k = linkonce_odr global i32 0 -// CHECK: @_ZZ26externally_visible_statics1S1xMUb0_E1j = linkonce_odr global i32 0 // CHECK: @_ZZZN26externally_visible_statics10inlinefuncEvEUb0_E1i = linkonce_odr global i32 0 +// CHECK: @_ZZ26externally_visible_statics1S1xMUb0_E1j = linkonce_odr global i32 0 int f(); diff --git a/test/CodeGenObjCXX/message-reference.mm b/test/CodeGenObjCXX/message-reference.mm index 6b341f8..636de13 100644 --- a/test/CodeGenObjCXX/message-reference.mm +++ b/test/CodeGenObjCXX/message-reference.mm @@ -16,5 +16,5 @@ @end // CHECK: [[T:%.*]] = call dereferenceable({{[0-9]+}}) i32* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend -// CHECK: [[U:%.*]] = load i32* [[T]] -// CHECK [[V:%.*]] = icmp eq i32 [[U]], 0 +// CHECK: [[U:%.*]] = load i32, i32* [[T]] +// CHECK: [[V:%.*]] = icmp eq i32 [[U]], 0 diff --git a/test/CodeGenObjCXX/message.mm b/test/CodeGenObjCXX/message.mm index af3d81f..b294244 100644 --- a/test/CodeGenObjCXX/message.mm +++ b/test/CodeGenObjCXX/message.mm @@ -17,7 +17,7 @@ namespace test0 { template void foo<int>(); // CHECK-LABEL: define weak_odr void @_ZN5test03fooIiEEvv() // CHECK: [[T0:%.*]] = call [[TEST0:%.*]]* @_ZN5test01AcvP5Test0Ev( - // CHECK-NEXT: [[T1:%.*]] = load i8** + // CHECK-NEXT: [[T1:%.*]] = load i8*, i8** // CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST0]]* [[T0]] to i8* // CHECK-NEXT: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*)*)(i8* [[T2]], i8* [[T1]]) // CHECK-NEXT: ret void diff --git a/test/CodeGenObjCXX/nested-ehlocation.mm b/test/CodeGenObjCXX/nested-ehlocation.mm new file mode 100644 index 0000000..de3e359 --- /dev/null +++ b/test/CodeGenObjCXX/nested-ehlocation.mm @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macosx -emit-llvm -g -stdlib=libc++ -fblocks -fexceptions -x objective-c++ -o - %s | FileCheck %s + +// Verify that all invoke instructions have a debug location. +// Literally: There are no unwind lines that don't end with ", (!dbg 123)". +// CHECK-NOT: {{to label %.* unwind label [^,]+$}} + +void block(void (^)(void)); +extern void foo(); +struct A { + ~A(void) { foo(); } + void bar() const {} +}; +void baz(void const *const) {} +struct B : A {}; +void test() { + A a; + B b; + block(^(void) { + baz(&b); + block(^() { + a.bar(); + }); + }); +} diff --git a/test/CodeGenObjCXX/property-lvalue-capture.mm b/test/CodeGenObjCXX/property-lvalue-capture.mm index 1242246..b800c39 100644 --- a/test/CodeGenObjCXX/property-lvalue-capture.mm +++ b/test/CodeGenObjCXX/property-lvalue-capture.mm @@ -24,10 +24,10 @@ typedef Quad2<double> Quad2d; } @end -// CHECK: [[TWO:%.*]] = load i8** @OBJC_SELECTOR_REFERENCES_, !invariant.load ![[MD_NUM:[0-9]+]] +// CHECK: [[TWO:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_, !invariant.load ![[MD_NUM:[0-9]+]] // CHECK: [[THREE:%.*]] = bitcast [[ONET:%.*]]* [[ONE:%.*]] to i8* // CHECK: [[CALL:%.*]] = call nonnull %struct.Quad2* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %struct.Quad2* (i8*, i8*)*)(i8* [[THREE]], i8* [[TWO]]) -// CHECK: [[FOUR:%.*]] = load i8** @OBJC_SELECTOR_REFERENCES_2, !invariant.load ![[MD_NUM]] +// CHECK: [[FOUR:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.2, !invariant.load ![[MD_NUM]] // CHECK: [[FIVE:%.*]] = bitcast [[ONET]]* [[ZERO:%.*]] to i8* // CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %struct.Quad2*)*)(i8* [[FIVE]], i8* [[FOUR]], %struct.Quad2* nonnull [[CALL]]) @@ -46,8 +46,8 @@ void test(C *c, const A &a) { const A &result = c.prop = a; } -// CHECK: [[ONE1:%.*]] = load %struct.A** [[AADDR:%.*]], align 8 -// CHECK: [[TWO1:%.*]] = load i8** @OBJC_SELECTOR_REFERENCES_5, !invariant.load ![[MD_NUM]] +// CHECK: [[ONE1:%.*]] = load %struct.A*, %struct.A** [[AADDR:%.*]], align 8 +// CHECK: [[TWO1:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.5, !invariant.load ![[MD_NUM]] // CHECK: [[THREE1:%.*]] = bitcast [[TWOT:%.*]]* [[ZERO1:%.*]] to i8* // CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %struct.A*)*)(i8* [[THREE1]], i8* [[TWO1]], %struct.A* dereferenceable({{[0-9]+}}) [[ONE1]]) // CHECK: store %struct.A* [[ONE1]], %struct.A** [[RESULT:%.*]], align 8 diff --git a/test/CodeGenObjCXX/property-object-conditional-exp.mm b/test/CodeGenObjCXX/property-object-conditional-exp.mm index 899c2c8..e3fc2d7 100644 --- a/test/CodeGenObjCXX/property-object-conditional-exp.mm +++ b/test/CodeGenObjCXX/property-object-conditional-exp.mm @@ -24,10 +24,10 @@ extern "C" bool CGRectIsEmpty(CGRect); // CHECK: [[SRC:%.*]] = call { i8*, i32 } bitcast (i8* (i8*, i8*, ...)* @objc_msgSend // CHECK-NEXT: bitcast -// CHECK-NEXT:getelementptr { i8*, i32 }* [[SRC:%.*]] +// CHECK-NEXT:getelementptr { i8*, i32 }, { i8*, i32 }* [[SRC:%.*]] // CHECK-NEXT:extractvalue // CHECK-NEXT:store -// CHECK-NEXT:getelementptr { i8*, i32 }* [[SRC:%.*]] +// CHECK-NEXT:getelementptr { i8*, i32 }, { i8*, i32 }* [[SRC:%.*]] // CHECK-NEXT:extractvalue // CHECK-NEXT:store dataRect = CGRectIsEmpty(virtualBounds) ? self.bounds : virtualBounds; diff --git a/test/CodeGenObjCXX/property-object-reference-1.mm b/test/CodeGenObjCXX/property-object-reference-1.mm index 79bf9e4..4eb7713 100644 --- a/test/CodeGenObjCXX/property-object-reference-1.mm +++ b/test/CodeGenObjCXX/property-object-reference-1.mm @@ -26,6 +26,6 @@ struct TCPPObject // CHECK: [[cppObjectaddr:%.*]] = alloca %struct.TCPPObject*, align 8 // CHECK: store %struct.TCPPObject* [[cppObject:%.*]], %struct.TCPPObject** [[cppObjectaddr]], align 8 -// CHECK: [[THREE:%.*]] = load %struct.TCPPObject** [[cppObjectaddr]], align 8 +// CHECK: [[THREE:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[cppObjectaddr]], align 8 // CHECK: [[FOUR:%.*]] = bitcast %struct.TCPPObject* [[THREE]] to i8* // CHECK: call void @objc_copyStruct(i8* [[TWO:%.*]], i8* [[FOUR]], i64 256, i1 zeroext true, i1 zeroext false) diff --git a/test/CodeGenObjCXX/property-object-reference-2.mm b/test/CodeGenObjCXX/property-object-reference-2.mm index 20949f7..87cebc1 100644 --- a/test/CodeGenObjCXX/property-object-reference-2.mm +++ b/test/CodeGenObjCXX/property-object-reference-2.mm @@ -30,8 +30,8 @@ struct TCPPObject @end // CHECK-LABEL: define internal void @__copy_helper_atomic_property_( -// CHECK: [[TWO:%.*]] = load %struct.TCPPObject** [[ADDR:%.*]], align 8 -// CHECK: [[THREE:%.*]] = load %struct.TCPPObject** [[ADDR1:%.*]], align 8 +// CHECK: [[TWO:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR:%.*]], align 8 +// CHECK: [[THREE:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR1:%.*]], align 8 // CHECK: [[CALL:%.*]] = call i32 @_Z7DEFAULTv() // CHECK: call void @_ZN10TCPPObjectC1ERKS_i(%struct.TCPPObject* [[TWO]], %struct.TCPPObject* dereferenceable({{[0-9]+}}) [[THREE]], i32 [[CALL]]) // CHECK: ret void @@ -44,8 +44,8 @@ struct TCPPObject // CHECK: ret void // CHECK-LABEL: define internal void @__assign_helper_atomic_property_( -// CHECK: [[TWO:%.*]] = load %struct.TCPPObject** [[ADDR:%.*]], align 8 -// CHECK: [[THREE:%.*]] = load %struct.TCPPObject** [[ADDR1:%.*]], align 8 +// CHECK: [[TWO:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR:%.*]], align 8 +// CHECK: [[THREE:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[ADDR1:%.*]], align 8 // CHECK: [[CALL:%.*]] = call dereferenceable({{[0-9]+}}) %struct.TCPPObject* @_ZN10TCPPObjectaSERKS_(%struct.TCPPObject* [[TWO]], %struct.TCPPObject* dereferenceable({{[0-9]+}}) [[THREE]]) // CHECK: ret void diff --git a/test/CodeGenObjCXX/property-object-reference.mm b/test/CodeGenObjCXX/property-object-reference.mm index 691e6ff..766b3d3 100644 --- a/test/CodeGenObjCXX/property-object-reference.mm +++ b/test/CodeGenObjCXX/property-object-reference.mm @@ -25,11 +25,11 @@ static Foo gFoo; @end // CHECK: [[T0:%.*]] = load {{%.*}} [[S0:%.*]] -// CHECK: load i8** @OBJC_SELECTOR_REFERENCES_ +// CHECK: load i8*, i8** @OBJC_SELECTOR_REFERENCES_ // CHECK: [[T2:%.*]] = bitcast {{%.*}} [[T0]] to i8* // CHECK: @objc_msgSend // CHECK: [[R0:%.*]] = load {{%.*}} [[U0:%.*]] -// CHECK: load i8** @OBJC_SELECTOR_REFERENCES_ +// CHECK: load i8*, i8** @OBJC_SELECTOR_REFERENCES_ // CHECK: [[R2:%.*]] = bitcast {{%.*}} [[R0]] to i8* // CHECK: @objc_msgSend diff --git a/test/CodeGenObjCXX/property-reference.mm b/test/CodeGenObjCXX/property-reference.mm index e426900..db7f5a6 100644 --- a/test/CodeGenObjCXX/property-reference.mm +++ b/test/CodeGenObjCXX/property-reference.mm @@ -42,9 +42,9 @@ namespace test1 { @end // CHECK: define internal dereferenceable({{[0-9]+}}) [[A:%.*]]* @"\01-[Test1 prop1]"( // CHECK: [[SELF:%.*]] = alloca [[TEST1:%.*]]*, align 8 -// CHECK: [[T0:%.*]] = load [[TEST1]]** [[SELF]] +// CHECK: [[T0:%.*]] = load [[TEST1]]*, [[TEST1]]** [[SELF]] // CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST1]]* [[T0]] to i8* -// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8* [[T1]], i64 0 +// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8, i8* [[T1]], i64 0 // CHECK-NEXT: [[T3:%.*]] = bitcast i8* [[T2]] to [[A]]* // CHECK-NEXT: ret [[A]]* [[T3]] @@ -68,10 +68,10 @@ template void test2<int>(Test2*); // CHECK: [[X:%.*]] = alloca i32, // CHECK: @objc_msgSend // CHECK: store i32 {{%.*}}, i32* [[X]], -// CHECK: load i32* [[X]], +// CHECK: load i32, i32* [[X]], // CHECK: @objc_msgSend // CHECK: @objc_msgSend -// CHECK: load i32* [[X]], +// CHECK: load i32, i32* [[X]], // CHECK-NEXT: add nsw // CHECK: @objc_msgSend // CHECK-NEXT: ret void @@ -87,10 +87,10 @@ template void test3<int>(Test2*); // CHECK: [[X:%.*]] = alloca i32, // CHECK: @objc_msgSend // CHECK: store i32 {{%.*}}, i32* [[X]], -// CHECK: load i32* [[X]], +// CHECK: load i32, i32* [[X]], // CHECK: @objc_msgSend // CHECK: @objc_msgSend -// CHECK: load i32* [[X]], +// CHECK: load i32, i32* [[X]], // CHECK-NEXT: add nsw // CHECK: @objc_msgSend // CHECK-NEXT: ret void |