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