diff --git a/include/llvm/CodeGen/TargetLowering.h b/include/llvm/CodeGen/TargetLowering.h index 40540bd6e1ffa..5cbb47fd1fab4 100644 --- a/include/llvm/CodeGen/TargetLowering.h +++ b/include/llvm/CodeGen/TargetLowering.h @@ -3664,6 +3664,9 @@ class TargetLowering : public TargetLoweringBase { virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, SelectionDAG &DAG) const; + SDValue LowerToAndroidEmulatedTLSAddress(SDValue Op, SDValue Result, + SelectionDAG &DAG, bool is64bit) const; // LDC + /// Expands target specific indirect branch for the case of JumpTable /// expanasion. virtual SDValue expandIndirectJTBranch(const SDLoc& dl, SDValue Value, SDValue Addr, diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index e317268fa5f45..2b4440dd89414 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -4334,6 +4334,33 @@ SDValue TargetLowering::getVectorElementPointer(SelectionDAG &DAG, return DAG.getNode(ISD::ADD, dl, IdxVT, VecPtr, Index); } +SDValue +TargetLowering::LowerToAndroidEmulatedTLSAddress(SDValue Op, SDValue Result, + SelectionDAG &DAG, bool is64bit) const { // LDC + SDLoc DL(Op); + SDValue Chain = DAG.getEntryNode(); + ArgListTy Args; + ArgListEntry Entry; + Type *Ty; + if (is64bit) + Ty = (Type *)Type::getInt64Ty(*DAG.getContext()); + else + Ty = (Type *)Type::getInt32Ty(*DAG.getContext()); + Entry.Node = Result; + Entry.Ty = Ty; + Args.push_back(Entry); + + // copied, modified from ARMTargetLowering::LowerToTLSGeneralDynamicModel + TargetLowering::CallLoweringInfo CLI(DAG); + CLI.setDebugLoc(DL).setChain(Chain).setLibCallee( + CallingConv::C, Ty, + DAG.getExternalSymbol("__tls_get_addr", + getPointerTy(DAG.getDataLayout())), + std::move(Args)); + std::pair CallResult = LowerCallTo(CLI); + return CallResult.first; +} + //===----------------------------------------------------------------------===// // Implementation of Emulated TLS Model //===----------------------------------------------------------------------===// diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index e5cd4292b20c3..17fe1d8704a92 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -234,7 +234,7 @@ const MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference( static SectionKind getELFKindForNamedSection(StringRef Name, SectionKind K, const Triple &TargetTriple) { - // N.B.: The defaults used in here are no the same ones used in MC. + // N.B.: The defaults used in here are not the same ones used in MC. // We follow gcc, MC follows gas. For example, given ".section .eh_frame", // both gas and MC will produce a section with no flags. Given // section(".eh_frame") gcc will produce: diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp index 8a1e5768999a3..8b22678106bc9 100644 --- a/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -4149,31 +4149,6 @@ AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op, return DAG.getNode(ISD::ADD, DL, PtrVT, ThreadBase, TPOff); } -SDValue -AArch64TargetLowering::LowerAndroidGlobalTLSAddress(SDValue Op, - SelectionDAG &DAG) const { - assert(Subtarget->isTargetELF() && "This function expects an ELF target"); - SDLoc DL(Op); - SDValue Result = LowerGlobalAddress(Op, DAG); - SDValue Chain = DAG.getEntryNode(); - ArgListTy Args; - ArgListEntry Entry; - Type *Ty = (Type *)Type::getInt64Ty(*DAG.getContext()); - Entry.Node = Result; - Entry.Ty = Ty; - Args.push_back(Entry); - - // copied, modified from ARMTargetLowering::LowerToTLSGeneralDynamicModel - TargetLowering::CallLoweringInfo CLI(DAG); - CLI.setDebugLoc(DL).setChain(Chain).setLibCallee( - CallingConv::C, Ty, - DAG.getExternalSymbol("__tls_get_addr", - getPointerTy(DAG.getDataLayout())), - std::move(Args)); - std::pair CallResult = LowerCallTo(CLI); - return CallResult.first; -} - SDValue AArch64TargetLowering::LowerWindowsGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const { @@ -4243,7 +4218,7 @@ SDValue AArch64TargetLowering::LowerGlobalTLSAddress(SDValue Op, return LowerDarwinGlobalTLSAddress(Op, DAG); if (Subtarget->isTargetELF()) { if (Subtarget->isTargetAndroid()) - return LowerAndroidGlobalTLSAddress(Op, DAG); // LDC + return LowerToAndroidEmulatedTLSAddress(Op, LowerGlobalAddress(Op, DAG), DAG, true); // LDC else return LowerELFGlobalTLSAddress(Op, DAG); } diff --git a/lib/Target/AArch64/AArch64ISelLowering.h b/lib/Target/AArch64/AArch64ISelLowering.h index 9f9f197a423fc..d783c8a6048c0 100644 --- a/lib/Target/AArch64/AArch64ISelLowering.h +++ b/lib/Target/AArch64/AArch64ISelLowering.h @@ -589,7 +589,6 @@ class AArch64TargetLowering : public TargetLowering { SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const; SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; - SDValue LowerAndroidGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; // LDC SDValue LowerDarwinGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; SDValue LowerELFGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; SDValue LowerELFTLSDescCallSeq(SDValue SymAddr, const SDLoc &DL, diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index ede276dd91bb5..7b9922670a7f6 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -3018,6 +3018,8 @@ ARMTargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const { // TODO: implement the "local dynamic" model assert(Subtarget->isTargetELF() && "Only ELF implemented here"); + if (Subtarget->isTargetAndroid()) + return LowerToAndroidEmulatedTLSAddress(Op, LowerGlobalAddress(Op, DAG), DAG, false); // LDC TLSModel::Model model = getTargetMachine().getTLSModel(GA->getGlobal()); switch (model) { diff --git a/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h b/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h index a0e50bdbd228a..86a583b19cf7a 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h +++ b/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h @@ -18,19 +18,15 @@ using namespace llvm; namespace { class ARMAsmBackendELF : public ARMAsmBackend { - // LDC - const bool isAndroid; - public: uint8_t OSABI; ARMAsmBackendELF(const Target &T, const MCSubtargetInfo &STI, uint8_t OSABI, support::endianness Endian) - : ARMAsmBackend(T, STI, Endian), - isAndroid(STI.getTargetTriple().isAndroid()), OSABI(OSABI) {} + : ARMAsmBackend(T, STI, Endian), OSABI(OSABI) {} std::unique_ptr createObjectTargetWriter() const override { - return createARMELFObjectWriter(OSABI, isAndroid); + return createARMELFObjectWriter(OSABI); } }; } diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp index 7b44a800b0d11..7d04c73fb3f2d 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp @@ -25,16 +25,13 @@ using namespace llvm; namespace { class ARMELFObjectWriter : public MCELFObjectTargetWriter { - // LDC - const bool isAndroid; - enum { DefaultEABIVersion = 0x05000000U }; unsigned GetRelocTypeInner(const MCValue &Target, const MCFixup &Fixup, bool IsPCRel, MCContext &Ctx) const; public: - ARMELFObjectWriter(uint8_t OSABI, bool IsAndroid); + ARMELFObjectWriter(uint8_t OSABI); ~ARMELFObjectWriter() override = default; @@ -47,10 +44,10 @@ namespace { } // end anonymous namespace -ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI, bool IsAndroid) - : MCELFObjectTargetWriter(/*Is64Bit*/ false, OSABI, ELF::EM_ARM, - /*HasRelocationAddend*/ false), - isAndroid(IsAndroid) {} +ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI) + : MCELFObjectTargetWriter(/*Is64Bit*/ false, OSABI, + ELF::EM_ARM, + /*HasRelocationAddend*/ false) {} bool ARMELFObjectWriter::needsRelocateWithSymbol(const MCSymbol &Sym, unsigned Type) const { @@ -167,8 +164,7 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, case MCSymbolRefExpr::VK_GOT: return ELF::R_ARM_GOT_BREL; case MCSymbolRefExpr::VK_TLSGD: - // LDC - return isAndroid ? ELF::R_ARM_GOT_PREL : ELF::R_ARM_TLS_GD32; + return ELF::R_ARM_TLS_GD32; case MCSymbolRefExpr::VK_TPOFF: return ELF::R_ARM_TLS_LE32; case MCSymbolRefExpr::VK_GOTTPOFF: @@ -241,6 +237,6 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, } std::unique_ptr -llvm::createARMELFObjectWriter(uint8_t OSABI, bool IsAndroid) { - return llvm::make_unique(OSABI, IsAndroid); +llvm::createARMELFObjectWriter(uint8_t OSABI) { + return llvm::make_unique(OSABI); } diff --git a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h index c94f92f6622a8..3ee004592ac6c 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h +++ b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h @@ -87,8 +87,7 @@ MCStreamer *createARMWinCOFFStreamer(MCContext &Context, bool IncrementalLinkerCompatible); /// Construct an ELF Mach-O object writer. -std::unique_ptr createARMELFObjectWriter(uint8_t OSABI, - bool IsAndroid); +std::unique_ptr createARMELFObjectWriter(uint8_t OSABI); /// Construct an ARM Mach-O object writer. std::unique_ptr diff --git a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp index 2d439f9c9e259..b724a89f81d2e 100644 --- a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp +++ b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp @@ -15,7 +15,6 @@ #include "llvm/MC/MCELFObjectWriter.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCFixup.h" -#include "llvm/MC/MCObjectFileInfo.h" // LDC #include "llvm/MC/MCObjectWriter.h" #include "llvm/MC/MCValue.h" #include "llvm/Support/ErrorHandling.h" @@ -261,12 +260,7 @@ static unsigned getRelocType32(MCContext &Ctx, case MCSymbolRefExpr::VK_TLSGD: assert(Type == RT32_32); assert(!IsPCRel); - // LDC - { - auto ofi = Ctx.getObjectFileInfo(); - return ofi && ofi->getTargetTriple().isAndroid() ? ELF::R_386_GOT32 - : ELF::R_386_TLS_GD; - } + return ELF::R_386_TLS_GD; case MCSymbolRefExpr::VK_GOTTPOFF: assert(Type == RT32_32); assert(!IsPCRel); diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 2820004cfc6d4..7404109503fbf 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -16037,6 +16037,9 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const { bool PositionIndependent = isPositionIndependent(); if (Subtarget.isTargetELF()) { + if (Subtarget.isTargetAndroid()) + return LowerToAndroidEmulatedTLSAddress(Op, LowerGlobalAddress(Op, DAG), DAG, Subtarget.is64Bit()); // LDC + TLSModel::Model model = DAG.getTarget().getTLSModel(GV); switch (model) { case TLSModel::GeneralDynamic: