diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index eb2a28f574a54..64a80409dcc4f 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -109,8 +109,8 @@ const MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference( MMI, Streamer); } -static SectionKind -getELFKindForNamedSection(StringRef Name, SectionKind K) { +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. // We follow gcc, MC follows gas. For example, given ".section .eh_frame", // both gas and MC will produce a section with no flags. Given @@ -141,6 +141,7 @@ getELFKindForNamedSection(StringRef Name, SectionKind K) { return SectionKind::getThreadData(); if (Name == ".tbss" || + (TargetTriple.isAndroid() && Name == ".tcommon") || // LDC Name.startswith(".tbss.") || Name.startswith(".gnu.linkonce.tb.") || Name.startswith(".llvm.linkonce.tb.")) @@ -172,7 +173,7 @@ static unsigned getELFSectionType(StringRef Name, SectionKind K) { return ELF::SHT_PROGBITS; } -static unsigned getELFSectionFlags(SectionKind K) { +static unsigned getELFSectionFlags(SectionKind K, const Triple &TargetTriple) { unsigned Flags = 0; if (!K.isMetadata()) @@ -187,7 +188,7 @@ static unsigned getELFSectionFlags(SectionKind K) { if (K.isWriteable()) Flags |= ELF::SHF_WRITE; - if (K.isThreadLocal()) + if (K.isThreadLocal() && !TargetTriple.isAndroid()) // LDC Flags |= ELF::SHF_TLS; if (K.isMergeableCString() || K.isMergeableConst()) @@ -216,10 +217,10 @@ MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal( StringRef SectionName = GO->getSection(); // Infer section flags from the section name if we can. - Kind = getELFKindForNamedSection(SectionName, Kind); + Kind = getELFKindForNamedSection(SectionName, Kind, getTargetTriple()); StringRef Group = ""; - unsigned Flags = getELFSectionFlags(Kind); + unsigned Flags = getELFSectionFlags(Kind, getTargetTriple()); if (const Comdat *C = getELFComdat(GO)) { Group = C->getName(); Flags |= ELF::SHF_GROUP; @@ -324,7 +325,7 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalObject *GO, MCSection *TargetLoweringObjectFileELF::SelectSectionForGlobal( const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const { - unsigned Flags = getELFSectionFlags(Kind); + unsigned Flags = getELFSectionFlags(Kind, getTargetTriple()); // If we have -ffunction-section or -fdata-section then we should emit the // global value to a uniqued section specifically for it. diff --git a/lib/MC/MCELFStreamer.cpp b/lib/MC/MCELFStreamer.cpp index 0ef1b2a8bdcaf..3aa787ee25953 100644 --- a/lib/MC/MCELFStreamer.cpp +++ b/lib/MC/MCELFStreamer.cpp @@ -450,7 +450,12 @@ void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) { break; } getAssembler().registerSymbol(symRef.getSymbol()); - cast(symRef.getSymbol()).setType(ELF::STT_TLS); + // LDC + { + auto ofi = getContext().getObjectFileInfo(); + if (!(ofi && ofi->getTargetTriple().isAndroid())) + cast(symRef.getSymbol()).setType(ELF::STT_TLS); + } break; } diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index 8fd71f62e4e59..0bd98cbf16148 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -467,12 +467,14 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T) { ReadOnlySection = Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); - TLSDataSection = - Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS, - ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE); + // LDC + const auto tlsFlag = (!getTargetTriple().isAndroid() ? ELF::SHF_TLS : 0); - TLSBSSSection = Ctx->getELFSection( - ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE); + TLSDataSection = Ctx->getELFSection( + ".tdata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC | tlsFlag | ELF::SHF_WRITE); + + TLSBSSSection = Ctx->getELFSection(".tbss", ELF::SHT_NOBITS, + ELF::SHF_ALLOC | tlsFlag | ELF::SHF_WRITE); DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, ELF::SHF_ALLOC | ELF::SHF_WRITE); diff --git a/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h b/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h index 748f915be17bb..5760f6f3c5ecf 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h +++ b/lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h @@ -16,14 +16,18 @@ using namespace llvm; namespace { class ARMAsmBackendELF : public ARMAsmBackend { + // LDC + const bool isAndroid; + public: uint8_t OSABI; ARMAsmBackendELF(const Target &T, const Triple &TT, uint8_t OSABI, bool IsLittle) - : ARMAsmBackend(T, TT, IsLittle), OSABI(OSABI) {} + : ARMAsmBackend(T, TT, IsLittle), isAndroid(TT.isAndroid()), + OSABI(OSABI) {} MCObjectWriter *createObjectWriter(raw_pwrite_stream &OS) const override { - return createARMELFObjectWriter(OS, OSABI, isLittle()); + return createARMELFObjectWriter(OS, OSABI, isLittle(), isAndroid); } }; } diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp index 6f19754b899e9..42fce5bcb62f3 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp @@ -23,6 +23,9 @@ using namespace llvm; namespace { class ARMELFObjectWriter : public MCELFObjectTargetWriter { + // LDC + const bool isAndroid; + enum { DefaultEABIVersion = 0x05000000U }; unsigned GetRelocTypeInner(const MCValue &Target, const MCFixup &Fixup, @@ -30,7 +33,7 @@ namespace { public: - ARMELFObjectWriter(uint8_t OSABI); + ARMELFObjectWriter(uint8_t OSABI, bool IsAndroid); ~ARMELFObjectWriter() override; @@ -42,10 +45,10 @@ namespace { }; } -ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI) - : MCELFObjectTargetWriter(/*Is64Bit*/ false, OSABI, - ELF::EM_ARM, - /*HasRelocationAddend*/ false) {} +ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI, bool IsAndroid) + : MCELFObjectTargetWriter(/*Is64Bit*/ false, OSABI, ELF::EM_ARM, + /*HasRelocationAddend*/ false), + isAndroid(IsAndroid) {} ARMELFObjectWriter::~ARMELFObjectWriter() {} @@ -189,7 +192,8 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, Type = ELF::R_ARM_GOT_BREL; break; case MCSymbolRefExpr::VK_TLSGD: - Type = ELF::R_ARM_TLS_GD32; + // LDC + Type = (isAndroid ? ELF::R_ARM_GOT_PREL : ELF::R_ARM_TLS_GD32); break; case MCSymbolRefExpr::VK_TPOFF: Type = ELF::R_ARM_TLS_LE32; @@ -283,7 +287,8 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, MCObjectWriter *llvm::createARMELFObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI, - bool IsLittleEndian) { - MCELFObjectTargetWriter *MOTW = new ARMELFObjectWriter(OSABI); + bool IsLittleEndian, + bool IsAndroid) { + MCELFObjectTargetWriter *MOTW = new ARMELFObjectWriter(OSABI, IsAndroid); return createELFObjectWriter(MOTW, OS, IsLittleEndian); } diff --git a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h index ba834201e585a..9b20b7df61450 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h +++ b/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h @@ -99,7 +99,7 @@ MCStreamer *createARMWinCOFFStreamer(MCContext &Context, MCAsmBackend &MAB, /// Construct an ELF Mach-O object writer. MCObjectWriter *createARMELFObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI, - bool IsLittleEndian); + bool IsLittleEndian, bool IsAndroid); /// Construct an ARM Mach-O object writer. MCObjectWriter *createARMMachObjectWriter(raw_pwrite_stream &OS, bool Is64Bit, diff --git a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp index da69da51df108..db52a0d1e1394 100644 --- a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp +++ b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp @@ -13,6 +13,7 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCELFObjectWriter.h" #include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCObjectFileInfo.h" // LDC #include "llvm/MC/MCValue.h" #include "llvm/Support/ELF.h" #include "llvm/Support/ErrorHandling.h" @@ -253,7 +254,12 @@ static unsigned getRelocType32(MCContext &Ctx, case MCSymbolRefExpr::VK_TLSGD: assert(Type == RT32_32); assert(!IsPCRel); - return ELF::R_386_TLS_GD; + // LDC + { + auto ofi = Ctx.getObjectFileInfo(); + return ofi && ofi->getTargetTriple().isAndroid() ? ELF::R_386_GOT32 + : ELF::R_386_TLS_GD; + } case MCSymbolRefExpr::VK_GOTTPOFF: assert(Type == RT32_32); assert(!IsPCRel);