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