1 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-pc-win32 -emit-llvm %s -o - | FileCheck --check-prefix=COFF %s
2 // COFF:      @baz = dso_local global i32 42
3 // COFF-NEXT: @import_var = external dllimport global i32
4 // COFF-NEXT: @weak_bar = extern_weak global i32
5 // COFF-NEXT: @bar = external dso_local global i32
6 // COFF-NEXT: @local_thread_var = dso_local thread_local global i32 42
7 // COFF-NEXT: @thread_var = external dso_local thread_local global i32
8 // COFF-DAG: declare dso_local void @foo()
9 // COFF-DAG: define dso_local i32* @zed()
10 // COFF-DAG: declare dllimport void @import_func()
11 
12 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-w64-mingw32 -emit-llvm %s -o - | FileCheck --check-prefixes=MINGW,MINGW-NATIVE_TLS %s
13 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-w64-mingw32 -emit-llvm %s -o - -femulated-tls | FileCheck --check-prefixes=MINGW,MINGW-EMUTLS %s
14 // MINGW:      @baz = dso_local global i32 42
15 // MINGW-NEXT: @import_var = external dllimport global i32
16 // MINGW-NEXT: @weak_bar = extern_weak global i32
17 // MINGW-NEXT: @bar = external global i32
18 // MINGW-NEXT: @local_thread_var = dso_local thread_local global i32 42
19 // MINGW-NATIVE_TLS-NEXT: @thread_var = external dso_local thread_local global i32
20 // MINGW-EMUTLS-NEXT: @thread_var = external thread_local global i32
21 // MINGW-DAG: declare dso_local void @foo()
22 // MINGW-DAG: define dso_local i32* @zed()
23 // MINGW-DAG: declare dllimport void @import_func()
24 
25 /// Static relocation model defaults to -fdirect-access-external-data and sets
26 /// dso_local on most global objects.
27 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=STATIC %s
28 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -mrelocation-model static -fdirect-access-external-data %s -o - | FileCheck --check-prefix=STATIC %s
29 // STATIC:      @baz = dso_local global i32 42
30 // STATIC-NEXT: @import_var = external dso_local global i32
31 // STATIC-NEXT: @weak_bar = extern_weak dso_local global i32
32 // STATIC-NEXT: @bar = external dso_local global i32
33 // STATIC-NEXT: @local_thread_var = dso_local thread_local global i32 42
34 // STATIC-NEXT: @thread_var = external thread_local global i32
35 // STATIC-DAG: declare dso_local void @foo()
36 // STATIC-DAG: define dso_local i32* @zed()
37 // STATIC-DAG: declare dso_local void @import_func()
38 
39 /// If -fno-direct-access-external-data is set, drop dso_local from global variable
40 /// declarations.
41 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm %s -mrelocation-model static -fno-direct-access-external-data -o - | FileCheck --check-prefix=STATIC-INDIRECT %s
42 // STATIC-INDIRECT:      @baz = dso_local global i32 42
43 // STATIC-INDIRECT-NEXT: @import_var = external global i32
44 // STATIC-INDIRECT-NEXT: @weak_bar = extern_weak global i32
45 // STATIC-INDIRECT-NEXT: @bar = external global i32
46 // STATIC-INDIRECT-NEXT: @local_thread_var = dso_local thread_local global i32 42
47 // STATIC-INDIRECT-NEXT: @thread_var = external thread_local global i32
48 // STATIC-INDIRECT-DAG:  declare void @import_func()
49 // STATIC-INDIRECT-DAG:  define dso_local i32* @zed()
50 // STATIC-INDIRECT-DAG:  declare void @foo()
51 
52 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie %s -o - | FileCheck --check-prefix=PIE %s
53 // PIE:      @baz = dso_local global i32 42
54 // PIE-NEXT: @import_var = external global i32
55 // PIE-NEXT: @weak_bar = extern_weak global i32
56 // PIE-NEXT: @bar = external global i32
57 // PIE-NEXT: @local_thread_var = dso_local thread_local global i32 42
58 // PIE-NEXT: @thread_var = external thread_local global i32
59 // PIE-DAG: declare void @foo()
60 // PIE-DAG: define dso_local i32* @zed()
61 // PIE-DAG: declare void @import_func()
62 
63 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie -fdirect-access-external-data %s -o - | FileCheck --check-prefix=PIE-DIRECT %s
64 // PIE-DIRECT:      @baz = dso_local global i32 42
65 // PIE-DIRECT-NEXT: @import_var = external dso_local global i32
66 // PIE-DIRECT-NEXT: @weak_bar = extern_weak global i32
67 // PIE-DIRECT-NEXT: @bar = external dso_local global i32
68 // PIE-DIRECT-NEXT: @local_thread_var = dso_local thread_local global i32 42
69 // PIE-DIRECT-NEXT: @thread_var = external thread_local global i32
70 // PIE-DIRECT-DAG: declare void @foo()
71 // PIE-DIRECT-DAG: define dso_local i32* @zed()
72 // PIE-DIRECT-DAG: declare void @import_func()
73 
74 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -mrelocation-model static -fno-plt %s -o - | FileCheck --check-prefix=NOPLT %s
75 // NOPLT:      @baz = dso_local global i32 42
76 // NOPLT-NEXT: @import_var = external dso_local global i32
77 // NOPLT-NEXT: @weak_bar = extern_weak dso_local global i32
78 // NOPLT-NEXT: @bar = external dso_local global i32
79 // NOPLT-NEXT: @local_thread_var = dso_local thread_local global i32 42
80 // NOPLT-NEXT: @thread_var = external thread_local global i32
81 // NOPLT-DAG: declare void @foo()
82 // NOPLT-DAG: define dso_local i32* @zed()
83 // NOPLT-DAG: declare void @import_func()
84 
85 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -fno-plt -pic-level 1 -pic-is-pie -fdirect-access-external-data %s -o - | FileCheck --check-prefix=PIE-DIRECT-NOPLT %s
86 // PIE-DIRECT-NOPLT:      @baz = dso_local global i32 42
87 // PIE-DIRECT-NOPLT-NEXT: @import_var = external dso_local global i32
88 // PIE-DIRECT-NOPLT-NEXT: @weak_bar = extern_weak global i32
89 // PIE-DIRECT-NOPLT-NEXT: @bar = external dso_local global i32
90 // PIE-DIRECT-NOPLT-NEXT: @local_thread_var = dso_local thread_local global i32 42
91 // PIE-DIRECT-NOPLT-NEXT: @thread_var = external thread_local global i32
92 // PIE-DIRECT-NOPLT-DAG: declare void @foo()
93 // PIE-DIRECT-NOPLT-DAG: define dso_local i32* @zed()
94 // PIE-DIRECT-NOPLT-DAG: declare void @import_func()
95 
96 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie -fno-plt %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s
97 // RUN: %clang_cc1 -no-opaque-pointers -triple powerpc64le -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s
98 // PIE-NO-PLT:      @baz = dso_local global i32 42
99 // PIE-NO-PLT-NEXT: @import_var = external global i32
100 // PIE-NO-PLT-NEXT: @weak_bar = extern_weak global i32
101 // PIE-NO-PLT-NEXT: @bar = external global i32
102 // PIE-NO-PLT-NEXT: @local_thread_var = dso_local thread_local global i32 42
103 // PIE-NO-PLT-NEXT: @thread_var = external thread_local global i32
104 // PIE-NO-PLT-DAG:  declare void @import_func()
105 // PIE-NO-PLT-DAG:  define dso_local i32* @zed()
106 // PIE-NO-PLT-DAG:  declare void @foo()
107 
108 /// -fdirect-access-external-data is currently ignored for -fPIC.
109 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -pic-level 2 %s -o - | FileCheck --check-prefix=SHARED %s
110 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64 -emit-llvm -pic-level 2 -fdirect-access-external-data %s -o - | FileCheck --check-prefix=SHARED %s
111 // SHARED-DAG: @bar = external global i32
112 // SHARED-DAG: @weak_bar = extern_weak global i32
113 // SHARED-DAG: declare void @foo()
114 // SHARED-DAG: @baz ={{.*}} global i32 42
115 // SHARED-DAG: define{{.*}} i32* @zed()
116 // SHARED-DAG: @thread_var = external thread_local global i32
117 // SHARED-DAG: @local_thread_var ={{.*}} thread_local global i32 42
118 
119 int baz = 42;
120 __attribute__((dllimport)) extern int import_var;
121 __attribute__((weak)) extern int weak_bar;
122 extern int bar;
123 __attribute__((dllimport)) void import_func(void);
124 
use_import(void)125 int *use_import(void) {
126   import_func();
127   return &import_var;
128 }
129 
130 void foo(void);
131 
zed(void)132 int *zed(void) {
133   foo();
134   return baz ? &weak_bar : &bar;
135 }
136 
137 __thread int local_thread_var = 42;
138 extern __thread int thread_var;
get_thread_var(int a)139 int *get_thread_var(int a) {
140   return a ? &thread_var : &local_thread_var;
141 }
142