1 // RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=STATIC %s 2 // STATIC-DAG: @bar = external dso_local global i32 3 // STATIC-DAG: @weak_bar = extern_weak dso_local global i32 4 // STATIC-DAG: declare dso_local void @foo() 5 // STATIC-DAG: @baz = dso_local global i32 42 6 // STATIC-DAG: define dso_local i32* @zed() 7 // STATIC-DAG: @thread_var = external thread_local global i32 8 // STATIC-DAG: @local_thread_var = dso_local thread_local global i32 42 9 10 // RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm -pic-is-pie -mpie-copy-relocations %s -o - | FileCheck --check-prefix=PIE-COPY %s 11 // PIE-COPY-DAG: @bar = external dso_local global i32 12 // PIE-COPY-DAG: @weak_bar = extern_weak global i32 13 // PIE-COPY-DAG: declare void @foo() 14 // PIE-COPY-DAG: @baz = dso_local global i32 42 15 // PIE-COPY-DAG: define dso_local i32* @zed() 16 // PIE-COPY-DAG: @thread_var = external thread_local global i32 17 // PIE-COPY-DAG: @local_thread_var = dso_local thread_local global i32 42 18 19 // RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm -pic-is-pie %s -o - | FileCheck --check-prefix=PIE %s 20 // PIE-DAG: @bar = external global i32 21 // PIE-DAG: @weak_bar = extern_weak global i32 22 // PIE-DAG: declare void @foo() 23 // PIE-DAG: @baz = dso_local global i32 42 24 // PIE-DAG: define dso_local i32* @zed() 25 // PIE-DAG: @thread_var = external thread_local global i32 26 // PIE-DAG: @local_thread_var = dso_local thread_local global i32 42 27 28 // RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm -mrelocation-model static -fno-plt %s -o - | FileCheck --check-prefix=NOPLT %s 29 // NOPLT-DAG: @bar = external dso_local global i32 30 // NOPLT-DAG: @weak_bar = extern_weak dso_local global i32 31 // NOPLT-DAG: declare void @foo() 32 // NOPLT-DAG: @baz = dso_local global i32 42 33 // NOPLT-DAG: define dso_local i32* @zed() 34 // NOPLT-DAG: @thread_var = external thread_local global i32 35 // NOPLT-DAG: @local_thread_var = dso_local thread_local global i32 42 36 37 // 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 38 // PIE-COPY-NOPLT-DAG: @bar = external dso_local global i32 39 // PIE-COPY-NOPLT-DAG: @weak_bar = extern_weak global i32 40 // PIE-COPY-NOPLT-DAG: declare void @foo() 41 // PIE-COPY-NOPLT-DAG: @baz = dso_local global i32 42 42 // PIE-COPY-NOPLT-DAG: define dso_local i32* @zed() 43 // PIE-COPY-NOPLT-DAG: @thread_var = external thread_local global i32 44 // PIE-COPY-NOPLT-DAG: @local_thread_var = dso_local thread_local global i32 42 45 46 // RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm -pic-is-pie -fno-plt %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s 47 // RUN: %clang_cc1 -triple powerpc64le-pc-linux -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s 48 // PIE-NO-PLT-DAG: @bar = external global i32 49 // PIE-NO-PLT-DAG: @weak_bar = extern_weak global i32 50 // PIE-NO-PLT-DAG: declare void @foo() 51 // PIE-NO-PLT-DAG: @baz = dso_local global i32 42 52 // PIE-NO-PLT-DAG: define dso_local i32* @zed() 53 // PIE-NO-PLT-DAG: @thread_var = external thread_local global i32 54 // PIE-NO-PLT-DAG: @local_thread_var = dso_local thread_local global i32 42 55 56 // RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm %s -o - | FileCheck --check-prefix=SHARED %s 57 // SHARED-DAG: @bar = external global i32 58 // SHARED-DAG: @weak_bar = extern_weak global i32 59 // SHARED-DAG: declare void @foo() 60 // SHARED-DAG: @baz = global i32 42 61 // SHARED-DAG: define i32* @zed() 62 // SHARED-DAG: @thread_var = external thread_local global i32 63 // SHARED-DAG: @local_thread_var = thread_local global i32 42 64 65 extern int bar; 66 __attribute__((weak)) extern int weak_bar; 67 void foo(void); 68 69 int baz = 42; 70 int *zed() { 71 foo(); 72 return baz ? &weak_bar : &bar; 73 } 74 75 extern __thread int thread_var; 76 __thread int local_thread_var = 42; 77 int *get_thread_var(int a) { 78 return a ? &thread_var : &local_thread_var; 79 } 80