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 125 int *use_import(void) { 126 import_func(); 127 return &import_var; 128 } 129 130 void foo(void); 131 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; 139 int *get_thread_var(int a) { 140 return a ? &thread_var : &local_thread_var; 141 } 142