122337bfeSXiangling Liao // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -S -emit-llvm -x c++ \ 23f2e61c1SXiangling Liao // RUN: -std=c++2a < %s | \ 322337bfeSXiangling Liao // RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s 422337bfeSXiangling Liao 522337bfeSXiangling Liao // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -S -emit-llvm -x c++ \ 63f2e61c1SXiangling Liao // RUN: -std=c++2a < %s | \ 722337bfeSXiangling Liao // RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s 822337bfeSXiangling Liao 922337bfeSXiangling Liao namespace test1 { 1022337bfeSXiangling Liao struct Test1 { 1122337bfeSXiangling Liao Test1(); 1222337bfeSXiangling Liao ~Test1(); 1322337bfeSXiangling Liao } t1, t2; 1422337bfeSXiangling Liao } // namespace test1 1522337bfeSXiangling Liao 1622337bfeSXiangling Liao namespace test2 { 1722337bfeSXiangling Liao int foo() { return 3; } 1822337bfeSXiangling Liao int x = foo(); 1922337bfeSXiangling Liao } // namespace test2 2022337bfeSXiangling Liao 2122337bfeSXiangling Liao namespace test3 { 2222337bfeSXiangling Liao struct Test3 { 2322337bfeSXiangling Liao constexpr Test3() {}; 2422337bfeSXiangling Liao ~Test3() {}; 2522337bfeSXiangling Liao }; 2622337bfeSXiangling Liao 2722337bfeSXiangling Liao constinit Test3 t; 2822337bfeSXiangling Liao } // namespace test3 2922337bfeSXiangling Liao 3022337bfeSXiangling Liao namespace test4 { 3122337bfeSXiangling Liao struct Test4 { 3222337bfeSXiangling Liao Test4(); 3322337bfeSXiangling Liao ~Test4(); 3422337bfeSXiangling Liao }; 3522337bfeSXiangling Liao 3622337bfeSXiangling Liao void f() { 3722337bfeSXiangling Liao static Test4 staticLocal; 3822337bfeSXiangling Liao } 3922337bfeSXiangling Liao } // namespace test4 4022337bfeSXiangling Liao 41*6b1e2fc8SXiangling Liao // CHECK: @_ZGVZN5test41fEvE11staticLocal = internal global i64 0, align 8 426ef801aaSXiangling Liao // CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I__, i8* null }] 436ef801aaSXiangling Liao // CHECK: @llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__D_a, i8* null }] 4422337bfeSXiangling Liao 4522337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init() [[ATTR:#[0-9]+]] { 4622337bfeSXiangling Liao // CHECK: entry: 4769cd776eSCJ Johnson // CHECK: call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* {{[^,]*}} @_ZN5test12t1E) 4822337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t1E) 4922337bfeSXiangling Liao // CHECK: ret void 5022337bfeSXiangling Liao // CHECK: } 5122337bfeSXiangling Liao 5222337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t1E() [[ATTR:#[0-9]+]] { 5322337bfeSXiangling Liao // CHECK: entry: 5422337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t1E) 5522337bfeSXiangling Liao // CHECK: ret void 5622337bfeSXiangling Liao // CHECK: } 5722337bfeSXiangling Liao 5822337bfeSXiangling Liao // CHECK: declare i32 @atexit(void ()*) 5922337bfeSXiangling Liao 6022337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t1E() [[ATTR:#[0-9]+]] { 6122337bfeSXiangling Liao // CHECK: entry: 6222337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t1E) 6322337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 6422337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 6522337bfeSXiangling Liao 6622337bfeSXiangling Liao // CHECK: destruct.call: 6722337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test12t1E() 6822337bfeSXiangling Liao // CHECK: br label %destruct.end 6922337bfeSXiangling Liao 7022337bfeSXiangling Liao // CHECK: destruct.end: 7122337bfeSXiangling Liao // CHECK: ret void 7222337bfeSXiangling Liao // CHECK: } 7322337bfeSXiangling Liao 7422337bfeSXiangling Liao // CHECK: declare i32 @unatexit(void ()*) 7522337bfeSXiangling Liao 7622337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.1() [[ATTR:#[0-9]+]] { 7722337bfeSXiangling Liao // CHECK: entry: 7869cd776eSCJ Johnson // CHECK: call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* {{[^,]*}} @_ZN5test12t2E) 7922337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t2E) 8022337bfeSXiangling Liao // CHECK: ret void 8122337bfeSXiangling Liao // CHECK: } 8222337bfeSXiangling Liao 8322337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t2E() [[ATTR:#[0-9]+]] { 8422337bfeSXiangling Liao // CHECK: entry: 8522337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t2E) 8622337bfeSXiangling Liao // CHECK: ret void 8722337bfeSXiangling Liao // CHECK: } 8822337bfeSXiangling Liao 8922337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t2E() [[ATTR:#[0-9]+]] { 9022337bfeSXiangling Liao // CHECK: entry: 9122337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t2E) 9222337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 9322337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 9422337bfeSXiangling Liao 9522337bfeSXiangling Liao // CHECK: destruct.call: 9622337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test12t2E() 9722337bfeSXiangling Liao // CHECK: br label %destruct.end 9822337bfeSXiangling Liao 9922337bfeSXiangling Liao // CHECK: destruct.end: 10022337bfeSXiangling Liao // CHECK: ret void 10122337bfeSXiangling Liao // CHECK: } 10222337bfeSXiangling Liao 10322337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.2() [[ATTR:#[0-9]+]] { 10422337bfeSXiangling Liao // CHECK: entry: 10522337bfeSXiangling Liao // CHECK32: %call = call i32 @_ZN5test23fooEv() 10622337bfeSXiangling Liao // CHECK64: %call = call signext i32 @_ZN5test23fooEv() 10722337bfeSXiangling Liao // CHECK: store i32 %call, i32* @_ZN5test21xE 10822337bfeSXiangling Liao // CHECK: ret void 10922337bfeSXiangling Liao // CHECK: } 11022337bfeSXiangling Liao 11122337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.3() [[ATTR:#[0-9]+]] { 11222337bfeSXiangling Liao // CHECK: entry: 11322337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test31tE) 11422337bfeSXiangling Liao // CHECK: ret void 11522337bfeSXiangling Liao // CHECK: } 11622337bfeSXiangling Liao 11722337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test31tE() [[ATTR:#[0-9]+]] { 11822337bfeSXiangling Liao // CHECK: entry: 11922337bfeSXiangling Liao // CHECK: call void @_ZN5test35Test3D1Ev(%"struct.test3::Test3"* @_ZN5test31tE) 12022337bfeSXiangling Liao // CHECK: ret void 12122337bfeSXiangling Liao // CHECK: } 12222337bfeSXiangling Liao 12322337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test31tE() [[ATTR:#[0-9]+]] { 12422337bfeSXiangling Liao // CHECK: entry: 12522337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test31tE) 12622337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 12722337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 12822337bfeSXiangling Liao 12922337bfeSXiangling Liao // CHECK: destruct.call: 13022337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test31tE() 13122337bfeSXiangling Liao // CHECK: br label %destruct.end 13222337bfeSXiangling Liao 13322337bfeSXiangling Liao // CHECK: destruct.end: 13422337bfeSXiangling Liao // CHECK: ret void 13522337bfeSXiangling Liao // CHECK: } 13622337bfeSXiangling Liao 13722337bfeSXiangling Liao // CHECK: define void @_ZN5test41fEv() [[ATTR:#[0-9]+]] { 13822337bfeSXiangling Liao // CHECK: entry: 139*6b1e2fc8SXiangling Liao // CHECK: %0 = load atomic i8, i8* bitcast (i64* @_ZGVZN5test41fEvE11staticLocal to i8*) acquire, align 8 14022337bfeSXiangling Liao // CHECK: %guard.uninitialized = icmp eq i8 %0, 0 14122337bfeSXiangling Liao // CHECK: br i1 %guard.uninitialized, label %init.check, label %init.end 14222337bfeSXiangling Liao 14322337bfeSXiangling Liao // CHECK: init.check: 14422337bfeSXiangling Liao // CHECK: %1 = call i32 @__cxa_guard_acquire(i64* @_ZGVZN5test41fEvE11staticLocal) 14522337bfeSXiangling Liao // CHECK: %tobool = icmp ne i32 %1, 0 14622337bfeSXiangling Liao // CHECK: br i1 %tobool, label %init, label %init.end 14722337bfeSXiangling Liao 14822337bfeSXiangling Liao // CHECK: init: 14969cd776eSCJ Johnson // CHECK: call void @_ZN5test45Test4C1Ev(%"struct.test4::Test4"* {{[^,]*}} @_ZZN5test41fEvE11staticLocal) 15022337bfeSXiangling Liao // CHECK: %2 = call i32 @atexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal) 15122337bfeSXiangling Liao // CHECK: call void @__cxa_guard_release(i64* @_ZGVZN5test41fEvE11staticLocal) 15222337bfeSXiangling Liao // CHECK: br label %init.end 15322337bfeSXiangling Liao 15422337bfeSXiangling Liao // CHECK: init.end: 15522337bfeSXiangling Liao // CHECK: ret void 15622337bfeSXiangling Liao // CHECK: } 15722337bfeSXiangling Liao 15822337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] { 15922337bfeSXiangling Liao // CHECK: entry: 16022337bfeSXiangling Liao // CHECK: call void @_ZN5test45Test4D1Ev(%"struct.test4::Test4"* @_ZZN5test41fEvE11staticLocal) 16122337bfeSXiangling Liao // CHECK: ret void 16222337bfeSXiangling Liao // CHECK: } 16322337bfeSXiangling Liao 16422337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] { 16522337bfeSXiangling Liao // CHECK: entry: 16622337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal) 16722337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 16822337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 16922337bfeSXiangling Liao 17022337bfeSXiangling Liao // CHECK: destruct.call: 17122337bfeSXiangling Liao // CHECK: call void @__dtor__ZZN5test41fEvE11staticLocal() 17222337bfeSXiangling Liao // CHECK: br label %destruct.end 17322337bfeSXiangling Liao 17422337bfeSXiangling Liao // CHECK: destruct.end: 17522337bfeSXiangling Liao // CHECK: ret void 17622337bfeSXiangling Liao // CHECK: } 17722337bfeSXiangling Liao 1786ef801aaSXiangling Liao // CHECK: define internal void @_GLOBAL__sub_I__() [[ATTR:#[0-9]+]] { 17922337bfeSXiangling Liao // CHECK: entry: 18022337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init() 18122337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.1() 18222337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.2() 18322337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.3() 18422337bfeSXiangling Liao // CHECK: ret void 18522337bfeSXiangling Liao // CHECK: } 18622337bfeSXiangling Liao 1876ef801aaSXiangling Liao // CHECK: define internal void @_GLOBAL__D_a() [[ATTR:#[0-9]+]] { 18822337bfeSXiangling Liao // CHECK: entry: 18922337bfeSXiangling Liao // CHECK: call void @__finalize__ZZN5test41fEvE11staticLocal() 19022337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test31tE() 19122337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test12t2E() 19222337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test12t1E() 19322337bfeSXiangling Liao // CHECK: ret void 19422337bfeSXiangling Liao // CHECK: } 195