@@ -18515,17 +18515,17 @@ X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const {
18515
18515
return LowerGlobalOrExternal(Op, DAG, /*ForCall=*/false);
18516
18516
}
18517
18517
18518
- static SDValue
18519
- GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18520
- SDValue *InGlue, const EVT PtrVT, unsigned ReturnReg,
18521
- unsigned char OperandFlags, bool LocalDynamic = false) {
18518
+ static SDValue GetTLSADDR(SelectionDAG &DAG, SDValue Chain,
18519
+ GlobalAddressSDNode *GA, SDValue *InGlue,
18520
+ const EVT PtrVT, unsigned ReturnReg,
18521
+ unsigned char OperandFlags, bool UseTLSDESC = false,
18522
+ bool LocalDynamic = false) {
18522
18523
MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo();
18523
18524
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
18524
18525
SDLoc dl(GA);
18525
- SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(), dl,
18526
- GA->getValueType(0),
18527
- GA->getOffset(),
18528
- OperandFlags);
18526
+ SDValue TGA = DAG.getTargetGlobalAddress(
18527
+ GA->getGlobal(), dl, GA->getValueType(0), GA->getOffset(),
18528
+ UseTLSDESC ? X86II::MO_TLSDESC : OperandFlags);
18529
18529
18530
18530
X86ISD::NodeType CallType = LocalDynamic ? X86ISD::TLSBASEADDR
18531
18531
: X86ISD::TLSADDR;
@@ -18543,37 +18543,54 @@ GetTLSADDR(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA,
18543
18543
MFI.setHasCalls(true);
18544
18544
18545
18545
SDValue Glue = Chain.getValue(1);
18546
- return DAG.getCopyFromReg(Chain, dl, ReturnReg, PtrVT, Glue);
18546
+ SDValue Ret = DAG.getCopyFromReg(Chain, dl, ReturnReg, PtrVT, Glue);
18547
+
18548
+ if (!UseTLSDESC)
18549
+ return Ret;
18550
+
18551
+ const X86Subtarget &Subtarget = DAG.getSubtarget<X86Subtarget>();
18552
+ MVT VT = Subtarget.isTarget64BitLP64() ? MVT::i64 : MVT::i32;
18553
+ unsigned Seg = Subtarget.is64Bit() ? X86AS::FS : X86AS::GS;
18554
+
18555
+ Value *Ptr = Constant::getNullValue(PointerType::get(*DAG.getContext(), Seg));
18556
+ SDValue Offset =
18557
+ DAG.getLoad(VT, dl, DAG.getEntryNode(), DAG.getIntPtrConstant(0, dl),
18558
+ MachinePointerInfo(Ptr));
18559
+ return DAG.getNode(ISD::ADD, dl, VT, Ret, Offset);
18547
18560
}
18548
18561
18549
18562
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 32 bit
18550
- static SDValue
18551
- LowerToTLSGeneralDynamicModel32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18552
- const EVT PtrVT) {
18563
+ static SDValue LowerToTLSGeneralDynamicModel32(GlobalAddressSDNode *GA,
18564
+ SelectionDAG &DAG,
18565
+ const EVT PtrVT,
18566
+ bool UseTLSDESC) {
18553
18567
SDValue InGlue;
18554
18568
SDLoc dl(GA); // ? function entry point might be better
18555
18569
SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
18556
18570
DAG.getNode(X86ISD::GlobalBaseReg,
18557
18571
SDLoc(), PtrVT), InGlue);
18558
18572
InGlue = Chain.getValue(1);
18559
18573
18560
- return GetTLSADDR(DAG, Chain, GA, &InGlue, PtrVT, X86::EAX, X86II::MO_TLSGD);
18574
+ return GetTLSADDR(DAG, Chain, GA, &InGlue, PtrVT, X86::EAX, X86II::MO_TLSGD,
18575
+ UseTLSDESC);
18561
18576
}
18562
18577
18563
18578
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit LP64
18564
- static SDValue
18565
- LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18566
- const EVT PtrVT) {
18567
- return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT,
18568
- X86::RAX, X86II::MO_TLSGD);
18579
+ static SDValue LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA,
18580
+ SelectionDAG &DAG,
18581
+ const EVT PtrVT,
18582
+ bool UseTLSDESC) {
18583
+ return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT, X86::RAX,
18584
+ X86II::MO_TLSGD, UseTLSDESC);
18569
18585
}
18570
18586
18571
18587
// Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit ILP32
18572
- static SDValue
18573
- LowerToTLSGeneralDynamicModelX32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
18574
- const EVT PtrVT) {
18575
- return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT,
18576
- X86::EAX, X86II::MO_TLSGD);
18588
+ static SDValue LowerToTLSGeneralDynamicModelX32(GlobalAddressSDNode *GA,
18589
+ SelectionDAG &DAG,
18590
+ const EVT PtrVT,
18591
+ bool UseTLSDESC) {
18592
+ return GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT, X86::EAX,
18593
+ X86II::MO_TLSGD, UseTLSDESC);
18577
18594
}
18578
18595
18579
18596
static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
@@ -18590,14 +18607,16 @@ static SDValue LowerToTLSLocalDynamicModel(GlobalAddressSDNode *GA,
18590
18607
if (Is64Bit) {
18591
18608
unsigned ReturnReg = Is64BitLP64 ? X86::RAX : X86::EAX;
18592
18609
Base = GetTLSADDR(DAG, DAG.getEntryNode(), GA, nullptr, PtrVT, ReturnReg,
18593
- X86II::MO_TLSLD, /*LocalDynamic=*/true);
18610
+ X86II::MO_TLSLD, /*UseTLSDESC=*/false,
18611
+ /*LocalDynamic=*/true);
18594
18612
} else {
18595
18613
SDValue InGlue;
18596
18614
SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
18597
18615
DAG.getNode(X86ISD::GlobalBaseReg, SDLoc(), PtrVT), InGlue);
18598
18616
InGlue = Chain.getValue(1);
18599
18617
Base = GetTLSADDR(DAG, Chain, GA, &InGlue, PtrVT, X86::EAX,
18600
- X86II::MO_TLSLDM, /*LocalDynamic=*/true);
18618
+ X86II::MO_TLSLDM, /*UseTLSDESC=*/false,
18619
+ /*LocalDynamic=*/true);
18601
18620
}
18602
18621
18603
18622
// Note: the CleanupLocalDynamicTLSPass will remove redundant computations
@@ -18684,21 +18703,26 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
18684
18703
18685
18704
if (Subtarget.isTargetELF()) {
18686
18705
TLSModel::Model model = DAG.getTarget().getTLSModel(GV);
18706
+ bool UseTLSDESC = DAG.getTarget().useTLSDESC();
18687
18707
switch (model) {
18688
- case TLSModel::GeneralDynamic:
18689
- if (Subtarget.is64Bit()) {
18690
- if (Subtarget.isTarget64BitLP64())
18691
- return LowerToTLSGeneralDynamicModel64(GA, DAG, PtrVT);
18692
- return LowerToTLSGeneralDynamicModelX32(GA, DAG, PtrVT);
18693
- }
18694
- return LowerToTLSGeneralDynamicModel32(GA, DAG, PtrVT);
18695
- case TLSModel::LocalDynamic:
18708
+ case TLSModel::LocalDynamic:
18709
+ if (!UseTLSDESC)
18696
18710
return LowerToTLSLocalDynamicModel(GA, DAG, PtrVT, Subtarget.is64Bit(),
18697
18711
Subtarget.isTarget64BitLP64());
18698
- case TLSModel::InitialExec:
18699
- case TLSModel::LocalExec:
18700
- return LowerToTLSExecModel(GA, DAG, PtrVT, model, Subtarget.is64Bit(),
18701
- PositionIndependent);
18712
+ [[fallthrough]];
18713
+ case TLSModel::GeneralDynamic:
18714
+ if (Subtarget.is64Bit()) {
18715
+ if (Subtarget.isTarget64BitLP64()) {
18716
+ // auto PtrVT = getPointerTy(DAG.getDataLayout(), X86AS::FS);
18717
+ return LowerToTLSGeneralDynamicModel64(GA, DAG, PtrVT, UseTLSDESC);
18718
+ }
18719
+ return LowerToTLSGeneralDynamicModelX32(GA, DAG, PtrVT, UseTLSDESC);
18720
+ }
18721
+ return LowerToTLSGeneralDynamicModel32(GA, DAG, PtrVT, UseTLSDESC);
18722
+ case TLSModel::InitialExec:
18723
+ case TLSModel::LocalExec:
18724
+ return LowerToTLSExecModel(GA, DAG, PtrVT, model, Subtarget.is64Bit(),
18725
+ PositionIndependent);
18702
18726
}
18703
18727
llvm_unreachable("Unknown TLS model.");
18704
18728
}
0 commit comments