155 lines · c
1// RUN: %clang_cc1 -triple x86_64-pc-win32 -emit-llvm %s -o - | FileCheck --check-prefix=COFF %s2// COFF: @baz = dso_local global i32 423// COFF-NEXT: @import_var = external dllimport global i324// COFF-NEXT: @weak_bar = extern_weak global i325// COFF-NEXT: @bar = external dso_local global i326// COFF-NEXT: @local_thread_var = dso_local thread_local global i32 427// COFF-NEXT: @thread_var = external dso_local thread_local global i328// COFF-DAG: declare dso_local void @foo()9// COFF-DAG: define dso_local ptr @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-prefixes=MINGW,MINGW-NATIVE_TLS,MINGW-AUTO-IMPORT %s13// RUN: %clang_cc1 -triple x86_64-w64-mingw32 -emit-llvm %s -o - -fno-auto-import | FileCheck --check-prefixes=MINGW,MINGW-NATIVE_TLS,MINGW-NO-AUTO-IMPORT %s14// RUN: %clang_cc1 -triple x86_64-w64-mingw32 -emit-llvm %s -o - -femulated-tls | FileCheck --check-prefixes=MINGW,MINGW-EMUTLS,MINGW-AUTO-IMPORT %s15// RUN: %clang_cc1 -triple x86_64-pc-cygwin -emit-llvm %s -o - | FileCheck --check-prefixes=MINGW,MINGW-NATIVE_TLS,MINGW-AUTO-IMPORT %s16// RUN: %clang_cc1 -triple x86_64-pc-cygwin -emit-llvm %s -o - -fno-auto-import | FileCheck --check-prefixes=MINGW,MINGW-NATIVE_TLS,MINGW-NO-AUTO-IMPORT %s17// RUN: %clang_cc1 -triple x86_64-pc-cygwin -emit-llvm %s -o - -femulated-tls | FileCheck --check-prefixes=MINGW,MINGW-EMUTLS,MINGW-AUTO-IMPORT %s18// MINGW: @baz = dso_local global i32 4219// MINGW-NEXT: @import_var = external dllimport global i3220// MINGW-NEXT: @weak_bar = extern_weak global i3221// MINGW-AUTO-IMPORT-NEXT: @bar = external global i3222// MINGW-NO-AUTO-IMPORT-NEXT: @bar = external dso_local global i3223// MINGW-NEXT: @local_thread_var = dso_local thread_local global i32 4224// MINGW-NATIVE_TLS-NEXT: @thread_var = external dso_local thread_local global i3225// MINGW-EMUTLS-NEXT: @thread_var = external thread_local global i3226// MINGW-DAG: declare dso_local void @foo()27// MINGW-DAG: define dso_local ptr @zed()28// MINGW-DAG: declare dllimport void @import_func()29 30/// Static relocation model defaults to -fdirect-access-external-data and sets31/// dso_local on most global objects.32// RUN: %clang_cc1 -triple x86_64 -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=STATIC %s33// RUN: %clang_cc1 -triple x86_64 -emit-llvm -mrelocation-model static -fdirect-access-external-data %s -o - | FileCheck --check-prefix=STATIC %s34// STATIC: @baz = dso_local global i32 4235// STATIC-NEXT: @import_var = external dso_local global i3236// STATIC-NEXT: @weak_bar = extern_weak dso_local global i3237// STATIC-NEXT: @bar = external dso_local global i3238// STATIC-NEXT: @local_thread_var = dso_local thread_local global i32 4239// STATIC-NEXT: @thread_var = external thread_local global i3240// STATIC-DAG: declare dso_local void @foo()41// STATIC-DAG: define dso_local ptr @zed()42// STATIC-DAG: declare dso_local void @import_func()43 44// STATIC-NOT: !"direct-access-external-data"45 46/// If -fno-direct-access-external-data is set, drop dso_local from global variable47/// declarations.48// RUN: %clang_cc1 -triple x86_64 -emit-llvm %s -mrelocation-model static -fno-direct-access-external-data -o - | FileCheck --check-prefix=STATIC-INDIRECT %s49// STATIC-INDIRECT: @baz = dso_local global i32 4250// STATIC-INDIRECT-NEXT: @import_var = external global i3251// STATIC-INDIRECT-NEXT: @weak_bar = extern_weak global i3252// STATIC-INDIRECT-NEXT: @bar = external global i3253// STATIC-INDIRECT-NEXT: @local_thread_var = dso_local thread_local global i32 4254// STATIC-INDIRECT-NEXT: @thread_var = external thread_local global i3255// STATIC-INDIRECT-DAG: declare void @import_func()56// STATIC-INDIRECT-DAG: define dso_local ptr @zed()57// STATIC-INDIRECT-DAG: declare void @foo()58 59// STATIC-INDIRECT: ![[#]] = !{i32 7, !"direct-access-external-data", i32 0}60 61// RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie %s -o - | FileCheck --check-prefix=PIE %s62// PIE: @baz = dso_local global i32 4263// PIE-NEXT: @import_var = external global i3264// PIE-NEXT: @weak_bar = extern_weak global i3265// PIE-NEXT: @bar = external global i3266// PIE-NEXT: @local_thread_var = dso_local thread_local global i32 4267// PIE-NEXT: @thread_var = external thread_local global i3268// PIE-DAG: declare void @foo()69// PIE-DAG: define dso_local ptr @zed()70// PIE-DAG: declare void @import_func()71 72// PIE-NOT: !"direct-access-external-data"73 74// RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie -fdirect-access-external-data %s -o - | FileCheck --check-prefix=PIE-DIRECT %s75// PIE-DIRECT: @baz = dso_local global i32 4276// PIE-DIRECT-NEXT: @import_var = external dso_local global i3277// PIE-DIRECT-NEXT: @weak_bar = extern_weak global i3278// PIE-DIRECT-NEXT: @bar = external dso_local global i3279// PIE-DIRECT-NEXT: @local_thread_var = dso_local thread_local global i32 4280// PIE-DIRECT-NEXT: @thread_var = external thread_local global i3281// PIE-DIRECT-DAG: declare void @foo()82// PIE-DIRECT-DAG: define dso_local ptr @zed()83// PIE-DIRECT-DAG: declare void @import_func()84 85// PIE-DIRECT: ![[#]] = !{i32 7, !"direct-access-external-data", i32 1}86 87// RUN: %clang_cc1 -triple x86_64 -emit-llvm -mrelocation-model static -fno-plt %s -o - | FileCheck --check-prefix=NOPLT %s88// NOPLT: @baz = dso_local global i32 4289// NOPLT-NEXT: @import_var = external dso_local global i3290// NOPLT-NEXT: @weak_bar = extern_weak dso_local global i3291// NOPLT-NEXT: @bar = external dso_local global i3292// NOPLT-NEXT: @local_thread_var = dso_local thread_local global i32 4293// NOPLT-NEXT: @thread_var = external thread_local global i3294// NOPLT-DAG: declare void @foo()95// NOPLT-DAG: define dso_local ptr @zed()96// NOPLT-DAG: declare void @import_func()97 98// RUN: %clang_cc1 -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 %s99// PIE-DIRECT-NOPLT: @baz = dso_local global i32 42100// PIE-DIRECT-NOPLT-NEXT: @import_var = external dso_local global i32101// PIE-DIRECT-NOPLT-NEXT: @weak_bar = extern_weak global i32102// PIE-DIRECT-NOPLT-NEXT: @bar = external dso_local global i32103// PIE-DIRECT-NOPLT-NEXT: @local_thread_var = dso_local thread_local global i32 42104// PIE-DIRECT-NOPLT-NEXT: @thread_var = external thread_local global i32105// PIE-DIRECT-NOPLT-DAG: declare void @foo()106// PIE-DIRECT-NOPLT-DAG: define dso_local ptr @zed()107// PIE-DIRECT-NOPLT-DAG: declare void @import_func()108 109// RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 1 -pic-is-pie -fno-plt %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s110// RUN: %clang_cc1 -triple powerpc64le -emit-llvm -mrelocation-model static %s -o - | FileCheck --check-prefix=PIE-NO-PLT %s111// PIE-NO-PLT: @baz = dso_local global i32 42112// PIE-NO-PLT-NEXT: @import_var = external global i32113// PIE-NO-PLT-NEXT: @weak_bar = extern_weak global i32114// PIE-NO-PLT-NEXT: @bar = external global i32115// PIE-NO-PLT-NEXT: @local_thread_var = dso_local thread_local global i32 42116// PIE-NO-PLT-NEXT: @thread_var = external thread_local global i32117// PIE-NO-PLT-DAG: declare void @import_func()118// PIE-NO-PLT-DAG: define dso_local ptr @zed()119// PIE-NO-PLT-DAG: declare void @foo()120 121/// -fdirect-access-external-data is currently ignored for -fPIC.122// RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 2 %s -o - | FileCheck --check-prefix=SHARED %s123// RUN: %clang_cc1 -triple x86_64 -emit-llvm -pic-level 2 -fdirect-access-external-data %s -o - | FileCheck --check-prefix=SHARED %s124// SHARED-DAG: @bar = external global i32125// SHARED-DAG: @weak_bar = extern_weak global i32126// SHARED-DAG: declare void @foo()127// SHARED-DAG: @baz ={{.*}} global i32 42128// SHARED-DAG: define{{.*}} ptr @zed()129// SHARED-DAG: @thread_var = external thread_local global i32130// SHARED-DAG: @local_thread_var ={{.*}} thread_local global i32 42131 132int baz = 42;133__attribute__((dllimport)) extern int import_var;134__attribute__((weak)) extern int weak_bar;135extern int bar;136__attribute__((dllimport)) void import_func(void);137 138int *use_import(void) {139 import_func();140 return &import_var;141}142 143void foo(void);144 145int *zed(void) {146 foo();147 return baz ? &weak_bar : &bar;148}149 150__thread int local_thread_var = 42;151extern __thread int thread_var;152int *get_thread_var(int a) {153 return a ? &thread_var : &local_thread_var;154}155