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

Commit aaa4575

Browse files
authored
Merge pull request #3 from ldc-developers/tls
Rework emulated TLS patch for Android
2 parents e8183ac + ecba7c7 commit aaa4575

11 files changed

+49
-55
lines changed

include/llvm/CodeGen/TargetLowering.h

+3
Original file line numberDiff line numberDiff line change
@@ -3664,6 +3664,9 @@ class TargetLowering : public TargetLoweringBase {
36643664
virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA,
36653665
SelectionDAG &DAG) const;
36663666

3667+
SDValue LowerToAndroidEmulatedTLSAddress(SDValue Op, SDValue Result,
3668+
SelectionDAG &DAG, bool is64bit) const; // LDC
3669+
36673670
/// Expands target specific indirect branch for the case of JumpTable
36683671
/// expanasion.
36693672
virtual SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value, SDValue Addr,

lib/CodeGen/SelectionDAG/TargetLowering.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -4334,6 +4334,33 @@ SDValue TargetLowering::getVectorElementPointer(SelectionDAG &DAG,
43344334
return DAG.getNode(ISD::ADD, dl, IdxVT, VecPtr, Index);
43354335
}
43364336

4337+
SDValue
4338+
TargetLowering::LowerToAndroidEmulatedTLSAddress(SDValue Op, SDValue Result,
4339+
SelectionDAG &DAG, bool is64bit) const { // LDC
4340+
SDLoc DL(Op);
4341+
SDValue Chain = DAG.getEntryNode();
4342+
ArgListTy Args;
4343+
ArgListEntry Entry;
4344+
Type *Ty;
4345+
if (is64bit)
4346+
Ty = (Type *)Type::getInt64Ty(*DAG.getContext());
4347+
else
4348+
Ty = (Type *)Type::getInt32Ty(*DAG.getContext());
4349+
Entry.Node = Result;
4350+
Entry.Ty = Ty;
4351+
Args.push_back(Entry);
4352+
4353+
// copied, modified from ARMTargetLowering::LowerToTLSGeneralDynamicModel
4354+
TargetLowering::CallLoweringInfo CLI(DAG);
4355+
CLI.setDebugLoc(DL).setChain(Chain).setLibCallee(
4356+
CallingConv::C, Ty,
4357+
DAG.getExternalSymbol("__tls_get_addr",
4358+
getPointerTy(DAG.getDataLayout())),
4359+
std::move(Args));
4360+
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
4361+
return CallResult.first;
4362+
}
4363+
43374364
//===----------------------------------------------------------------------===//
43384365
// Implementation of Emulated TLS Model
43394366
//===----------------------------------------------------------------------===//

lib/CodeGen/TargetLoweringObjectFileImpl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ const MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference(
234234

235235
static SectionKind getELFKindForNamedSection(StringRef Name, SectionKind K,
236236
const Triple &TargetTriple) {
237-
// N.B.: The defaults used in here are no the same ones used in MC.
237+
// N.B.: The defaults used in here are not the same ones used in MC.
238238
// We follow gcc, MC follows gas. For example, given ".section .eh_frame",
239239
// both gas and MC will produce a section with no flags. Given
240240
// section(".eh_frame") gcc will produce:

lib/Target/AArch64/AArch64ISelLowering.cpp

+1-26
Original file line numberDiff line numberDiff line change
@@ -4149,31 +4149,6 @@ AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op,
41494149
return DAG.getNode(ISD::ADD, DL, PtrVT, ThreadBase, TPOff);
41504150
}
41514151

4152-
SDValue
4153-
AArch64TargetLowering::LowerAndroidGlobalTLSAddress(SDValue Op,
4154-
SelectionDAG &DAG) const {
4155-
assert(Subtarget->isTargetELF() && "This function expects an ELF target");
4156-
SDLoc DL(Op);
4157-
SDValue Result = LowerGlobalAddress(Op, DAG);
4158-
SDValue Chain = DAG.getEntryNode();
4159-
ArgListTy Args;
4160-
ArgListEntry Entry;
4161-
Type *Ty = (Type *)Type::getInt64Ty(*DAG.getContext());
4162-
Entry.Node = Result;
4163-
Entry.Ty = Ty;
4164-
Args.push_back(Entry);
4165-
4166-
// copied, modified from ARMTargetLowering::LowerToTLSGeneralDynamicModel
4167-
TargetLowering::CallLoweringInfo CLI(DAG);
4168-
CLI.setDebugLoc(DL).setChain(Chain).setLibCallee(
4169-
CallingConv::C, Ty,
4170-
DAG.getExternalSymbol("__tls_get_addr",
4171-
getPointerTy(DAG.getDataLayout())),
4172-
std::move(Args));
4173-
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
4174-
return CallResult.first;
4175-
}
4176-
41774152
SDValue
41784153
AArch64TargetLowering::LowerWindowsGlobalTLSAddress(SDValue Op,
41794154
SelectionDAG &DAG) const {
@@ -4243,7 +4218,7 @@ SDValue AArch64TargetLowering::LowerGlobalTLSAddress(SDValue Op,
42434218
return LowerDarwinGlobalTLSAddress(Op, DAG);
42444219
if (Subtarget->isTargetELF()) {
42454220
if (Subtarget->isTargetAndroid())
4246-
return LowerAndroidGlobalTLSAddress(Op, DAG); // LDC
4221+
return LowerToAndroidEmulatedTLSAddress(Op, LowerGlobalAddress(Op, DAG), DAG, true); // LDC
42474222
else
42484223
return LowerELFGlobalTLSAddress(Op, DAG);
42494224
}

lib/Target/AArch64/AArch64ISelLowering.h

-1
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,6 @@ class AArch64TargetLowering : public TargetLowering {
589589
SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
590590
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
591591
SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
592-
SDValue LowerAndroidGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; // LDC
593592
SDValue LowerDarwinGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
594593
SDValue LowerELFGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
595594
SDValue LowerELFTLSDescCallSeq(SDValue SymAddr, const SDLoc &DL,

lib/Target/ARM/ARMISelLowering.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -3018,6 +3018,8 @@ ARMTargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
30183018

30193019
// TODO: implement the "local dynamic" model
30203020
assert(Subtarget->isTargetELF() && "Only ELF implemented here");
3021+
if (Subtarget->isTargetAndroid())
3022+
return LowerToAndroidEmulatedTLSAddress(Op, LowerGlobalAddress(Op, DAG), DAG, false); // LDC
30213023
TLSModel::Model model = getTargetMachine().getTLSModel(GA->getGlobal());
30223024

30233025
switch (model) {

lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h

+2-6
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,15 @@ using namespace llvm;
1818

1919
namespace {
2020
class ARMAsmBackendELF : public ARMAsmBackend {
21-
// LDC
22-
const bool isAndroid;
23-
2421
public:
2522
uint8_t OSABI;
2623
ARMAsmBackendELF(const Target &T, const MCSubtargetInfo &STI, uint8_t OSABI,
2724
support::endianness Endian)
28-
: ARMAsmBackend(T, STI, Endian),
29-
isAndroid(STI.getTargetTriple().isAndroid()), OSABI(OSABI) {}
25+
: ARMAsmBackend(T, STI, Endian), OSABI(OSABI) {}
3026

3127
std::unique_ptr<MCObjectTargetWriter>
3228
createObjectTargetWriter() const override {
33-
return createARMELFObjectWriter(OSABI, isAndroid);
29+
return createARMELFObjectWriter(OSABI);
3430
}
3531
};
3632
}

lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp

+8-12
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,13 @@ using namespace llvm;
2525
namespace {
2626

2727
class ARMELFObjectWriter : public MCELFObjectTargetWriter {
28-
// LDC
29-
const bool isAndroid;
30-
3128
enum { DefaultEABIVersion = 0x05000000U };
3229

3330
unsigned GetRelocTypeInner(const MCValue &Target, const MCFixup &Fixup,
3431
bool IsPCRel, MCContext &Ctx) const;
3532

3633
public:
37-
ARMELFObjectWriter(uint8_t OSABI, bool IsAndroid);
34+
ARMELFObjectWriter(uint8_t OSABI);
3835

3936
~ARMELFObjectWriter() override = default;
4037

@@ -47,10 +44,10 @@ namespace {
4744

4845
} // end anonymous namespace
4946

50-
ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI, bool IsAndroid)
51-
: MCELFObjectTargetWriter(/*Is64Bit*/ false, OSABI, ELF::EM_ARM,
52-
/*HasRelocationAddend*/ false),
53-
isAndroid(IsAndroid) {}
47+
ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI)
48+
: MCELFObjectTargetWriter(/*Is64Bit*/ false, OSABI,
49+
ELF::EM_ARM,
50+
/*HasRelocationAddend*/ false) {}
5451

5552
bool ARMELFObjectWriter::needsRelocateWithSymbol(const MCSymbol &Sym,
5653
unsigned Type) const {
@@ -167,8 +164,7 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target,
167164
case MCSymbolRefExpr::VK_GOT:
168165
return ELF::R_ARM_GOT_BREL;
169166
case MCSymbolRefExpr::VK_TLSGD:
170-
// LDC
171-
return isAndroid ? ELF::R_ARM_GOT_PREL : ELF::R_ARM_TLS_GD32;
167+
return ELF::R_ARM_TLS_GD32;
172168
case MCSymbolRefExpr::VK_TPOFF:
173169
return ELF::R_ARM_TLS_LE32;
174170
case MCSymbolRefExpr::VK_GOTTPOFF:
@@ -241,6 +237,6 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target,
241237
}
242238

243239
std::unique_ptr<MCObjectTargetWriter>
244-
llvm::createARMELFObjectWriter(uint8_t OSABI, bool IsAndroid) {
245-
return llvm::make_unique<ARMELFObjectWriter>(OSABI, IsAndroid);
240+
llvm::createARMELFObjectWriter(uint8_t OSABI) {
241+
return llvm::make_unique<ARMELFObjectWriter>(OSABI);
246242
}

lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@ MCStreamer *createARMWinCOFFStreamer(MCContext &Context,
8787
bool IncrementalLinkerCompatible);
8888

8989
/// Construct an ELF Mach-O object writer.
90-
std::unique_ptr<MCObjectTargetWriter> createARMELFObjectWriter(uint8_t OSABI,
91-
bool IsAndroid);
90+
std::unique_ptr<MCObjectTargetWriter> createARMELFObjectWriter(uint8_t OSABI);
9291

9392
/// Construct an ARM Mach-O object writer.
9493
std::unique_ptr<MCObjectTargetWriter>

lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp

+1-7
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "llvm/MC/MCELFObjectWriter.h"
1616
#include "llvm/MC/MCExpr.h"
1717
#include "llvm/MC/MCFixup.h"
18-
#include "llvm/MC/MCObjectFileInfo.h" // LDC
1918
#include "llvm/MC/MCObjectWriter.h"
2019
#include "llvm/MC/MCValue.h"
2120
#include "llvm/Support/ErrorHandling.h"
@@ -261,12 +260,7 @@ static unsigned getRelocType32(MCContext &Ctx,
261260
case MCSymbolRefExpr::VK_TLSGD:
262261
assert(Type == RT32_32);
263262
assert(!IsPCRel);
264-
// LDC
265-
{
266-
auto ofi = Ctx.getObjectFileInfo();
267-
return ofi && ofi->getTargetTriple().isAndroid() ? ELF::R_386_GOT32
268-
: ELF::R_386_TLS_GD;
269-
}
263+
return ELF::R_386_TLS_GD;
270264
case MCSymbolRefExpr::VK_GOTTPOFF:
271265
assert(Type == RT32_32);
272266
assert(!IsPCRel);

lib/Target/X86/X86ISelLowering.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -16037,6 +16037,9 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
1603716037
bool PositionIndependent = isPositionIndependent();
1603816038

1603916039
if (Subtarget.isTargetELF()) {
16040+
if (Subtarget.isTargetAndroid())
16041+
return LowerToAndroidEmulatedTLSAddress(Op, LowerGlobalAddress(Op, DAG), DAG, Subtarget.is64Bit()); // LDC
16042+
1604016043
TLSModel::Model model = DAG.getTarget().getTLSModel(GV);
1604116044
switch (model) {
1604216045
case TLSModel::GeneralDynamic:

0 commit comments

Comments
 (0)