Skip to content

Commit

Permalink
[TLS] use emulated TLS if the target supports only this mode
Browse files Browse the repository at this point in the history
Emulated TLS is enabled by llc flag -emulated-tls,
which is passed by clang driver.
When llc is called explicitly or from other drivers like LTO,
missing -emulated-tls flag would generate wrong TLS code for targets
that supports only this mode.
Now use useEmulatedTLS() instead of Options.EmulatedTLS to decide whether
emulated TLS code should be generated.
Unit tests are modified to run with and without the -emulated-tls flag.

Differential Revision: https://reviews.llvm.org/D42999

llvm-svn: 326341
  • Loading branch information
chih-hung committed Feb 28, 2018
1 parent 29abfe4 commit 9f9e468
Show file tree
Hide file tree
Showing 32 changed files with 133 additions and 15 deletions.
5 changes: 5 additions & 0 deletions llvm/include/llvm/ADT/Triple.h
Expand Up @@ -665,6 +665,11 @@ class Triple {
return !isOSBinFormatMachO();
}

/// Tests whether the target uses emulated TLS as default.
bool hasDefaultEmulatedTLS() const {
return isAndroid() || isOSOpenBSD() || isWindowsCygwinEnvironment();
}

/// @}
/// @name Mutators
/// @{
Expand Down
1 change: 1 addition & 0 deletions llvm/include/llvm/CodeGen/CommandFlags.def
Expand Up @@ -286,6 +286,7 @@ static TargetOptions InitTargetOptionsFromCodeGenFlags() {
Options.FunctionSections = FunctionSections;
Options.UniqueSectionNames = UniqueSectionNames;
Options.EmulatedTLS = EmulatedTLS;
Options.ExplicitEmulatedTLS = EmulatedTLS.getNumOccurrences() > 0;
Options.ExceptionModel = ExceptionModel;
Options.EmitStackSizeSection = EnableStackSizeSection;

Expand Down
3 changes: 3 additions & 0 deletions llvm/include/llvm/Target/TargetMachine.h
Expand Up @@ -172,6 +172,9 @@ class TargetMachine {

bool shouldAssumeDSOLocal(const Module &M, const GlobalValue *GV) const;

/// Returns true if this target uses emulated TLS.
bool useEmulatedTLS() const;

/// Returns the TLS model which should be used for the given global variable.
TLSModel::Model getTLSModel(const GlobalValue *GV) const;

Expand Down
6 changes: 5 additions & 1 deletion llvm/include/llvm/Target/TargetOptions.h
Expand Up @@ -107,7 +107,8 @@ namespace llvm {
EnableFastISel(false), EnableGlobalISel(false), UseInitArray(false),
DisableIntegratedAS(false), RelaxELFRelocations(false),
FunctionSections(false), DataSections(false),
UniqueSectionNames(true), TrapUnreachable(false), EmulatedTLS(false),
UniqueSectionNames(true), TrapUnreachable(false),
EmulatedTLS(false), ExplicitEmulatedTLS(false),
EnableIPRA(false), EmitStackSizeSection(false) {}

/// PrintMachineCode - This flag is enabled when the -print-machineinstrs
Expand Down Expand Up @@ -216,6 +217,9 @@ namespace llvm {
/// function in the runtime library..
unsigned EmulatedTLS : 1;

/// Whether -emulated-tls or -no-emulated-tls is set.
unsigned ExplicitEmulatedTLS : 1;

/// This flag enables InterProcedural Register Allocation (IPRA).
unsigned EnableIPRA : 1;

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Expand Up @@ -429,7 +429,7 @@ MCSymbol *AsmPrinter::getSymbol(const GlobalValue *GV) const {

/// EmitGlobalVariable - Emit the specified global variable to the .s file.
void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
bool IsEmuTLSVar = TM.Options.EmulatedTLS && GV->isThreadLocal();
bool IsEmuTLSVar = TM.useEmulatedTLS() && GV->isThreadLocal();
assert(!(IsEmuTLSVar && GV->hasCommonLinkage()) &&
"No emulated TLS variables in the common section");

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
Expand Up @@ -198,7 +198,7 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(
if (Global) {
const MCSymbol *Sym = Asm->getSymbol(Global);
if (Global->isThreadLocal()) {
if (Asm->TM.Options.EmulatedTLS) {
if (Asm->TM.useEmulatedTLS()) {
// TODO: add debug info for emulated thread local mode.
} else {
// FIXME: Make this work with -gsplit-dwarf.
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/LowerEmuTLS.cpp
Expand Up @@ -68,7 +68,7 @@ bool LowerEmuTLS::runOnModule(Module &M) {
return false;

auto &TM = TPC->getTM<TargetMachine>();
if (!TM.Options.EmulatedTLS)
if (!TM.useEmulatedTLS())
return false;

bool Changed = false;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/TargetPassConfig.cpp
Expand Up @@ -748,7 +748,7 @@ bool TargetPassConfig::addCoreISelPasses() {
}

bool TargetPassConfig::addISelPasses() {
if (TM->Options.EmulatedTLS)
if (TM->useEmulatedTLS())
addPass(createLowerEmuTLSPass());

addPass(createPreISelIntrinsicLoweringPass());
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/ExecutionEngine/TargetSelect.cpp
Expand Up @@ -97,6 +97,8 @@ TargetMachine *EngineBuilder::selectTarget(const Triple &TargetTriple,
Options, RelocModel, CMModel, OptLevel,
/*JIT*/ true);
Target->Options.EmulatedTLS = EmulatedTLS;
Target->Options.ExplicitEmulatedTLS = true;

assert(Target && "Could not allocate target machine!");
return Target;
}
2 changes: 1 addition & 1 deletion llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Expand Up @@ -3979,7 +3979,7 @@ AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op,
SDValue AArch64TargetLowering::LowerGlobalTLSAddress(SDValue Op,
SelectionDAG &DAG) const {
const GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
if (DAG.getTarget().Options.EmulatedTLS)
if (DAG.getTarget().useEmulatedTLS())
return LowerToTLSEmulatedModel(GA, DAG);

if (Subtarget->isTargetDarwin())
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/ARM/ARMISelLowering.cpp
Expand Up @@ -3005,7 +3005,7 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
SDValue
ARMTargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
if (DAG.getTarget().Options.EmulatedTLS)
if (DAG.getTarget().useEmulatedTLS())
return LowerToTLSEmulatedModel(GA, DAG);

if (Subtarget->isTargetDarwin())
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/Mips/MipsISelLowering.cpp
Expand Up @@ -2069,7 +2069,7 @@ lowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
// Local Exec TLS Model.

GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
if (DAG.getTarget().Options.EmulatedTLS)
if (DAG.getTarget().useEmulatedTLS())
return LowerToTLSEmulatedModel(GA, DAG);

SDLoc DL(GA);
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/PowerPC/PPCISelLowering.cpp
Expand Up @@ -2571,7 +2571,7 @@ SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op,
// large models could be added if users need it, at the cost of
// additional complexity.
GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
if (DAG.getTarget().Options.EmulatedTLS)
if (DAG.getTarget().useEmulatedTLS())
return LowerToTLSEmulatedModel(GA, DAG);

SDLoc dl(GA);
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/Sparc/SparcISelLowering.cpp
Expand Up @@ -2036,7 +2036,7 @@ SDValue SparcTargetLowering::LowerGlobalTLSAddress(SDValue Op,
SelectionDAG &DAG) const {

GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
if (DAG.getTarget().Options.EmulatedTLS)
if (DAG.getTarget().useEmulatedTLS())
return LowerToTLSEmulatedModel(GA, DAG);

SDLoc DL(GA);
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
Expand Up @@ -2663,7 +2663,7 @@ SDValue SystemZTargetLowering::lowerThreadPointer(const SDLoc &DL,

SDValue SystemZTargetLowering::lowerGlobalTLSAddress(GlobalAddressSDNode *Node,
SelectionDAG &DAG) const {
if (DAG.getTarget().Options.EmulatedTLS)
if (DAG.getTarget().useEmulatedTLS())
return LowerToTLSEmulatedModel(Node, DAG);
SDLoc DL(Node);
const GlobalValue *GV = Node->getGlobal();
Expand Down
8 changes: 8 additions & 0 deletions llvm/lib/Target/TargetMachine.cpp
Expand Up @@ -192,6 +192,14 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
return false;
}

bool TargetMachine::useEmulatedTLS() const {
// Returns Options.EmulatedTLS if the -emulated-tls or -no-emulated-tls
// was specified explicitly; otherwise uses target triple to decide default.
if (Options.ExplicitEmulatedTLS)
return Options.EmulatedTLS;
return getTargetTriple().hasDefaultEmulatedTLS();
}

TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const {
bool IsPIE = GV->getParent()->getPIELevel() != PIELevel::Default;
Reloc::Model RM = getRelocationModel();
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/X86/X86ISelLowering.cpp
Expand Up @@ -15638,7 +15638,7 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {

GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);

if (DAG.getTarget().Options.EmulatedTLS)
if (DAG.getTarget().useEmulatedTLS())
return LowerToTLSEmulatedModel(GA, DAG);

const GlobalValue *GV = GA->getGlobal();
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/AArch64/emutls.ll
@@ -1,5 +1,7 @@
; RUN: llc -emulated-tls -mtriple=aarch64-linux-android \
; RUN: -relocation-model=pic -disable-fp-elim < %s | FileCheck -check-prefix=ARM64 %s
; RUN: llc -mtriple=aarch64-linux-android \
; RUN: -relocation-model=pic -disable-fp-elim < %s | FileCheck -check-prefix=ARM64 %s

; Copied from X86/emutls.ll

Expand Down
12 changes: 12 additions & 0 deletions llvm/test/CodeGen/AArch64/emutls_generic.ll
Expand Up @@ -9,6 +9,18 @@
; RUN: llc < %s -emulated-tls -mtriple=aarch64-apple-darwin -O3 \
; RUN: | FileCheck -check-prefix=DARWIN %s

; RUN: llc < %s -mtriple=aarch64-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=ARM_64 %s
; RUN: llc < %s -mtriple=aarch64-linux-android -relocation-model=pic -O3 \
; RUN: | FileCheck -check-prefix=ARM_64 %s
; RUN: llc < %s -mtriple=aarch64-linux-android -O3 \
; RUN: | FileCheck -check-prefix=ARM_64 %s
; aarch64-windows-gnu needs explicit -emulated-tls
; RUN: llc < %s -mtriple=aarch64-apple-darwin -O3 \
; RUN: | FileCheck -check-prefix=NoEMU %s

; NoEMU-NOT: __emutls

; Make sure that TLS symbols are emitted in expected order.

@external_x = external thread_local global i32, align 8
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/ARM/emutls.ll
@@ -1,5 +1,7 @@
; RUN: llc -emulated-tls -mtriple=arm-linux-android \
; RUN: -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %s
; RUN: llc -mtriple=arm-linux-android \
; RUN: -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %s

; Copied from X86/emutls.ll

Expand Down
11 changes: 11 additions & 0 deletions llvm/test/CodeGen/ARM/emutls_generic.ll
Expand Up @@ -11,6 +11,17 @@
; RUN: llc < %s -emulated-tls -mtriple=thumbv7-windows-gnu -O3 \
; RUN: | FileCheck -check-prefix=WIN %s

; RUN: llc < %s -mtriple=arm-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=ARM_32 %s
; RUN: llc < %s -mtriple=arm-linux-androidabi -relocation-model=pic \
; RUN: | FileCheck -check-prefix=ARM_32 %s
; RUN: llc < %s -mtriple=arm-linux-androidabi -relocation-model=pic -O3 \
; RUN: | FileCheck -check-prefix=ARM_32 %s
; RUN: llc < %s -mtriple=arm-linux-androidabi -O3 \
; RUN: | FileCheck -check-prefix=ARM_32 %s
; arm-apple-darwin must use -emulated-tls
; windows must use -emulated-tls

; Make sure that TLS symbols are emitted in expected order.

@external_x = external thread_local global i32, align 8
Expand Down
5 changes: 5 additions & 0 deletions llvm/test/CodeGen/Mips/emutls_generic.ll
Expand Up @@ -3,6 +3,11 @@
; RUN: llc < %s -emulated-tls -mtriple=mips64el-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=MIPS_64 %s

; RUN: llc < %s -mtriple=mipsel-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=MIPS_32 %s
; RUN: llc < %s -mtriple=mips64el-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=MIPS_64 %s

; Make sure that TLS symbols are emitted in expected order.

@external_x = external thread_local global i32, align 8
Expand Down
7 changes: 7 additions & 0 deletions llvm/test/CodeGen/PowerPC/emutls_generic.ll
Expand Up @@ -3,6 +3,13 @@
; RUN: llc < %s -emulated-tls -mtriple=powerpc-unknown-linux-gnu -relocation-model=pic \
; RUN: | FileCheck %s

; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=NoEMU %s
; RUN: llc < %s -mtriple=powerpc-unknown-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=NoEMU %s

; NoEMU-NOT: __emutls

; Make sure that TLS symbols are emitted in expected order.

@external_x = external thread_local global i32, align 8
Expand Down
7 changes: 7 additions & 0 deletions llvm/test/CodeGen/X86/emutls-pic.ll
Expand Up @@ -3,6 +3,13 @@
; RUN: llc < %s -emulated-tls -mtriple=i386-linux-android -relocation-model=pic | FileCheck -check-prefix=X32 %s
; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck -check-prefix=X64 %s

; RUN: llc < %s -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=NoEMU %s
; RUN: llc < %s -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=NoEMU %s
; RUN: llc < %s -mtriple=i386-linux-android -relocation-model=pic | FileCheck -check-prefix=X32 %s
; RUN: llc < %s -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck -check-prefix=X64 %s

; NoEMU-NOT: __emutls

; Use my_emutls_get_address like __emutls_get_address.
@my_emutls_v_xyz = external global i8*, align 4
declare i8* @my_emutls_get_address(i8*)
Expand Down
11 changes: 11 additions & 0 deletions llvm/test/CodeGen/X86/emutls-pie.ll
Expand Up @@ -7,6 +7,17 @@
; RUN: llc < %s -emulated-tls -mcpu=generic -mtriple=x86_64-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X64 %s

; RUN: llc < %s -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=NoEMU %s
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=NoEMU %s
; RUN: llc < %s -mcpu=generic -mtriple=i386-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X32 %s
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X64 %s

; NoEMU-NOT: __emutls

; Use my_emutls_get_address like __emutls_get_address.
@my_emutls_v_xyz = external global i8*, align 4
declare i8* @my_emutls_get_address(i8*)
Expand Down
9 changes: 8 additions & 1 deletion llvm/test/CodeGen/X86/emutls.ll
Expand Up @@ -3,8 +3,15 @@
; RUN: llc < %s -emulated-tls -mtriple=i386-linux-android | FileCheck -check-prefix=X32 %s
; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android | FileCheck -check-prefix=X64 %s

; RUN: llc < %s -mtriple=i386-linux-gnu | FileCheck -check-prefix=NoEMU %s
; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=NoEMU %s
; RUN: llc < %s -mtriple=i386-linux-android | FileCheck -check-prefix=X32 %s
; RUN: llc < %s -mtriple=x86_64-linux-android | FileCheck -check-prefix=X64 %s

; Copied from tls.ll; emulated TLS model is not implemented
; for *-pc-win32 and *-pc-winows targets yet.
; for *-pc-win32 and *-pc-windows targets yet.

; NoEMU-NOT: __emutls

; Use my_emutls_get_address like __emutls_get_address.
@my_emutls_v_xyz = external global i8*, align 4
Expand Down
11 changes: 11 additions & 0 deletions llvm/test/CodeGen/X86/emutls_generic.ll
Expand Up @@ -7,6 +7,17 @@
; RUN: llc < %s -emulated-tls -mtriple=i386-linux-gnu -relocation-model=pic \
; RUN: | FileCheck %s

; RUN: llc < %s -mtriple=i686-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X86_32 %s
; RUN: llc < %s -mtriple=i686-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X86_32 %s
; RUN: llc < %s -mtriple=x86_64-linux-android -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X86_64 %s
; RUN: llc < %s -mtriple=i386-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=NoEMU %s

; NoEMU-NOT: __emutls

; Make sure that TLS symbols are emitted in expected order.

@external_x = external thread_local global i32, align 8
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/CodeGen/X86/fast-isel-emutls.ll
@@ -1,6 +1,10 @@
; RUN: llc < %s -emulated-tls -relocation-model=pic -mtriple=i686-unknown-linux-gnu -fast-isel | FileCheck %s
; RUN: llc < %s -relocation-model=pic -mtriple=i686-unknown-linux-gnu -fast-isel \
; RUN: | FileCheck -check-prefix=NoEMU %s
; PR3654

; NoEMU-NOT: __emutls

@v = thread_local global i32 0
define i32 @f() nounwind {
entry:
Expand Down
7 changes: 6 additions & 1 deletion llvm/test/CodeGen/X86/global-access-pie-copyrelocs.ll
@@ -1,8 +1,13 @@
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -pie-copy-relocations \
; RUN: llc < %s -emulated-tls -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -pie-copy-relocations \
; RUN: | FileCheck -check-prefix=X64 %s
; RUN: llc < %s -emulated-tls -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -pie-copy-relocations \
; RUN: | FileCheck -check-prefix=X32 %s

; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -pie-copy-relocations \
; RUN: | FileCheck -check-prefix=X64 %s
; RUN: llc < %s -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -pie-copy-relocations \
; RUN: | FileCheck -check-prefix=X32 %s

; External Linkage
@a = global i32 0, align 4

Expand Down
7 changes: 6 additions & 1 deletion llvm/test/CodeGen/X86/global-access-pie.ll
@@ -1,8 +1,13 @@
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \
; RUN: llc < %s -emulated-tls -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X64 %s
; RUN: llc < %s -emulated-tls -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X32 %s

; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X64 %s
; RUN: llc < %s -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic \
; RUN: | FileCheck -check-prefix=X32 %s

; External Linkage
@a = global i32 0, align 4

Expand Down
3 changes: 3 additions & 0 deletions llvm/test/CodeGen/X86/tls-android-negative.ll
@@ -1,6 +1,9 @@
; RUN: llc < %s -emulated-tls -mtriple=i686-linux-android -relocation-model=pic | FileCheck %s
; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck %s

; RUN: llc < %s -mtriple=i686-linux-android -relocation-model=pic | FileCheck %s
; RUN: llc < %s -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck %s

; Make sure that some symboles are not emitted in emulated TLS model.

@external_x = external thread_local global i32
Expand Down
3 changes: 3 additions & 0 deletions llvm/test/CodeGen/X86/tls-android.ll
@@ -1,6 +1,9 @@
; RUN: llc < %s -emulated-tls -mtriple=i686-linux-android -relocation-model=pic | FileCheck %s
; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck -check-prefix=X64 %s

; RUN: llc < %s -mtriple=i686-linux-android -relocation-model=pic | FileCheck %s
; RUN: llc < %s -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck -check-prefix=X64 %s

; Make sure that TLS symboles are emitted in expected order.

@external_x = external thread_local global i32
Expand Down

0 comments on commit 9f9e468

Please sign in to comment.