1 // RUN: %clang_cc1 -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 -triple x86_64-w64-mingw32 -emit-llvm %s -o - | FileCheck --check-prefix=MINGW %s 13 // MINGW: @baz = dso_local global i32 42 14 // MINGW-NEXT: @import_var = external dllimport global i32 15 // MINGW-NEXT: @weak_bar = extern_weak global i32 16 // MINGW-NEXT: @bar = external global i32 17 // MINGW-NEXT: @local_thread_var = dso_local thread_local global i32 42 18 // MINGW-NEXT: @thread_var = external dso_local thread_local global i32 19 // MINGW-DAG: declare dso_local void @foo() 20 // MINGW-DAG: define dso_local i32* @zed() 21 // MINGW-DAG: declare dllimport void @import_func() 22 23 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=STATIC %s 24 // STATIC: @baz = dso_local global i32 42 25 // STATIC-NEXT: @import_var = external dso_local global i32 26 // STATIC-NEXT: @weak_bar = extern_weak dso_local global i32 27 // STATIC-NEXT: @bar = external dso_local global i32 28 // STATIC-NEXT: @local_thread_var = dso_local thread_local global i32 42 29 // STATIC-NEXT: @thread_var = external thread_local global i32 30 // STATIC-DAG: declare dso_local void @foo() 31 // STATIC-DAG: define dso_local i32* @zed() 32 // STATIC-DAG: declare dso_local void @import_func() 33 34 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie %s -o - | FileCheck --check-prefix=PIE %s 35 // PIE: @baz = dso_local global i32 42 36 // PIE-NEXT: @import_var = external global i32 37 // PIE-NEXT: @weak_bar = extern_weak global i32 38 // PIE-NEXT: @bar = external global i32 39 // PIE-NEXT: @local_thread_var = dso_local thread_local global i32 42 40 // PIE-NEXT: @thread_var = external thread_local global i32 41 // PIE-DAG: declare void @foo() 42 // PIE-DAG: define dso_local i32* @zed() 43 // PIE-DAG: declare void @import_func() 44 45 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie -mpie-copy-relocations %s -o - | FileCheck --check-prefix=PIE-DIRECT %s 46 // PIE-DIRECT: @baz = dso_local global i32 42 47 // PIE-DIRECT-NEXT: @import_var = external dso_local global i32 48 // PIE-DIRECT-NEXT: @weak_bar = extern_weak global i32 49 // PIE-DIRECT-NEXT: @bar = external dso_local global i32 50 // PIE-DIRECT-NEXT: @local_thread_var = dso_local thread_local global i32 42 51 // PIE-DIRECT-NEXT: @thread_var = external thread_local global i32 52 // PIE-DIRECT-DAG: declare void @foo() 53 // PIE-DIRECT-DAG: define dso_local i32* @zed() 54 // PIE-DIRECT-DAG: declare void @import_func() 55 56 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -mrelocation-model static -fno-plt %s -o - | FileCheck --check-prefix=NOPLT %s 57 // NOPLT: @baz = dso_local global i32 42 58 // NOPLT-NEXT: @import_var = external dso_local global i32 59 // NOPLT-NEXT: @weak_bar = extern_weak dso_local global i32 60 // NOPLT-NEXT: @bar = external dso_local global i32 61 // NOPLT-NEXT: @local_thread_var = dso_local thread_local global i32 42 62 // NOPLT-NEXT: @thread_var = external thread_local global i32 63 // NOPLT-DAG: declare void @foo() 64 // NOPLT-DAG: define dso_local i32* @zed() 65 // NOPLT-DAG: declare void @import_func() 66 67 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -fno-plt -pic-level 1 -pic-is-pie -mpie-copy-relocations %s -o - | FileCheck --check-prefix=PIE-DIRECT-NOPLT %s 68 // PIE-DIRECT-NOPLT: @baz = dso_local global i32 42 69 // PIE-DIRECT-NOPLT-NEXT: @import_var = external dso_local global i32 70 // PIE-DIRECT-NOPLT-NEXT: @weak_bar = extern_weak global i32 71 // PIE-DIRECT-NOPLT-NEXT: @bar = external dso_local global i32 72 // PIE-DIRECT-NOPLT-NEXT: @local_thread_var = dso_local thread_local global i32 42 73 // PIE-DIRECT-NOPLT-NEXT: @thread_var = external thread_local global i32 74 // PIE-DIRECT-NOPLT-DAG: declare void @foo() 75 // PIE-DIRECT-NOPLT-DAG: define dso_local i32* @zed() 76 // PIE-DIRECT-NOPLT-DAG: declare void @import_func() 77 78 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-is-pie -fno-plt %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s 79 // RUN: %clang_cc1 -triple powerpc64le -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s 80 // PIE-NO-PLT: @baz = dso_local global i32 42 81 // PIE-NO-PLT-NEXT: @import_var = external global i32 82 // PIE-NO-PLT-NEXT: @weak_bar = extern_weak global i32 83 // PIE-NO-PLT-NEXT: @bar = external global i32 84 // PIE-NO-PLT-NEXT: @local_thread_var = dso_local thread_local global i32 42 85 // PIE-NO-PLT-NEXT: @thread_var = external thread_local global i32 86 // PIE-NO-PLT-DAG: declare void @import_func() 87 // PIE-NO-PLT-DAG: define dso_local i32* @zed() 88 // PIE-NO-PLT-DAG: declare void @foo() 89 90 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 2 %s -o - | FileCheck --check-prefix=SHARED %s 91 // SHARED-DAG: @bar = external global i32 92 // SHARED-DAG: @weak_bar = extern_weak global i32 93 // SHARED-DAG: declare void @foo() 94 // SHARED-DAG: @baz = global i32 42 95 // SHARED-DAG: define i32* @zed() 96 // SHARED-DAG: @thread_var = external thread_local global i32 97 // SHARED-DAG: @local_thread_var = thread_local global i32 42 98 99 int baz = 42; 100 __attribute__((dllimport)) extern int import_var; 101 __attribute__((weak)) extern int weak_bar; 102 extern int bar; 103 __attribute__((dllimport)) void import_func(void); 104 105 int *use_import() { 106 import_func(); 107 return &import_var; 108 } 109 110 void foo(void); 111 112 int *zed() { 113 foo(); 114 return baz ? &weak_bar : &bar; 115 } 116 117 __thread int local_thread_var = 42; 118 extern __thread int thread_var; 119 int *get_thread_var(int a) { 120 return a ? &thread_var : &local_thread_var; 121 } 122