Skip to content
This repository was archived by the owner on Dec 20, 2019. It is now read-only.

Commit 13ba2b0

Browse files
committed
LDC: Custom emulated TLS for AArch64-Android
1 parent 7798278 commit 13ba2b0

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

lib/Target/AArch64/AArch64ISelLowering.cpp

+31-2
Original file line numberDiff line numberDiff line change
@@ -3968,6 +3968,31 @@ AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op,
39683968
return DAG.getNode(ISD::ADD, DL, PtrVT, ThreadBase, TPOff);
39693969
}
39703970

3971+
SDValue
3972+
AArch64TargetLowering::LowerAndroidGlobalTLSAddress(SDValue Op,
3973+
SelectionDAG &DAG) const {
3974+
assert(Subtarget->isTargetELF() && "This function expects an ELF target");
3975+
SDLoc DL(Op);
3976+
SDValue Result = LowerGlobalAddress(Op, DAG);
3977+
SDValue Chain = DAG.getEntryNode();
3978+
ArgListTy Args;
3979+
ArgListEntry Entry;
3980+
Type *Ty = (Type *)Type::getInt64Ty(*DAG.getContext());
3981+
Entry.Node = Result;
3982+
Entry.Ty = Ty;
3983+
Args.push_back(Entry);
3984+
3985+
// copied, modified from ARMTargetLowering::LowerToTLSGeneralDynamicModel
3986+
TargetLowering::CallLoweringInfo CLI(DAG);
3987+
CLI.setDebugLoc(DL).setChain(Chain).setLibCallee(
3988+
CallingConv::C, Ty,
3989+
DAG.getExternalSymbol("__tls_get_addr",
3990+
getPointerTy(DAG.getDataLayout())),
3991+
std::move(Args));
3992+
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
3993+
return CallResult.first;
3994+
}
3995+
39713996
SDValue AArch64TargetLowering::LowerGlobalTLSAddress(SDValue Op,
39723997
SelectionDAG &DAG) const {
39733998
const GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
@@ -3976,8 +4001,12 @@ SDValue AArch64TargetLowering::LowerGlobalTLSAddress(SDValue Op,
39764001

39774002
if (Subtarget->isTargetDarwin())
39784003
return LowerDarwinGlobalTLSAddress(Op, DAG);
3979-
if (Subtarget->isTargetELF())
3980-
return LowerELFGlobalTLSAddress(Op, DAG);
4004+
if (Subtarget->isTargetELF()) {
4005+
if (Subtarget->isTargetAndroid())
4006+
return LowerAndroidGlobalTLSAddress(Op, DAG); // LDC
4007+
else
4008+
return LowerELFGlobalTLSAddress(Op, DAG);
4009+
}
39814010

39824011
llvm_unreachable("Unexpected platform trying to use TLS");
39834012
}

lib/Target/AArch64/AArch64ISelLowering.h

+1
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ class AArch64TargetLowering : public TargetLowering {
547547
SDValue getAddr(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
548548
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
549549
SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
550+
SDValue LowerAndroidGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; // LDC
550551
SDValue LowerDarwinGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
551552
SDValue LowerELFGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
552553
SDValue LowerELFTLSDescCallSeq(SDValue SymAddr, const SDLoc &DL,

lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#include "AArch64MCExpr.h"
16+
#include "llvm/MC/MCAssembler.h" // LDC
1617
#include "llvm/MC/MCContext.h"
18+
#include "llvm/MC/MCObjectFileInfo.h" // LDC
1719
#include "llvm/MC/MCStreamer.h"
1820
#include "llvm/MC/MCSymbolELF.h"
1921
#include "llvm/MC/MCValue.h"
@@ -120,7 +122,12 @@ static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
120122
// We're known to be under a TLS fixup, so any symbol should be
121123
// modified. There should be only one.
122124
const MCSymbolRefExpr &SymRef = *cast<MCSymbolRefExpr>(Expr);
123-
cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS);
125+
// LDC
126+
{
127+
auto ofi = Asm.getContext().getObjectFileInfo();
128+
if (!(ofi && ofi->getTargetTriple().isAndroid()))
129+
cast<MCSymbolELF>(SymRef.getSymbol()).setType(ELF::STT_TLS);
130+
}
124131
break;
125132
}
126133

0 commit comments

Comments
 (0)