eh.cpp revision 413e67778d593215d2f2161a4e712c8568f1ddd0
1ac418162692a951ca3796d6830496a85a2d12493John McCall// RUN: %clang_cc1 -fexceptions -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t.ll 2a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// RUN: FileCheck --input-file=%t.ll %s 3a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 4a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test1_D { 5a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump double d; 6a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} d1; 7a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 8a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test1() { 9a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw d1; 10a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 11a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 12ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: define void @_Z5test1v() 13ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: [[FREEVAR:%.*]] = alloca i1 14ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXNOBJVAR:%.*]] = alloca i8* 15ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 false, i1* [[FREEVAR]] 16ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8) 17ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i8* [[EXNOBJ]], i8** [[EXNOBJVAR]] 18ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 true, i1* [[FREEVAR]] 19ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]] 20ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXN2:%.*]] = bitcast [[DSTAR]] [[EXN]] to i8* 21ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[EXN2]], i8* bitcast ([[DSTAR]] @d1 to i8*), i64 8, i32 8, i1 false) 22ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 false, i1* [[FREEVAR]] 23ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast (%0* @_ZTI7test1_D to i8*), i8* null) noreturn 24a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT: unreachable 25a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 26a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 27a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test2_D { 28a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test2_D(const test2_D&o); 29a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test2_D(); 30a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump virtual void bar() { } 31a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump int i; int j; 32a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} d2; 33a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 34a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test2() { 35a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw d2; 36a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 37a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 38ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: define void @_Z5test2v() 39ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: [[FREEVAR:%.*]] = alloca i1 40ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXNOBJVAR:%.*]] = alloca i8* 41f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[EXNSLOTVAR:%.*]] = alloca i8* 42ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// CHECK-NEXT: [[CLEANUPDESTVAR:%.*]] = alloca i32 43ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 false, i1* [[FREEVAR]] 44ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 16) 45ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i8* [[EXNOBJ]], i8** [[EXNOBJVAR]] 46ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 true, i1* [[FREEVAR]] 47ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]] 48ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: invoke void @_ZN7test2_DC1ERKS_([[DSTAR]] [[EXN]], [[DSTAR]] @d2) 49ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: to label %[[CONT:.*]] unwind label %{{.*}} 507e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall// : [[CONT]]: (can't check this in Release-Asserts builds) 517e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall// CHECK: store i1 false, i1* [[FREEVAR]] 52ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast (%{{.*}}* @_ZTI7test2_D to i8*), i8* null) noreturn 53a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT: unreachable 54a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 55a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 56a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test3_D { 57a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test3_D() { } 58a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test3_D(volatile test3_D&o); 59a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump virtual void bar(); 60a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump}; 61a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 62a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test3() { 63a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw (volatile test3_D *)0; 64a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 65a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 66ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: define void @_Z5test3v() 67ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: [[FREEVAR:%.*]] = alloca i1 68ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXNOBJVAR:%.*]] = alloca i8* 69ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 false, i1* [[FREEVAR]] 70ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8) 71ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i8* [[EXNOBJ]], i8** [[EXNOBJVAR]] 72ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 true, i1* [[FREEVAR]] 73ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSS:%[^*]*\*]]* 74ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store [[DSS]] null, [[DSS]]* [[EXN]] 75ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: store i1 false, i1* [[FREEVAR]] 76ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast (%1* @_ZTIPV7test3_D to i8*), i8* null) noreturn 77ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: unreachable 78a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 79a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 80a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test4() { 81a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw; 82a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 83a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 84ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: define void @_Z5test4v() 8553b4810bad9385fbc65f045711585517f99fd31bMike Stump// CHECK: call void @__cxa_rethrow() noreturn 86a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT: unreachable 87ac418162692a951ca3796d6830496a85a2d12493John McCall 88ac418162692a951ca3796d6830496a85a2d12493John McCall 89ac418162692a951ca3796d6830496a85a2d12493John McCall// rdar://problem/7696549 90ac418162692a951ca3796d6830496a85a2d12493John McCallnamespace test5 { 91ac418162692a951ca3796d6830496a85a2d12493John McCall struct A { 92ac418162692a951ca3796d6830496a85a2d12493John McCall A(); 93ac418162692a951ca3796d6830496a85a2d12493John McCall A(const A&); 94ac418162692a951ca3796d6830496a85a2d12493John McCall ~A(); 95ac418162692a951ca3796d6830496a85a2d12493John McCall }; 96ac418162692a951ca3796d6830496a85a2d12493John McCall 97ac418162692a951ca3796d6830496a85a2d12493John McCall void test() { 98ac418162692a951ca3796d6830496a85a2d12493John McCall try { throw A(); } catch (A &x) {} 99ac418162692a951ca3796d6830496a85a2d12493John McCall } 100ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: define void @_ZN5test54testEv() 101ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 1) 102ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: [[EXNCAST:%.*]] = bitcast i8* [[EXNOBJ]] to [[A:%[^*]*]]* 103ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: invoke void @_ZN5test51AC1Ev([[A]]* [[EXNCAST]]) 104ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: invoke void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{%.*}}* @_ZTIN5test51AE to i8*), i8* bitcast (void ([[A]]*)* @_ZN5test51AD1Ev to i8*)) noreturn 105ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: to label {{%.*}} unwind label %[[HANDLER:[^ ]*]] 1067e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall// : [[HANDLER]]: (can't check this in Release-Asserts builds) 107ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: {{%.*}} = call i32 @llvm.eh.typeid.for(i8* bitcast ({{%.*}}* @_ZTIN5test51AE to i8*)) 108ac418162692a951ca3796d6830496a85a2d12493John McCall} 109f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 110f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test6 { 111f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall template <class T> struct allocator { 112f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall ~allocator() throw() { } 113f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall }; 114f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 115f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall void foo() { 116f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall allocator<int> a; 117f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 118f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall} 119f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 120f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// PR7127 121f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test7 { 122f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: define i32 @_ZN5test73fooEv() 123f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall int foo() { 124f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: [[FREEEXNOBJ:%.*]] = alloca i1 125f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[EXNALLOCVAR:%.*]] = alloca i8* 126f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[CAUGHTEXNVAR:%.*]] = alloca i8* 127f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[INTCATCHVAR:%.*]] = alloca i32 128ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// CHECK-NEXT: [[EHCLEANUPDESTVAR:%.*]] = alloca i32 129f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i1 false, i1* [[FREEEXNOBJ]] 130f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall try { 131f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall try { 132f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[EXNALLOC:%.*]] = call i8* @__cxa_allocate_exception 133f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i8* [[EXNALLOC]], i8** [[EXNALLOCVAR]] 134f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i1 true, i1* [[FREEEXNOBJ]] 135f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: bitcast i8* [[EXNALLOC]] to i32* 136f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i32 1, i32* 137f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i1 false, i1* [[FREEEXNOBJ]] 138f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: invoke void @__cxa_throw(i8* [[EXNALLOC]], i8* bitcast (i8** @_ZTIi to i8*), i8* null 139f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall throw 1; 140f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 141f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 142f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: [[CAUGHTEXN:%.*]] = call i8* @llvm.eh.exception() 143f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]] 144f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* [[CAUGHTEXN]], i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIi to i8*), i8* null) 145f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) 146f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: icmp eq 147f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: br i1 148f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: load i8** [[CAUGHTEXNVAR]] 149f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i8* @__cxa_begin_catch 150f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: invoke void @__cxa_rethrow 151f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall catch (int) { 152f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall throw; 153f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 154f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 155f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: [[CAUGHTEXN:%.*]] = call i8* @llvm.eh.exception() 156f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]] 157f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* [[CAUGHTEXN]], i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* null) 158ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// CHECK-NEXT: store i32 1, i32* [[EHCLEANUPDESTVAR]] 159f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call void @__cxa_end_catch() 160f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: br label 161f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: load i8** [[CAUGHTEXNVAR]] 162f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i8* @__cxa_begin_catch 163f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call void @__cxa_end_catch 164f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall catch (...) { 165f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 166f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: ret i32 0 167f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall return 0; 168f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 169f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall} 170f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 171f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// Ordering of destructors in a catch handler. 172f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test8 { 173f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall struct A { A(const A&); ~A(); }; 174f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall void bar(); 175f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 176f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: define void @_ZN5test83fooEv() 177f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall void foo() { 178f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall try { 179f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: invoke void @_ZN5test83barEv() 180f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall bar(); 181f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } catch (A a) { 182f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: call i8* @__cxa_get_exception_ptr 183f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK-NEXT: bitcast 184f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK-NEXT: invoke void @_ZN5test81AC1ERKS0_( 185f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: call i8* @__cxa_begin_catch 186f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK-NEXT: invoke void @_ZN5test81AD1Ev( 187f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: call void @__cxa_end_catch() 188f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: ret void 189f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 190f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 191f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall} 19259a7000a79118e4c140885ccbb2ac6a686a73092John McCall 19359a7000a79118e4c140885ccbb2ac6a686a73092John McCall// Constructor function-try-block must rethrow on fallthrough. 19459a7000a79118e4c140885ccbb2ac6a686a73092John McCall// rdar://problem/7696603 19559a7000a79118e4c140885ccbb2ac6a686a73092John McCallnamespace test9 { 19659a7000a79118e4c140885ccbb2ac6a686a73092John McCall void opaque(); 19759a7000a79118e4c140885ccbb2ac6a686a73092John McCall 19859a7000a79118e4c140885ccbb2ac6a686a73092John McCall struct A { A(); }; 19959a7000a79118e4c140885ccbb2ac6a686a73092John McCall 20059a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: define void @_ZN5test91AC1Ev 20159a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: call void @_ZN5test91AC2Ev 20259a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK-NEXT: ret void 20359a7000a79118e4c140885ccbb2ac6a686a73092John McCall 20459a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: define void @_ZN5test91AC2Ev( 20559a7000a79118e4c140885ccbb2ac6a686a73092John McCall A::A() try { 20659a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: invoke void @_ZN5test96opaqueEv() 20759a7000a79118e4c140885ccbb2ac6a686a73092John McCall opaque(); 20859a7000a79118e4c140885ccbb2ac6a686a73092John McCall } catch (int x) { 20959a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: call i8* @__cxa_begin_catch 21059a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: invoke void @_ZN5test96opaqueEv() 21159a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: invoke void @__cxa_rethrow() 21259a7000a79118e4c140885ccbb2ac6a686a73092John McCall opaque(); 21359a7000a79118e4c140885ccbb2ac6a686a73092John McCall } 21459a7000a79118e4c140885ccbb2ac6a686a73092John McCall 21559a7000a79118e4c140885ccbb2ac6a686a73092John McCall // landing pad from first call to invoke 21659a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: call i8* @llvm.eh.exception 21759a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* {{.*}}, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIi to i8*), i8* null) 21859a7000a79118e4c140885ccbb2ac6a686a73092John McCall} 2198e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2208e3f86193995c47ee0d229e4336c3382410f09f5John McCall// __cxa_end_catch can throw for some kinds of caught exceptions. 2218e3f86193995c47ee0d229e4336c3382410f09f5John McCallnamespace test10 { 2228e3f86193995c47ee0d229e4336c3382410f09f5John McCall void opaque(); 2238e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2248e3f86193995c47ee0d229e4336c3382410f09f5John McCall struct A { ~A(); }; 2258e3f86193995c47ee0d229e4336c3382410f09f5John McCall struct B { int x; }; 2268e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2278e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: define void @_ZN6test103fooEv() 2288e3f86193995c47ee0d229e4336c3382410f09f5John McCall void foo() { 2298e3f86193995c47ee0d229e4336c3382410f09f5John McCall A a; // force a cleanup context 2308e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2318e3f86193995c47ee0d229e4336c3382410f09f5John McCall try { 2328e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: invoke void @_ZN6test106opaqueEv() 2338e3f86193995c47ee0d229e4336c3382410f09f5John McCall opaque(); 2348e3f86193995c47ee0d229e4336c3382410f09f5John McCall } catch (int i) { 2358e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call i8* @__cxa_begin_catch 2368e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2378e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: load i32* 2388e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: store i32 2398e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: call void @__cxa_end_catch() nounwind 2408e3f86193995c47ee0d229e4336c3382410f09f5John McCall } catch (B a) { 2418e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call i8* @__cxa_begin_catch 2428e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2438e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2448e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2458e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: call void @llvm.memcpy 2468e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: invoke void @__cxa_end_catch() 2478e3f86193995c47ee0d229e4336c3382410f09f5John McCall } catch (...) { 2488e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call i8* @__cxa_begin_catch 2498e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: invoke void @__cxa_end_catch() 2508e3f86193995c47ee0d229e4336c3382410f09f5John McCall } 2518e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2528e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call void @_ZN6test101AD1Ev( 2538e3f86193995c47ee0d229e4336c3382410f09f5John McCall } 2548e3f86193995c47ee0d229e4336c3382410f09f5John McCall} 255204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 256204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall// __cxa_begin_catch returns pointers by value, even when catching by reference 257204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall// <rdar://problem/8212123> 258204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCallnamespace test11 { 259204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall void opaque(); 260204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 261204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: define void @_ZN6test113fooEv() 262204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall void foo() { 263204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall try { 264204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: invoke void @_ZN6test116opaqueEv() 265204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall opaque(); 266204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } catch (int**&p) { 267204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: [[EXN:%.*]] = load i8** 268204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind 269204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8* [[EXN]], i32 32 270204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to i32*** 271204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: store i32*** [[ADJ2]], i32**** [[P:%.*]] 272204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: call void @__cxa_end_catch() nounwind 273204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 274204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 275204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 276204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall struct A {}; 277204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 278204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: define void @_ZN6test113barEv() 279204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall void bar() { 280204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall try { 281204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: [[EXNSLOT:%.*]] = alloca i8* 282204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[P:%.*]] = alloca [[A:%.*]]**, 283204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[TMP:%.*]] = alloca [[A]]* 284204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: invoke void @_ZN6test116opaqueEv() 285204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall opaque(); 286204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } catch (A*&p) { 287204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: [[EXN:%.*]] = load i8** [[EXNSLOT]] 288204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[ADJ1:%.*]] = call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind 289204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to [[A]]* 290204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: store [[A]]* [[ADJ2]], [[A]]** [[TMP]] 291204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: store [[A]]** [[TMP]], [[A]]*** [[P]] 292204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: call void @__cxa_end_catch() nounwind 293204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 294204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 295204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall} 296ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 297ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// PR7686 298ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallnamespace test12 { 299ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall struct A { ~A(); }; 300ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall bool opaque(const A&); 301ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 302ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: define void @_ZN6test124testEv() 303ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall void test() { 304ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[X:%.*]] = alloca [[A:%.*]], 305ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[EHCLEANUPDEST:%.*]] = alloca i32 306ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[Y:%.*]] = alloca [[A]] 307ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[Z:%.*]] = alloca [[A]] 308ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[CLEANUPDEST:%.*]] = alloca i32 309ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 310ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A x; 311ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: invoke zeroext i1 @_ZN6test126opaqueERKNS_1AE( 312ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall if (opaque(x)) { 313ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A y; 314ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A z; 315ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 316ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* [[Z]]) 317ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* [[Y]]) 318ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 319ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // It'd be great if something eliminated this switch. 320ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: load i32* [[CLEANUPDEST]] 321ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK-NEXT: switch i32 322ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall goto success; 323ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 324ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 325ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall success: 326ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall bool _ = true; 327ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 328ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: call void @_ZN6test121AD1Ev([[A]]* [[X]]) 329ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK-NEXT: ret void 330ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 331ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall} 332ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 333ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// Reduced from some TableGen code that was causing a self-host crash. 334ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallnamespace test13 { 335ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall struct A { ~A(); }; 336ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 337ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall void test0(int x) { 338ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall try { 339ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall switch (x) { 340ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall case 0: 341ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall break; 342ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall case 1:{ 343ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A a; 344ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall break; 345ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 346ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall default: 347ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall return; 348ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 349ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall return; 350ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } catch (int x) { 351ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 352ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall return; 353ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 354ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 355ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall void test1(int x) { 356ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A y; 357ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall try { 358ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall switch (x) { 359ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall default: break; 360ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 361ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } catch (int x) {} 362ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 363ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall} 3647cd4b060f1e59f6d29126383ceee614e4772f859John McCall 3657cd4b060f1e59f6d29126383ceee614e4772f859John McCall// rdar://problem/8231514 3667cd4b060f1e59f6d29126383ceee614e4772f859John McCallnamespace test14 { 3677cd4b060f1e59f6d29126383ceee614e4772f859John McCall struct A { ~A(); }; 3687cd4b060f1e59f6d29126383ceee614e4772f859John McCall struct B { ~B(); }; 3697cd4b060f1e59f6d29126383ceee614e4772f859John McCall 3707cd4b060f1e59f6d29126383ceee614e4772f859John McCall B b(); 3717cd4b060f1e59f6d29126383ceee614e4772f859John McCall void opaque(); 3727cd4b060f1e59f6d29126383ceee614e4772f859John McCall 3737cd4b060f1e59f6d29126383ceee614e4772f859John McCall void foo() { 3747cd4b060f1e59f6d29126383ceee614e4772f859John McCall A a; 3757cd4b060f1e59f6d29126383ceee614e4772f859John McCall try { 3767cd4b060f1e59f6d29126383ceee614e4772f859John McCall B str = b(); 3777cd4b060f1e59f6d29126383ceee614e4772f859John McCall opaque(); 3787cd4b060f1e59f6d29126383ceee614e4772f859John McCall } catch (int x) { 3797cd4b060f1e59f6d29126383ceee614e4772f859John McCall } 3807cd4b060f1e59f6d29126383ceee614e4772f859John McCall } 3817cd4b060f1e59f6d29126383ceee614e4772f859John McCall} 382413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 383413e67778d593215d2f2161a4e712c8568f1ddd0John McCall// rdar://problem/8231514 384413e67778d593215d2f2161a4e712c8568f1ddd0John McCall// JumpDests shouldn't get confused by scopes that aren't normal cleanups. 385413e67778d593215d2f2161a4e712c8568f1ddd0John McCallnamespace test15 { 386413e67778d593215d2f2161a4e712c8568f1ddd0John McCall struct A { ~A(); }; 387413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 388413e67778d593215d2f2161a4e712c8568f1ddd0John McCall bool opaque(int); 389413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 390413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: define void @_ZN6test153fooEv() 391413e67778d593215d2f2161a4e712c8568f1ddd0John McCall void foo() { 392413e67778d593215d2f2161a4e712c8568f1ddd0John McCall A a; 393413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 394413e67778d593215d2f2161a4e712c8568f1ddd0John McCall try { 395413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: [[X:%.*]] = alloca i32 396413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: store i32 10, i32* [[X]] 397413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK-NEXT: br label 398413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // -> while.cond 399413e67778d593215d2f2161a4e712c8568f1ddd0John McCall int x = 10; 400413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 401413e67778d593215d2f2161a4e712c8568f1ddd0John McCall while (true) { 402413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: load i32* [[X]] 403413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK-NEXT: [[COND:%.*]] = invoke zeroext i1 @_ZN6test156opaqueEi 404413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br i1 [[COND]] 405413e67778d593215d2f2161a4e712c8568f1ddd0John McCall if (opaque(x)) 406413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br label 407413e67778d593215d2f2161a4e712c8568f1ddd0John McCall break; 408413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 409413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br label 410413e67778d593215d2f2161a4e712c8568f1ddd0John McCall } 411413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br label 412413e67778d593215d2f2161a4e712c8568f1ddd0John McCall } catch (int x) { } 413413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 414413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: call void @_ZN6test151AD1Ev 415413e67778d593215d2f2161a4e712c8568f1ddd0John McCall } 416413e67778d593215d2f2161a4e712c8568f1ddd0John McCall} 417