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

Commit

Permalink
LDC: Apply Joakim's Android patches for respective targets
Browse files Browse the repository at this point in the history
  • Loading branch information
kinke committed Aug 12, 2017
1 parent bf50dba commit 8655f32
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 25 deletions.
15 changes: 8 additions & 7 deletions lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Expand Up @@ -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
Expand Down Expand Up @@ -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."))
Expand Down Expand Up @@ -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())
Expand All @@ -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())
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
7 changes: 6 additions & 1 deletion lib/MC/MCELFStreamer.cpp
Expand Up @@ -450,7 +450,12 @@ void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
break;
}
getAssembler().registerSymbol(symRef.getSymbol());
cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
// LDC
{
auto ofi = getContext().getObjectFileInfo();
if (!(ofi && ofi->getTargetTriple().isAndroid()))
cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
}
break;
}

Expand Down
12 changes: 7 additions & 5 deletions lib/MC/MCObjectFileInfo.cpp
Expand Up @@ -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);
Expand Down
8 changes: 6 additions & 2 deletions lib/Target/ARM/MCTargetDesc/ARMAsmBackendELF.h
Expand Up @@ -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);
}
};
}
Expand Down
21 changes: 13 additions & 8 deletions lib/Target/ARM/MCTargetDesc/ARMELFObjectWriter.cpp
Expand Up @@ -23,14 +23,17 @@ 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) const;


public:
ARMELFObjectWriter(uint8_t OSABI);
ARMELFObjectWriter(uint8_t OSABI, bool IsAndroid);

~ARMELFObjectWriter() override;

Expand All @@ -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() {}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
2 changes: 1 addition & 1 deletion lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h
Expand Up @@ -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,
Expand Down
8 changes: 7 additions & 1 deletion lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 8655f32

Please sign in to comment.