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