1 // RUN: %clang_cc1 %s -std=c++1y -triple=x86_64-pc-linux -emit-llvm -o - | FileCheck --check-prefix=ELF --check-prefix=ALL %s 2 // RUN: %clang_cc1 %s -std=c++1y -triple=x86_64-apple-darwin -emit-llvm -o - | FileCheck --check-prefix=MACHO --check-prefix=ALL %s 3 // RUN: %clang_cc1 %s -std=c++1y -triple=x86_64-pc-linux -emit-llvm -fdeclspec -DSELECTANY -o - | FileCheck --check-prefix=ELF-SELECTANY %s 4 5 #ifdef SELECTANY 6 struct S { 7 S(); 8 ~S(); 9 }; 10 11 int f(); 12 13 // ELF-SELECTANY: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @__cxx_global_var_init, i8* bitcast (i32* @selectany to i8*) }] 14 // ELF-SELECTANY: @llvm.used = appending global [1 x i8*] [i8* bitcast (i32* @selectany to i8*)] 15 int __declspec(selectany) selectany = f(); 16 17 #else 18 19 // ALL: ; ModuleID 20 21 extern "C" int foo(); 22 23 template<typename T> struct A { static int a; }; 24 template<typename T> int A<T>::a = foo(); 25 26 // ALLK-NOT: @_ZN1AIcE1aE 27 template<> int A<char>::a; 28 29 // ALL: @_ZN1AIbE1aE ={{.*}} global i32 10 30 template<> int A<bool>::a = 10; 31 32 // ALL: @llvm.global_ctors = appending global [8 x { i32, void ()*, i8* }] 33 34 // ELF: [{ i32, void ()*, i8* } { i32 65535, void ()* @[[unordered1:[^,]*]], i8* bitcast (i32* @_ZN1AIsE1aE to i8*) }, 35 // MACHO: [{ i32, void ()*, i8* } { i32 65535, void ()* @[[unordered1:[^,]*]], i8* null }, 36 37 // ELF: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered2:[^,]*]], i8* bitcast (i16* @_Z1xIsE to i8*) }, 38 // MACHO: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered2:[^,]*]], i8* null }, 39 40 // ELF: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered3:[^,]*]], i8* bitcast (i32* @_ZN2ns1aIiE1iE to i8*) }, 41 // MACHO: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered3:[^,]*]], i8* null }, 42 43 // ELF: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered4:[^,]*]], i8* bitcast (i32* @_ZN2ns1b1iIiEE to i8*) }, 44 // MACHO: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered4:[^,]*]], i8* null }, 45 46 // ELF: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered5:[^,]*]], i8* bitcast (i32* @_ZN1AIvE1aE to i8*) }, 47 // MACHO: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered5:[^,]*]], i8* null }, 48 49 // ELF: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered6:[^,]*]], i8* @_Z1xIcE }, 50 // MACHO: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered6:[^,]*]], i8* null }, 51 52 // ALL: { i32, void ()*, i8* } { i32 65535, void ()* @[[unordered7:[^,]*]], i8* null }, 53 54 // ALL: { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_static_member_variable_explicit_specialization.cpp, i8* null }] 55 56 /// llvm.used ensures SHT_INIT_ARRAY in a section group cannot be GCed. 57 // ELF: @llvm.used = appending global [6 x i8*] [i8* bitcast (i32* @_ZN1AIsE1aE to i8*), i8* bitcast (i16* @_Z1xIsE to i8*), i8* bitcast (i32* @_ZN2ns1aIiE1iE to i8*), i8* bitcast (i32* @_ZN2ns1b1iIiEE to i8*), i8* bitcast (i32* @_ZN1AIvE1aE to i8*), i8* @_Z1xIcE] 58 59 template int A<short>::a; // Unordered 60 int b = foo(); 61 int c = foo(); 62 int d = A<void>::a; // Unordered 63 64 // An explicit specialization is ordered, and goes in __GLOBAL_sub_I_static_member_variable_explicit_specialization.cpp. 65 template<> struct A<int> { static int a; }; 66 int A<int>::a = foo(); 67 68 template<typename T> struct S { static T x; static T y; }; 69 template<> int S<int>::x = foo(); 70 template<> int S<int>::y = S<int>::x; 71 72 template<typename T> T x = foo(); 73 template short x<short>; // Unordered 74 template<> int x<int> = foo(); 75 int e = x<char>; // Unordered 76 77 namespace ns { 78 template <typename T> struct a { 79 static int i; 80 }; 81 template<typename T> int a<T>::i = foo(); 82 template struct a<int>; 83 84 struct b { 85 template <typename T> static T i; 86 }; 87 template<typename T> T b::i = foo(); 88 template int b::i<int>; 89 } 90 91 namespace { 92 template<typename T> struct Internal { static int a; }; 93 template<typename T> int Internal<T>::a = foo(); 94 } 95 int *use_internal_a = &Internal<int>::a; 96 97 #endif 98 99 // ALL: define internal void @[[unordered1]]( 100 // ALL: call i32 @foo() 101 // ALL: store {{.*}} @_ZN1AIsE1aE 102 // ALL: ret 103 104 // ALL: define internal void @[[unordered2]]( 105 // ALL: call i32 @foo() 106 // ALL: store {{.*}} @_Z1xIsE 107 // ALL: ret 108 109 // ALL: define internal void @[[unordered3]]( 110 // ALL: call i32 @foo() 111 // ALL: store {{.*}} @_ZN2ns1aIiE1iE 112 // ALL: ret 113 114 // ALL: define internal void @[[unordered4]]( 115 // ALL: call i32 @foo() 116 // ALL: store {{.*}} @_ZN2ns1b1iIiEE 117 // ALL: ret 118 119 // ALL: define internal void @[[unordered5]]( 120 // ALL: call i32 @foo() 121 // ALL: store {{.*}} @_ZN1AIvE1aE 122 // ALL: ret 123 124 // ALL: define internal void @[[unordered6]]( 125 // ALL: call i32 @foo() 126 // ALL: store {{.*}} @_Z1xIcE 127 // ALL: ret 128 129 // ALL: define internal void @[[unordered7]]( 130 // ALL: call i32 @foo() 131 // ALL: store {{.*}} @_ZN12_GLOBAL__N_18InternalIiE1aE 132 // ALL: ret 133 134 // ALL: define internal void @_GLOBAL__sub_I_static_member_variable_explicit_specialization.cpp() 135 // We call unique stubs for every ordered dynamic initializer in the TU. 136 // ALL: call 137 // ALL: call 138 // ALL: call 139 // ALL: call 140 // ALL: call 141 // ALL: call 142 // ALL: call 143 // ALL: call 144 // ALL-NOT: call 145 // ALL: ret 146