diff options
author | Jason W Kim <jason.w.kim.2009@gmail.com> | 2011-02-04 21:41:11 +0000 |
---|---|---|
committer | Jason W Kim <jason.w.kim.2009@gmail.com> | 2011-02-04 21:41:11 +0000 |
commit | 2d7a53aec2c6426eba9e5dd6462cc9e86432b410 (patch) | |
tree | 1385db05b9cae29cf96a5e89971deadefc9b6ac5 | |
parent | 685c350ae76b588e1f00c01a511fe8bd57f18394 (diff) | |
download | external_llvm-2d7a53aec2c6426eba9e5dd6462cc9e86432b410.zip external_llvm-2d7a53aec2c6426eba9e5dd6462cc9e86432b410.tar.gz external_llvm-2d7a53aec2c6426eba9e5dd6462cc9e86432b410.tar.bz2 |
Teach ARM/MC/ELF about EF_ARM_EABI_VERSION. The magic number is set to
5 to match the current doc.
Added FIXME reminder Make it really configurable later.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124899 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Support/ELF.h | 4 | ||||
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 17 | ||||
-rw-r--r-- | test/MC/ARM/elf-eflags-eabi.s | 13 |
3 files changed, 32 insertions, 2 deletions
diff --git a/include/llvm/Support/ELF.h b/include/llvm/Support/ELF.h index 58c216b..cc72bd5 100644 --- a/include/llvm/Support/ELF.h +++ b/include/llvm/Support/ELF.h @@ -290,6 +290,10 @@ enum { R_MICROBLAZE_COPY = 21 }; + +// ARM Specific e_flags +enum { EF_ARM_EABIMASK = 0xFF000000U }; + // ELF Relocation types for ARM // Meets 2.08 ABI Specs. diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 629d746..bd5d048 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -276,6 +276,9 @@ namespace { virtual void WriteHeader(uint64_t SectionDataSize, unsigned NumberOfSections); + /// Default e_flags = 0 + virtual void WriteEFlags() { Write32(0); } + virtual void WriteSymbolEntry(MCDataFragment *SymtabF, MCDataFragment *ShndxF, uint64_t name, uint8_t info, uint64_t value, uint64_t size, @@ -387,11 +390,16 @@ namespace { class ARMELFObjectWriter : public ELFObjectWriter { public: + // FIXME: MCAssembler can't yet return the Subtarget, + enum { DefaultEABIVersion = 0x05000000U }; + ARMELFObjectWriter(MCELFObjectTargetWriter *MOTW, raw_ostream &_OS, bool IsLittleEndian); virtual ~ARMELFObjectWriter(); + + virtual void WriteEFlags(); protected: virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, bool IsPCRel, bool IsRelocWithSymbol, @@ -459,8 +467,8 @@ void ELFObjectWriter::WriteHeader(uint64_t SectionDataSize, WriteWord(SectionDataSize + (is64Bit() ? sizeof(ELF::Elf64_Ehdr) : sizeof(ELF::Elf32_Ehdr))); // e_shoff = sec hdr table off in bytes - // FIXME: Make this configurable. - Write32(0); // e_flags = whatever the target wants + // e_flags = whatever the target wants + WriteEFlags(); // e_ehsize = ELF header size Write16(is64Bit() ? sizeof(ELF::Elf64_Ehdr) : sizeof(ELF::Elf32_Ehdr)); @@ -1477,6 +1485,11 @@ ARMELFObjectWriter::ARMELFObjectWriter(MCELFObjectTargetWriter *MOTW, ARMELFObjectWriter::~ARMELFObjectWriter() {} +// FIXME: get the real EABI Version from the Triple. +void ARMELFObjectWriter::WriteEFlags() { + Write32(ELF::EF_ARM_EABIMASK & DefaultEABIVersion); +} + unsigned ARMELFObjectWriter::GetRelocType(const MCValue &Target, const MCFixup &Fixup, bool IsPCRel, diff --git a/test/MC/ARM/elf-eflags-eabi.s b/test/MC/ARM/elf-eflags-eabi.s new file mode 100644 index 0000000..ea89eac --- /dev/null +++ b/test/MC/ARM/elf-eflags-eabi.s @@ -0,0 +1,13 @@ +@ RUN: llvm-mc %s -triple=armv7-linux-gnueabi -filetype=obj -o - | \ +@ RUN: elf-dump --dump-section-data | FileCheck -check-prefix=OBJ %s + .syntax unified + .text + .globl barf + .align 2 + .type barf,%function +barf: @ @barf +@ BB#0: @ %entry + b foo + +@@@ make sure the EF_ARM_EABIMASK comes out OK +@OBJ: 'e_flags', 0x05000000 |