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 416ef801aaSXiangling Liao // CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I__, i8* null }] 426ef801aaSXiangling Liao // CHECK: @llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__D_a, i8* null }] 4322337bfeSXiangling Liao 4422337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init() [[ATTR:#[0-9]+]] { 4522337bfeSXiangling Liao // CHECK: entry: 46*69cd776eSCJ Johnson // CHECK: call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* {{[^,]*}} @_ZN5test12t1E) 4722337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t1E) 4822337bfeSXiangling Liao // CHECK: ret void 4922337bfeSXiangling Liao // CHECK: } 5022337bfeSXiangling Liao 5122337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t1E() [[ATTR:#[0-9]+]] { 5222337bfeSXiangling Liao // CHECK: entry: 5322337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t1E) 5422337bfeSXiangling Liao // CHECK: ret void 5522337bfeSXiangling Liao // CHECK: } 5622337bfeSXiangling Liao 5722337bfeSXiangling Liao // CHECK: declare i32 @atexit(void ()*) 5822337bfeSXiangling Liao 5922337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t1E() [[ATTR:#[0-9]+]] { 6022337bfeSXiangling Liao // CHECK: entry: 6122337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t1E) 6222337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 6322337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 6422337bfeSXiangling Liao 6522337bfeSXiangling Liao // CHECK: destruct.call: 6622337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test12t1E() 6722337bfeSXiangling Liao // CHECK: br label %destruct.end 6822337bfeSXiangling Liao 6922337bfeSXiangling Liao // CHECK: destruct.end: 7022337bfeSXiangling Liao // CHECK: ret void 7122337bfeSXiangling Liao // CHECK: } 7222337bfeSXiangling Liao 7322337bfeSXiangling Liao // CHECK: declare i32 @unatexit(void ()*) 7422337bfeSXiangling Liao 7522337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.1() [[ATTR:#[0-9]+]] { 7622337bfeSXiangling Liao // CHECK: entry: 77*69cd776eSCJ Johnson // CHECK: call void @_ZN5test15Test1C1Ev(%"struct.test1::Test1"* {{[^,]*}} @_ZN5test12t2E) 7822337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test12t2E) 7922337bfeSXiangling Liao // CHECK: ret void 8022337bfeSXiangling Liao // CHECK: } 8122337bfeSXiangling Liao 8222337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test12t2E() [[ATTR:#[0-9]+]] { 8322337bfeSXiangling Liao // CHECK: entry: 8422337bfeSXiangling Liao // CHECK: call void @_ZN5test15Test1D1Ev(%"struct.test1::Test1"* @_ZN5test12t2E) 8522337bfeSXiangling Liao // CHECK: ret void 8622337bfeSXiangling Liao // CHECK: } 8722337bfeSXiangling Liao 8822337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test12t2E() [[ATTR:#[0-9]+]] { 8922337bfeSXiangling Liao // CHECK: entry: 9022337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test12t2E) 9122337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 9222337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 9322337bfeSXiangling Liao 9422337bfeSXiangling Liao // CHECK: destruct.call: 9522337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test12t2E() 9622337bfeSXiangling Liao // CHECK: br label %destruct.end 9722337bfeSXiangling Liao 9822337bfeSXiangling Liao // CHECK: destruct.end: 9922337bfeSXiangling Liao // CHECK: ret void 10022337bfeSXiangling Liao // CHECK: } 10122337bfeSXiangling Liao 10222337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.2() [[ATTR:#[0-9]+]] { 10322337bfeSXiangling Liao // CHECK: entry: 10422337bfeSXiangling Liao // CHECK32: %call = call i32 @_ZN5test23fooEv() 10522337bfeSXiangling Liao // CHECK64: %call = call signext i32 @_ZN5test23fooEv() 10622337bfeSXiangling Liao // CHECK: store i32 %call, i32* @_ZN5test21xE 10722337bfeSXiangling Liao // CHECK: ret void 10822337bfeSXiangling Liao // CHECK: } 10922337bfeSXiangling Liao 11022337bfeSXiangling Liao // CHECK: define internal void @__cxx_global_var_init.3() [[ATTR:#[0-9]+]] { 11122337bfeSXiangling Liao // CHECK: entry: 11222337bfeSXiangling Liao // CHECK: %0 = call i32 @atexit(void ()* @__dtor__ZN5test31tE) 11322337bfeSXiangling Liao // CHECK: ret void 11422337bfeSXiangling Liao // CHECK: } 11522337bfeSXiangling Liao 11622337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZN5test31tE() [[ATTR:#[0-9]+]] { 11722337bfeSXiangling Liao // CHECK: entry: 11822337bfeSXiangling Liao // CHECK: call void @_ZN5test35Test3D1Ev(%"struct.test3::Test3"* @_ZN5test31tE) 11922337bfeSXiangling Liao // CHECK: ret void 12022337bfeSXiangling Liao // CHECK: } 12122337bfeSXiangling Liao 12222337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZN5test31tE() [[ATTR:#[0-9]+]] { 12322337bfeSXiangling Liao // CHECK: entry: 12422337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZN5test31tE) 12522337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 12622337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 12722337bfeSXiangling Liao 12822337bfeSXiangling Liao // CHECK: destruct.call: 12922337bfeSXiangling Liao // CHECK: call void @__dtor__ZN5test31tE() 13022337bfeSXiangling Liao // CHECK: br label %destruct.end 13122337bfeSXiangling Liao 13222337bfeSXiangling Liao // CHECK: destruct.end: 13322337bfeSXiangling Liao // CHECK: ret void 13422337bfeSXiangling Liao // CHECK: } 13522337bfeSXiangling Liao 13622337bfeSXiangling Liao // CHECK: define void @_ZN5test41fEv() [[ATTR:#[0-9]+]] { 13722337bfeSXiangling Liao // CHECK: entry: 13822337bfeSXiangling Liao // CHECK: %0 = load atomic i8, i8* bitcast (i64* @_ZGVZN5test41fEvE11staticLocal to i8*) acquire 13922337bfeSXiangling Liao // CHECK: %guard.uninitialized = icmp eq i8 %0, 0 14022337bfeSXiangling Liao // CHECK: br i1 %guard.uninitialized, label %init.check, label %init.end 14122337bfeSXiangling Liao 14222337bfeSXiangling Liao // CHECK: init.check: 14322337bfeSXiangling Liao // CHECK: %1 = call i32 @__cxa_guard_acquire(i64* @_ZGVZN5test41fEvE11staticLocal) 14422337bfeSXiangling Liao // CHECK: %tobool = icmp ne i32 %1, 0 14522337bfeSXiangling Liao // CHECK: br i1 %tobool, label %init, label %init.end 14622337bfeSXiangling Liao 14722337bfeSXiangling Liao // CHECK: init: 148*69cd776eSCJ Johnson // CHECK: call void @_ZN5test45Test4C1Ev(%"struct.test4::Test4"* {{[^,]*}} @_ZZN5test41fEvE11staticLocal) 14922337bfeSXiangling Liao // CHECK: %2 = call i32 @atexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal) 15022337bfeSXiangling Liao // CHECK: call void @__cxa_guard_release(i64* @_ZGVZN5test41fEvE11staticLocal) 15122337bfeSXiangling Liao // CHECK: br label %init.end 15222337bfeSXiangling Liao 15322337bfeSXiangling Liao // CHECK: init.end: 15422337bfeSXiangling Liao // CHECK: ret void 15522337bfeSXiangling Liao // CHECK: } 15622337bfeSXiangling Liao 15722337bfeSXiangling Liao // CHECK: define internal void @__dtor__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] { 15822337bfeSXiangling Liao // CHECK: entry: 15922337bfeSXiangling Liao // CHECK: call void @_ZN5test45Test4D1Ev(%"struct.test4::Test4"* @_ZZN5test41fEvE11staticLocal) 16022337bfeSXiangling Liao // CHECK: ret void 16122337bfeSXiangling Liao // CHECK: } 16222337bfeSXiangling Liao 16322337bfeSXiangling Liao // CHECK: define internal void @__finalize__ZZN5test41fEvE11staticLocal() [[ATTR:#[0-9]+]] { 16422337bfeSXiangling Liao // CHECK: entry: 16522337bfeSXiangling Liao // CHECK: %0 = call i32 @unatexit(void ()* @__dtor__ZZN5test41fEvE11staticLocal) 16622337bfeSXiangling Liao // CHECK: %needs_destruct = icmp eq i32 %0, 0 16722337bfeSXiangling Liao // CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end 16822337bfeSXiangling Liao 16922337bfeSXiangling Liao // CHECK: destruct.call: 17022337bfeSXiangling Liao // CHECK: call void @__dtor__ZZN5test41fEvE11staticLocal() 17122337bfeSXiangling Liao // CHECK: br label %destruct.end 17222337bfeSXiangling Liao 17322337bfeSXiangling Liao // CHECK: destruct.end: 17422337bfeSXiangling Liao // CHECK: ret void 17522337bfeSXiangling Liao // CHECK: } 17622337bfeSXiangling Liao 1776ef801aaSXiangling Liao // CHECK: define internal void @_GLOBAL__sub_I__() [[ATTR:#[0-9]+]] { 17822337bfeSXiangling Liao // CHECK: entry: 17922337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init() 18022337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.1() 18122337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.2() 18222337bfeSXiangling Liao // CHECK: call void @__cxx_global_var_init.3() 18322337bfeSXiangling Liao // CHECK: ret void 18422337bfeSXiangling Liao // CHECK: } 18522337bfeSXiangling Liao 1866ef801aaSXiangling Liao // CHECK: define internal void @_GLOBAL__D_a() [[ATTR:#[0-9]+]] { 18722337bfeSXiangling Liao // CHECK: entry: 18822337bfeSXiangling Liao // CHECK: call void @__finalize__ZZN5test41fEvE11staticLocal() 18922337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test31tE() 19022337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test12t2E() 19122337bfeSXiangling Liao // CHECK: call void @__finalize__ZN5test12t1E() 19222337bfeSXiangling Liao // CHECK: ret void 19322337bfeSXiangling Liao // CHECK: } 194