1*22337bfeSXiangling Liao // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -S -emit-llvm -x c++ \ 2*22337bfeSXiangling Liao // RUN: -fno-use-cxa-atexit -std=c++2a < %s | \ 3*22337bfeSXiangling Liao // RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s 4*22337bfeSXiangling Liao 5*22337bfeSXiangling Liao // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -S -emit-llvm -x c++ \ 6*22337bfeSXiangling Liao // RUN: -fno-use-cxa-atexit -std=c++2a < %s | \ 7*22337bfeSXiangling Liao // RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s 8*22337bfeSXiangling Liao 9*22337bfeSXiangling Liao namespace test1 { 10*22337bfeSXiangling Liao struct Test1 { 11*22337bfeSXiangling Liao Test1(); 12*22337bfeSXiangling Liao ~Test1(); 13*22337bfeSXiangling Liao } t1, t2; 14*22337bfeSXiangling Liao } // namespace test1 15*22337bfeSXiangling Liao 16*22337bfeSXiangling Liao namespace test2 { 17*22337bfeSXiangling Liao int foo() { return 3; } 18*22337bfeSXiangling Liao int x = foo(); 19*22337bfeSXiangling Liao } // namespace test2 20*22337bfeSXiangling Liao 21*22337bfeSXiangling Liao namespace test3 { 22*22337bfeSXiangling Liao struct Test3 { 23*22337bfeSXiangling Liao constexpr Test3() {}; 24*22337bfeSXiangling Liao ~Test3() {}; 25*22337bfeSXiangling Liao }; 26*22337bfeSXiangling Liao 27*22337bfeSXiangling Liao constinit Test3 t; 28*22337bfeSXiangling Liao } // namespace test3 29*22337bfeSXiangling Liao 30*22337bfeSXiangling Liao namespace test4 { 31*22337bfeSXiangling Liao struct Test4 { 32*22337bfeSXiangling Liao Test4(); 33*22337bfeSXiangling Liao ~Test4(); 34*22337bfeSXiangling Liao }; 35*22337bfeSXiangling Liao 36*22337bfeSXiangling Liao void f() { 37*22337bfeSXiangling Liao static Test4 staticLocal; 38*22337bfeSXiangling Liao } 39*22337bfeSXiangling Liao } // namespace test4 40*22337bfeSXiangling Liao 41*22337bfeSXiangling Liao // CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @__sinit80000000_clang_1145401da454a7baad10bfe313c46638, i8* null }] 42*22337bfeSXiangling Liao // CHECK: @llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @__sterm80000000_clang_1145401da454a7baad10bfe313c46638, i8* null }] 43*22337bfeSXiangling Liao 44*22337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init() [[ATTR:#[0-9]+]] { 45*22337bfeSXiangling Liao // CHECK: entry: 46*22337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* @_ZN5test12t1E) 47*22337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t1E) 48*22337bfeSXiangling Liao // CHECK: ret void 49*22337bfeSXiangling Liao // CHECK: } 50*22337bfeSXiangling Liao 51*22337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t1E() [[ATTR:#[0-9]+]] { 52*22337bfeSXiangling Liao // CHECK: entry: 53*22337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t1E) 54*22337bfeSXiangling Liao // CHECK: ret void 55*22337bfeSXiangling Liao // CHECK: } 56*22337bfeSXiangling Liao 57*22337bfeSXiangling Liao // CHECK: declare i32 @atexit(void ()*) 58*22337bfeSXiangling Liao 59*22337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t1E() [[ATTR:#[0-9]+]] { 60*22337bfeSXiangling Liao // CHECK: entry: 61*22337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t1E) 62*22337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 63*22337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 64*22337bfeSXiangling Liao 65*22337bfeSXiangling Liao // CHECK: destruct.call: 66*22337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test12t1E() 67*22337bfeSXiangling Liao // CHECK: br label %destruct.end 68*22337bfeSXiangling Liao 69*22337bfeSXiangling Liao // CHECK: destruct.end: 70*22337bfeSXiangling Liao // CHECK: ret void 71*22337bfeSXiangling Liao // CHECK: } 72*22337bfeSXiangling Liao 73*22337bfeSXiangling Liao // CHECK: declare i32 @unatexit(void ()*) 74*22337bfeSXiangling Liao 75*22337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.1() [[ATTR:#[0-9]+]] { 76*22337bfeSXiangling Liao // CHECK: entry: 77*22337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* @_ZN5test12t2E) 78*22337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t2E) 79*22337bfeSXiangling Liao // CHECK: ret void 80*22337bfeSXiangling Liao // CHECK: } 81*22337bfeSXiangling Liao 82*22337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t2E() [[ATTR:#[0-9]+]] { 83*22337bfeSXiangling Liao // CHECK: entry: 84*22337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t2E) 85*22337bfeSXiangling Liao // CHECK: ret void 86*22337bfeSXiangling Liao // CHECK: } 87*22337bfeSXiangling Liao 88*22337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t2E() [[ATTR:#[0-9]+]] { 89*22337bfeSXiangling Liao // CHECK: entry: 90*22337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t2E) 91*22337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 92*22337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 93*22337bfeSXiangling Liao 94*22337bfeSXiangling Liao // CHECK: destruct.call: 95*22337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test12t2E() 96*22337bfeSXiangling Liao // CHECK: br label %destruct.end 97*22337bfeSXiangling Liao 98*22337bfeSXiangling Liao // CHECK: destruct.end: 99*22337bfeSXiangling Liao // CHECK: ret void 100*22337bfeSXiangling Liao // CHECK: } 101*22337bfeSXiangling Liao 102*22337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.2() [[ATTR:#[0-9]+]] { 103*22337bfeSXiangling Liao // CHECK: entry: 104*22337bfeSXiangling Liao // CHECK32: %call = call i32 @_ZN5test23fooEv() 105*22337bfeSXiangling Liao // CHECK64: %call = call signext i32 @_ZN5test23fooEv() 106*22337bfeSXiangling Liao // CHECK: store i32 %call, i32* @_ZN5test21xE 107*22337bfeSXiangling Liao // CHECK: ret void 108*22337bfeSXiangling Liao // CHECK: } 109*22337bfeSXiangling Liao 110*22337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.3() [[ATTR:#[0-9]+]] { 111*22337bfeSXiangling Liao // CHECK: entry: 112*22337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test31tE) 113*22337bfeSXiangling Liao // CHECK: ret void 114*22337bfeSXiangling Liao // CHECK: } 115*22337bfeSXiangling Liao 116*22337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test31tE() [[ATTR:#[0-9]+]] { 117*22337bfeSXiangling Liao // CHECK: entry: 118*22337bfeSXiangling Liao // CHECK: call void @_ZN5test35Test3D1Ev(%"struct.test3::Test3"* @_ZN5test31tE) 119*22337bfeSXiangling Liao // CHECK: ret void 120*22337bfeSXiangling Liao // CHECK: } 121*22337bfeSXiangling Liao 122*22337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test31tE() [[ATTR:#[0-9]+]] { 123*22337bfeSXiangling Liao // CHECK: entry: 124*22337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test31tE) 125*22337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 126*22337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 127*22337bfeSXiangling Liao 128*22337bfeSXiangling Liao // CHECK: destruct.call: 129*22337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test31tE() 130*22337bfeSXiangling Liao // CHECK: br label %destruct.end 131*22337bfeSXiangling Liao 132*22337bfeSXiangling Liao // CHECK: destruct.end: 133*22337bfeSXiangling Liao // CHECK: ret void 134*22337bfeSXiangling Liao // CHECK: } 135*22337bfeSXiangling Liao 136*22337bfeSXiangling Liao // CHECK: define void @_ZN5test41fEv() [[ATTR:#[0-9]+]] { 137*22337bfeSXiangling Liao // CHECK: entry: 138*22337bfeSXiangling Liao // CHECK: %0 = load atomic i8, i8* bitcast (i64* @_ZGVZN5test41fEvE11staticLocal to i8*) acquire 139*22337bfeSXiangling Liao // CHECK: %guard.uninitialized = icmp eq i8 %0, 0 140*22337bfeSXiangling Liao // CHECK: br i1 %guard.uninitialized, label %init.check, label %init.end 141*22337bfeSXiangling Liao 142*22337bfeSXiangling Liao // CHECK: init.check: 143*22337bfeSXiangling Liao // CHECK: %1 = call i32 @__cxa_guard_acquire(i64* @_ZGVZN5test41fEvE11staticLocal) 144*22337bfeSXiangling Liao // CHECK: %tobool = icmp ne i32 %1, 0 145*22337bfeSXiangling Liao // CHECK: br i1 %tobool, label %init, label %init.end 146*22337bfeSXiangling Liao 147*22337bfeSXiangling Liao // CHECK: init: 148*22337bfeSXiangling Liao // CHECK: call void @_ZN5test45Test4C1Ev(%"struct.test4::Test4"* @_ZZN5test41fEvE11staticLocal) 149*22337bfeSXiangling Liao // CHECK: %2 = call i32 @atexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal) 150*22337bfeSXiangling Liao // CHECK: call void @__cxa_guard_release(i64* @_ZGVZN5test41fEvE11staticLocal) 151*22337bfeSXiangling Liao // CHECK: br label %init.end 152*22337bfeSXiangling Liao 153*22337bfeSXiangling Liao // CHECK: init.end: 154*22337bfeSXiangling Liao // CHECK: ret void 155*22337bfeSXiangling Liao // CHECK: } 156*22337bfeSXiangling Liao 157*22337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] { 158*22337bfeSXiangling Liao // CHECK: entry: 159*22337bfeSXiangling Liao // CHECK: call void @_ZN5test45Test4D1Ev(%"struct.test4::Test4"* @_ZZN5test41fEvE11staticLocal) 160*22337bfeSXiangling Liao // CHECK: ret void 161*22337bfeSXiangling Liao // CHECK: } 162*22337bfeSXiangling Liao 163*22337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] { 164*22337bfeSXiangling Liao // CHECK: entry: 165*22337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal) 166*22337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 167*22337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 168*22337bfeSXiangling Liao 169*22337bfeSXiangling Liao // CHECK: destruct.call: 170*22337bfeSXiangling Liao // CHECK: call void @__dtor__ZZN5test41fEvE11staticLocal() 171*22337bfeSXiangling Liao // CHECK: br label %destruct.end 172*22337bfeSXiangling Liao 173*22337bfeSXiangling Liao // CHECK: destruct.end: 174*22337bfeSXiangling Liao // CHECK: ret void 175*22337bfeSXiangling Liao // CHECK: } 176*22337bfeSXiangling Liao 177*22337bfeSXiangling Liao // CHECK: define void @__sinit80000000_clang_1145401da454a7baad10bfe313c46638() [[ATTR:#[0-9]+]] { 178*22337bfeSXiangling Liao // CHECK: entry: 179*22337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init() 180*22337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.1() 181*22337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.2() 182*22337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.3() 183*22337bfeSXiangling Liao // CHECK: ret void 184*22337bfeSXiangling Liao // CHECK: } 185*22337bfeSXiangling Liao 186*22337bfeSXiangling Liao // CHECK: define void @__sterm80000000_clang_1145401da454a7baad10bfe313c46638() [[ATTR:#[0-9]+]] { 187*22337bfeSXiangling Liao // CHECK: entry: 188*22337bfeSXiangling Liao // CHECK: call void @__finalize__ZZN5test41fEvE11staticLocal() 189*22337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test31tE() 190*22337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test12t2E() 191*22337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test12t1E() 192*22337bfeSXiangling Liao // CHECK: ret void 193*22337bfeSXiangling Liao // CHECK: } 194