mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-03 11:24:18 +00:00
This patch reworks how llvm targets set
and update ELF header e_flags. Currently gathering information such as symbol, section and data is done by collecting it in an MCAssembler object. From MCAssembler and MCAsmLayout objects ELFObjectWriter::WriteObject() forms and streams out the ELF object file. This patch just adds a few members to the MCAssember class to store and access the e_flag settings. It allows for runtime additions to the e_flag by assembler directives. The standalone assembler can get to MCAssembler from getParser().getStreamer().getAssembler(). This patch is the generic infrastructure and will be followed by patches for ARM and Mips for their target specific use. Contributer: Jack Carter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173882 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -871,6 +871,12 @@ private:
|
|||||||
unsigned NoExecStack : 1;
|
unsigned NoExecStack : 1;
|
||||||
unsigned SubsectionsViaSymbols : 1;
|
unsigned SubsectionsViaSymbols : 1;
|
||||||
|
|
||||||
|
/// ELF specific e_header flags
|
||||||
|
// It would be good if there were an MCELFAssembler class to hold this.
|
||||||
|
// ELF header flags are used both by the integrated and standalone assemblers.
|
||||||
|
// Access to the flags is necessary in cases where assembler directives affect
|
||||||
|
// which flags to be set.
|
||||||
|
unsigned ELFHeaderEFlags;
|
||||||
private:
|
private:
|
||||||
/// Evaluate a fixup to a relocatable expression and the value which should be
|
/// Evaluate a fixup to a relocatable expression and the value which should be
|
||||||
/// placed into the fixup.
|
/// placed into the fixup.
|
||||||
@ -948,6 +954,10 @@ public:
|
|||||||
/// Flag a function symbol as the target of a .thumb_func directive.
|
/// Flag a function symbol as the target of a .thumb_func directive.
|
||||||
void setIsThumbFunc(const MCSymbol *Func) { ThumbFuncs.insert(Func); }
|
void setIsThumbFunc(const MCSymbol *Func) { ThumbFuncs.insert(Func); }
|
||||||
|
|
||||||
|
/// ELF e_header flags
|
||||||
|
unsigned getELFHeaderEFlags() const {return ELFHeaderEFlags;}
|
||||||
|
void setELFHeaderEFlags(unsigned Flags) { ELFHeaderEFlags = Flags;}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Construct a new assembler instance.
|
/// Construct a new assembler instance.
|
||||||
///
|
///
|
||||||
|
@ -79,7 +79,6 @@ public:
|
|||||||
virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
||||||
bool IsPCRel, bool IsRelocWithSymbol,
|
bool IsPCRel, bool IsRelocWithSymbol,
|
||||||
int64_t Addend) const = 0;
|
int64_t Addend) const = 0;
|
||||||
virtual unsigned getEFlags() const;
|
|
||||||
virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm,
|
virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm,
|
||||||
const MCValue &Target,
|
const MCValue &Target,
|
||||||
const MCFragment &F,
|
const MCFragment &F,
|
||||||
|
@ -142,9 +142,6 @@ class ELFObjectWriter : public MCObjectWriter {
|
|||||||
bool hasRelocationAddend() const {
|
bool hasRelocationAddend() const {
|
||||||
return TargetObjectWriter->hasRelocationAddend();
|
return TargetObjectWriter->hasRelocationAddend();
|
||||||
}
|
}
|
||||||
unsigned getEFlags() const {
|
|
||||||
return TargetObjectWriter->getEFlags();
|
|
||||||
}
|
|
||||||
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
||||||
bool IsPCRel, bool IsRelocWithSymbol,
|
bool IsPCRel, bool IsRelocWithSymbol,
|
||||||
int64_t Addend) const {
|
int64_t Addend) const {
|
||||||
@ -152,7 +149,6 @@ class ELFObjectWriter : public MCObjectWriter {
|
|||||||
IsRelocWithSymbol, Addend);
|
IsRelocWithSymbol, Addend);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ELFObjectWriter(MCELFObjectTargetWriter *MOTW,
|
ELFObjectWriter(MCELFObjectTargetWriter *MOTW,
|
||||||
raw_ostream &_OS, bool IsLittleEndian)
|
raw_ostream &_OS, bool IsLittleEndian)
|
||||||
@ -233,7 +229,8 @@ class ELFObjectWriter : public MCObjectWriter {
|
|||||||
F.getContents().append(&buf[0], &buf[8]);
|
F.getContents().append(&buf[0], &buf[8]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteHeader(uint64_t SectionDataSize,
|
void WriteHeader(const MCAssembler &Asm,
|
||||||
|
uint64_t SectionDataSize,
|
||||||
unsigned NumberOfSections);
|
unsigned NumberOfSections);
|
||||||
|
|
||||||
void WriteSymbolEntry(MCDataFragment *SymtabF,
|
void WriteSymbolEntry(MCDataFragment *SymtabF,
|
||||||
@ -373,7 +370,8 @@ ELFObjectWriter::~ELFObjectWriter()
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
// Emit the ELF header.
|
// Emit the ELF header.
|
||||||
void ELFObjectWriter::WriteHeader(uint64_t SectionDataSize,
|
void ELFObjectWriter::WriteHeader(const MCAssembler &Asm,
|
||||||
|
uint64_t SectionDataSize,
|
||||||
unsigned NumberOfSections) {
|
unsigned NumberOfSections) {
|
||||||
// ELF Header
|
// ELF Header
|
||||||
// ----------
|
// ----------
|
||||||
@ -411,7 +409,7 @@ void ELFObjectWriter::WriteHeader(uint64_t SectionDataSize,
|
|||||||
sizeof(ELF::Elf32_Ehdr))); // e_shoff = sec hdr table off in bytes
|
sizeof(ELF::Elf32_Ehdr))); // e_shoff = sec hdr table off in bytes
|
||||||
|
|
||||||
// e_flags = whatever the target wants
|
// e_flags = whatever the target wants
|
||||||
Write32(getEFlags());
|
Write32(Asm.getELFHeaderEFlags());
|
||||||
|
|
||||||
// e_ehsize = ELF header size
|
// e_ehsize = ELF header size
|
||||||
Write16(is64Bit() ? sizeof(ELF::Elf64_Ehdr) : sizeof(ELF::Elf32_Ehdr));
|
Write16(is64Bit() ? sizeof(ELF::Elf64_Ehdr) : sizeof(ELF::Elf32_Ehdr));
|
||||||
@ -1534,7 +1532,7 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write out the ELF header ...
|
// Write out the ELF header ...
|
||||||
WriteHeader(SectionHeaderOffset, NumSections + 1);
|
WriteHeader(Asm, SectionHeaderOffset, NumSections + 1);
|
||||||
|
|
||||||
// ... then the regular sections ...
|
// ... then the regular sections ...
|
||||||
// + because of .shstrtab
|
// + because of .shstrtab
|
||||||
|
@ -264,7 +264,7 @@ MCAssembler::MCAssembler(MCContext &Context_, MCAsmBackend &Backend_,
|
|||||||
raw_ostream &OS_)
|
raw_ostream &OS_)
|
||||||
: Context(Context_), Backend(Backend_), Emitter(Emitter_), Writer(Writer_),
|
: Context(Context_), Backend(Backend_), Emitter(Emitter_), Writer(Writer_),
|
||||||
OS(OS_), BundleAlignSize(0), RelaxAll(false), NoExecStack(false),
|
OS(OS_), BundleAlignSize(0), RelaxAll(false), NoExecStack(false),
|
||||||
SubsectionsViaSymbols(false) {
|
SubsectionsViaSymbols(false), ELFHeaderEFlags(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
MCAssembler::~MCAssembler() {
|
MCAssembler::~MCAssembler() {
|
||||||
@ -281,6 +281,7 @@ void MCAssembler::reset() {
|
|||||||
RelaxAll = false;
|
RelaxAll = false;
|
||||||
NoExecStack = false;
|
NoExecStack = false;
|
||||||
SubsectionsViaSymbols = false;
|
SubsectionsViaSymbols = false;
|
||||||
|
ELFHeaderEFlags = 0;
|
||||||
|
|
||||||
// reset objects owned by us
|
// reset objects owned by us
|
||||||
getBackend().reset();
|
getBackend().reset();
|
||||||
|
@ -24,11 +24,6 @@ MCELFObjectTargetWriter::MCELFObjectTargetWriter(bool Is64Bit_,
|
|||||||
IsN64(IsN64_){
|
IsN64(IsN64_){
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Default e_flags = 0
|
|
||||||
unsigned MCELFObjectTargetWriter::getEFlags() const {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const MCSymbol *MCELFObjectTargetWriter::ExplicitRelSym(const MCAssembler &Asm,
|
const MCSymbol *MCELFObjectTargetWriter::ExplicitRelSym(const MCAssembler &Asm,
|
||||||
const MCValue &Target,
|
const MCValue &Target,
|
||||||
const MCFragment &F,
|
const MCFragment &F,
|
||||||
|
@ -37,7 +37,6 @@ namespace {
|
|||||||
virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
||||||
bool IsPCRel, bool IsRelocWithSymbol,
|
bool IsPCRel, bool IsRelocWithSymbol,
|
||||||
int64_t Addend) const;
|
int64_t Addend) const;
|
||||||
virtual unsigned getEFlags() const;
|
|
||||||
virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm,
|
virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm,
|
||||||
const MCValue &Target,
|
const MCValue &Target,
|
||||||
const MCFragment &F,
|
const MCFragment &F,
|
||||||
@ -53,11 +52,6 @@ ARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI)
|
|||||||
|
|
||||||
ARMELFObjectWriter::~ARMELFObjectWriter() {}
|
ARMELFObjectWriter::~ARMELFObjectWriter() {}
|
||||||
|
|
||||||
// FIXME: get the real EABI Version from the Triple.
|
|
||||||
unsigned ARMELFObjectWriter::getEFlags() const {
|
|
||||||
return ELF::EF_ARM_EABIMASK & DefaultEABIVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
// In ARM, _MergedGlobals and other most symbols get emitted directly.
|
// In ARM, _MergedGlobals and other most symbols get emitted directly.
|
||||||
// I.e. not as an offset to a section symbol.
|
// I.e. not as an offset to a section symbol.
|
||||||
// This code is an approximation of what ARM/gcc does.
|
// This code is an approximation of what ARM/gcc does.
|
||||||
|
@ -42,7 +42,6 @@ namespace {
|
|||||||
virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
|
||||||
bool IsPCRel, bool IsRelocWithSymbol,
|
bool IsPCRel, bool IsRelocWithSymbol,
|
||||||
int64_t Addend) const;
|
int64_t Addend) const;
|
||||||
virtual unsigned getEFlags() const;
|
|
||||||
virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm,
|
virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm,
|
||||||
const MCValue &Target,
|
const MCValue &Target,
|
||||||
const MCFragment &F,
|
const MCFragment &F,
|
||||||
@ -61,19 +60,6 @@ MipsELFObjectWriter::MipsELFObjectWriter(bool _is64Bit, uint8_t OSABI,
|
|||||||
|
|
||||||
MipsELFObjectWriter::~MipsELFObjectWriter() {}
|
MipsELFObjectWriter::~MipsELFObjectWriter() {}
|
||||||
|
|
||||||
// FIXME: get the real EABI Version from the Subtarget class.
|
|
||||||
unsigned MipsELFObjectWriter::getEFlags() const {
|
|
||||||
|
|
||||||
// FIXME: We can't tell if we are PIC (dynamic) or CPIC (static)
|
|
||||||
unsigned Flag = ELF::EF_MIPS_NOREORDER;
|
|
||||||
|
|
||||||
if (is64Bit())
|
|
||||||
Flag |= ELF::EF_MIPS_ARCH_64R2;
|
|
||||||
else
|
|
||||||
Flag |= ELF::EF_MIPS_ARCH_32R2;
|
|
||||||
return Flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
const MCSymbol *MipsELFObjectWriter::ExplicitRelSym(const MCAssembler &Asm,
|
const MCSymbol *MipsELFObjectWriter::ExplicitRelSym(const MCAssembler &Asm,
|
||||||
const MCValue &Target,
|
const MCValue &Target,
|
||||||
const MCFragment &F,
|
const MCFragment &F,
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
@ XFAIL:
|
||||||
@ RUN: llvm-mc %s -triple=armv7-linux-gnueabi -filetype=obj -o - | \
|
@ RUN: llvm-mc %s -triple=armv7-linux-gnueabi -filetype=obj -o - | \
|
||||||
@ RUN: elf-dump --dump-section-data | FileCheck -check-prefix=OBJ %s
|
@ RUN: elf-dump --dump-section-data | FileCheck -check-prefix=OBJ %s
|
||||||
.syntax unified
|
.syntax unified
|
||||||
|
Reference in New Issue
Block a user