236 lines · cpp
1// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -emit-llvm -x c++ \2// RUN: -std=c++2a < %s | \3// RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s4 5// RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -emit-llvm -x c++ \6// RUN: -std=c++2a < %s | \7// RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s8 9namespace test1 {10struct Test1 {11 Test1(int) {}12 ~Test1() {}13};14 15Test1 t0 = 2;16 17template <typename T>18Test1 t1 = 2;19 20inline Test1 t2 = 2;21 22void foo() {23 (void)&t1<int>;24}25} // namespace test126 27namespace test2 {28template <typename = void>29struct A {30 A() {}31 ~A() {}32 static A instance;33};34 35template <typename T>36A<T> A<T>::instance;37template A<> A<>::instance;38 39A<int> &bar() {40 A<int> *a = new A<int>;41 return *a;42}43template <>44A<int> A<int>::instance = bar();45} // namespace test246 47// CHECK: @_ZGVN5test12t2E = linkonce_odr global i64 0, align 848// CHECK: @_ZGVN5test21AIvE8instanceE = weak_odr global i64 0, align 849// CHECK: @_ZGVN5test12t1IiEE = linkonce_odr global i64 0, align 850// CHECK: @llvm.global_ctors = appending global [4 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__cxx_global_var_init.1, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @__cxx_global_var_init.2, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @__cxx_global_var_init.4, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I__, ptr null }]51// CHECK: @llvm.global_dtors = appending global [4 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__finalize__ZN5test12t2E, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @__finalize__ZN5test21AIvE8instanceE, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @__finalize__ZN5test12t1IiEE, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__D_a, ptr null }]52 53// CHECK: define internal void @__cxx_global_var_init() [[ATTR:#[0-9]+]] {54// CHECK: entry:55// CHECK32: call void @_ZN5test15Test1C1Ei(ptr noundef{{[^,]*}} @_ZN5test12t0E, i32 noundef 2)56// CHECK64: call void @_ZN5test15Test1C1Ei(ptr noundef{{[^,]*}} @_ZN5test12t0E, i32 noundef signext 2)57// CHECK: %0 = call i32 @atexit(ptr @__dtor__ZN5test12t0E)58// CHECK: ret void59// CHECK: }60 61// CHECK: define internal void @__dtor__ZN5test12t0E() [[ATTR:#[0-9]+]] {62// CHECK: entry:63// CHECK: call void @_ZN5test15Test1D1Ev(ptr @_ZN5test12t0E)64// CHECK: ret void65// CHECK: }66 67// CHECK: define internal void @__finalize__ZN5test12t0E() [[ATTR:#[0-9]+]] {68// CHECK: entry:69// CHECK: %0 = call i32 @unatexit(ptr @__dtor__ZN5test12t0E)70// CHECK: %needs_destruct = icmp eq i32 %0, 071// CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end72 73// CHECK: destruct.call:74// CHECK: call void @__dtor__ZN5test12t0E()75// CHECK: br label %destruct.end76 77// CHECK: destruct.end:78// CHECK: ret void79// CHECK: }80 81// CHECK: define internal void @__cxx_global_var_init.1() [[ATTR:#[0-9]+]] {82// CHECK: entry:83// CHECK: %0 = load atomic i8, ptr @_ZGVN5test12t2E acquire, align 884// CHECK: %guard.uninitialized = icmp eq i8 %0, 085// CHECK: br i1 %guard.uninitialized, label %init.check, label %init.end86 87// CHECK: init.check:88// CHECK: %1 = call i32 @__cxa_guard_acquire(ptr @_ZGVN5test12t2E)89// CHECK: %tobool = icmp ne i32 %1, 090// CHECK: br i1 %tobool, label %init, label %init.end91 92// CHECK: init:93// CHECK32: call void @_ZN5test15Test1C1Ei(ptr noundef{{[^,]*}} @_ZN5test12t2E, i32 noundef 2)94// CHECK64: call void @_ZN5test15Test1C1Ei(ptr noundef{{[^,]*}} @_ZN5test12t2E, i32 noundef signext 2)95// CHECK: %2 = call i32 @atexit(ptr @__dtor__ZN5test12t2E)96// CHECK: call void @__cxa_guard_release(ptr @_ZGVN5test12t2E)97// CHECK: br label %init.end98 99// CHECK: init.end:100// CHECK: ret void101// CHECK: }102 103// CHECK: define internal void @__dtor__ZN5test12t2E() [[ATTR:#[0-9]+]] {104// CHECK: entry:105// CHECK: call void @_ZN5test15Test1D1Ev(ptr @_ZN5test12t2E)106// CHECK: ret void107// CHECK: }108 109// CHECK: define internal void @__finalize__ZN5test12t2E() [[ATTR:#[0-9]+]] {110// CHECK: entry:111// CHECK: %0 = call i32 @unatexit(ptr @__dtor__ZN5test12t2E)112// CHECK: %needs_destruct = icmp eq i32 %0, 0113// CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end114 115// CHECK: destruct.call:116// CHECK: call void @__dtor__ZN5test12t2E()117// CHECK: br label %destruct.end118 119// CHECK: destruct.end:120// CHECK: ret void121// CHECK: }122 123// CHECK: define internal void @__cxx_global_var_init.2() [[ATTR:#[0-9]+]] {124// CHECK: entry:125// CHECK: %0 = load i8, ptr @_ZGVN5test21AIvE8instanceE, align 8126// CHECK: %guard.uninitialized = icmp eq i8 %0, 0127// CHECK: br i1 %guard.uninitialized, label %init.check, label %init.end128 129// CHECK: init.check:130// CHECK: store i8 1, ptr @_ZGVN5test21AIvE8instanceE, align 8131// CHECK: call void @_ZN5test21AIvEC1Ev(ptr {{[^,]*}} @_ZN5test21AIvE8instanceE)132// CHECK: %1 = call i32 @atexit(ptr @__dtor__ZN5test21AIvE8instanceE)133// CHECK: br label %init.end134 135// CHECK: init.end:136// CHECK: ret void137// CHECK: }138 139// CHECK: define internal void @__dtor__ZN5test21AIvE8instanceE() [[ATTR:#[0-9]+]] {140// CHECK: entry:141// CHECK: call void @_ZN5test21AIvED1Ev(ptr @_ZN5test21AIvE8instanceE)142// CHECK: ret void143// CHECK: }144 145// CHECK: define internal void @__finalize__ZN5test21AIvE8instanceE() [[ATTR:#[0-9]+]] {146// CHECK: entry:147// CHECK: %0 = call i32 @unatexit(ptr @__dtor__ZN5test21AIvE8instanceE)148// CHECK: %needs_destruct = icmp eq i32 %0, 0149// CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end150 151// CHECK: destruct.call:152// CHECK: call void @__dtor__ZN5test21AIvE8instanceE()153// CHECK: br label %destruct.end154 155// CHECK: destruct.end:156// CHECK: ret void157// CHECK: }158 159// CHECK: define internal void @__cxx_global_var_init.3() [[ATTR:#[0-9]+]] {160// CHECK: entry:161// CHECK: %call = call noundef nonnull align 1 dereferenceable(1) ptr @_ZN5test23barEv()162// CHECK: %0 = call i32 @atexit(ptr @__dtor__ZN5test21AIiE8instanceE)163// CHECK: ret void164// CHECK: }165 166// CHECK: define internal void @__dtor__ZN5test21AIiE8instanceE() [[ATTR:#[0-9]+]] {167// CHECK: entry:168// CHECK: call void @_ZN5test21AIiED1Ev(ptr @_ZN5test21AIiE8instanceE)169// CHECK: ret void170// CHECK: }171 172// CHECK: define internal void @__finalize__ZN5test21AIiE8instanceE() [[ATTR:#[0-9]+]] {173// CHECK: entry:174// CHECK: %0 = call i32 @unatexit(ptr @__dtor__ZN5test21AIiE8instanceE)175// CHECK: %needs_destruct = icmp eq i32 %0, 0176// CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end177 178// CHECK: destruct.call:179// CHECK: call void @__dtor__ZN5test21AIiE8instanceE()180// CHECK: br label %destruct.end181 182// CHECK: destruct.end:183// CHECK: ret void184// CHECK: }185 186// CHECK: define internal void @__cxx_global_var_init.4() [[ATTR:#[0-9]+]] {187// CHECK: entry:188// CHECK: %0 = load i8, ptr @_ZGVN5test12t1IiEE, align 8189// CHECK: %guard.uninitialized = icmp eq i8 %0, 0190// CHECK: br i1 %guard.uninitialized, label %init.check, label %init.end191 192// CHECK: init.check:193// CHECK: store i8 1, ptr @_ZGVN5test12t1IiEE, align 8194// CHECK32: call void @_ZN5test15Test1C1Ei(ptr {{[^,]*}} @_ZN5test12t1IiEE, i32 noundef 2)195// CHECK64: call void @_ZN5test15Test1C1Ei(ptr {{[^,]*}} @_ZN5test12t1IiEE, i32 noundef signext 2)196// CHECK: %1 = call i32 @atexit(ptr @__dtor__ZN5test12t1IiEE)197// CHECK: br label %init.end198 199// CHECK: init.end:200// CHECK: ret void201// CHECK: }202 203// CHECK: define internal void @__dtor__ZN5test12t1IiEE() [[ATTR:#[0-9]+]] {204// CHECK: entry:205// CHECK: call void @_ZN5test15Test1D1Ev(ptr @_ZN5test12t1IiEE)206// CHECK: ret void207// CHECK: }208 209// CHECK: define internal void @__finalize__ZN5test12t1IiEE() [[ATTR:#[0-9]+]] {210// CHECK: entry:211// CHECK: %0 = call i32 @unatexit(ptr @__dtor__ZN5test12t1IiEE)212// CHECK: %needs_destruct = icmp eq i32 %0, 0213// CHECK: br i1 %needs_destruct, label %destruct.call, label %destruct.end214 215// CHECK: destruct.call:216// CHECK: call void @__dtor__ZN5test12t1IiEE()217// CHECK: br label %destruct.end218 219// CHECK: destruct.end:220// CHECK: ret void221// CHECK: }222 223// CHECK: define internal void @_GLOBAL__sub_I__() [[ATTR:#[0-9]+]] {224// CHECK: entry:225// CHECK: call void @__cxx_global_var_init()226// CHECK: call void @__cxx_global_var_init.3()227// CHECK: ret void228// CHECK: }229 230// CHECK: define internal void @_GLOBAL__D_a() [[ATTR:#[0-9]+]] {231// CHECK: entry:232// CHECK: call void @__finalize__ZN5test21AIiE8instanceE()233// CHECK: call void @__finalize__ZN5test12t0E()234// CHECK: ret void235// CHECK: }236