diff options
author | Simon Atanasyan <simon@atanasyan.com> | 2015-05-31 20:37:13 +0000 |
---|---|---|
committer | Simon Atanasyan <simon@atanasyan.com> | 2015-05-31 20:37:13 +0000 |
commit | 2944e4a43d7c8cc403d01b7f6c33e11c8481bd3a (patch) | |
tree | 7862a5f981ddf8b8afa38381efefe781e8ede65f | |
parent | c140b41c39f7a5441ec07667484aa83f908cd0e8 (diff) | |
download | bcm5719-llvm-2944e4a43d7c8cc403d01b7f6c33e11c8481bd3a.tar.gz bcm5719-llvm-2944e4a43d7c8cc403d01b7f6c33e11c8481bd3a.zip |
[Mips] Do not put the .reginfo section into the separate segment
The .reginfo should not belong to the separate segment if there is
a .MIPS.abiflags section.
llvm-svn: 238688
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h | 2 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp | 2 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h | 2 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp | 20 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h | 4 | ||||
-rw-r--r-- | lld/test/elf/Mips/abi-flags-10.test | 60 | ||||
-rw-r--r-- | lld/test/elf/Mips/abi-flags-11.test | 59 | ||||
-rw-r--r-- | lld/test/elf/Mips/reginfo-02.test | 31 |
8 files changed, 154 insertions, 26 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h b/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h index eb0545c88a5..149d6bdb2b9 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsAbiInfoHandler.h @@ -43,6 +43,8 @@ public: MipsAbiInfoHandler() = default; + bool hasMipsAbiSection() const { return _hasAbiSection; } + uint32_t getFlags() const; llvm::Optional<Elf_Mips_RegInfo> getRegistersMask() const; llvm::Optional<Elf_Mips_ABIFlags> getAbiFlags() const; diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp index 1e7e5945671..2afc2c1fdcf 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp @@ -17,7 +17,7 @@ namespace elf { template <class ELFT> MipsTargetHandler<ELFT>::MipsTargetHandler(MipsLinkingContext &ctx) - : _ctx(ctx), _targetLayout(new MipsTargetLayout<ELFT>(ctx)), + : _ctx(ctx), _targetLayout(new MipsTargetLayout<ELFT>(ctx, _abiInfoHandler)), _relocationHandler( createMipsRelocationHandler<ELFT>(ctx, *_targetLayout)) {} diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h index 8d5b6632345..7625f12bd90 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h @@ -31,9 +31,9 @@ public: private: MipsLinkingContext &_ctx; + MipsAbiInfoHandler<ELFT> _abiInfoHandler; std::unique_ptr<MipsTargetLayout<ELFT>> _targetLayout; std::unique_ptr<TargetRelocationHandler> _relocationHandler; - MipsAbiInfoHandler<ELFT> _abiInfoHandler; }; template <class ELFT> class MipsSymbolTable : public SymbolTable<ELFT> { diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp index 1d62c1d7db3..78ea33d7d41 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.cpp @@ -14,8 +14,9 @@ namespace lld { namespace elf { template <class ELFT> -MipsTargetLayout<ELFT>::MipsTargetLayout(MipsLinkingContext &ctx) - : TargetLayout<ELFT>(ctx), +MipsTargetLayout<ELFT>::MipsTargetLayout(MipsLinkingContext &ctx, + MipsAbiInfoHandler<ELFT> &abi) + : TargetLayout<ELFT>(ctx), _abiInfo(abi), _gotSection(new (this->_allocator) MipsGOTSection<ELFT>(ctx)), _pltSection(new (this->_allocator) MipsPLTSection<ELFT>(ctx)) {} @@ -35,7 +36,8 @@ typename TargetLayout<ELFT>::SegmentType MipsTargetLayout<ELFT>::getSegmentType(Section<ELFT> *section) const { switch (section->order()) { case ORDER_MIPS_REGINFO: - return llvm::ELF::PT_MIPS_REGINFO; + return _abiInfo.hasMipsAbiSection() ? llvm::ELF::PT_LOAD + : llvm::ELF::PT_MIPS_REGINFO; case ORDER_MIPS_OPTIONS: return llvm::ELF::PT_LOAD; case ORDER_MIPS_ABI_FLAGS: @@ -81,11 +83,13 @@ uint64_t MipsTargetLayout<ELFT>::getLookupSectionFlags( template <class ELFT> void MipsTargetLayout<ELFT>::sortSegments() { using namespace llvm::ELF; TargetLayout<ELFT>::sortSegments(); - // Move PT_MIPS_ABIFLAGS right after PT_INTERP. - auto abiIt = std::find_if(this->_segments.begin(), this->_segments.end(), - [](const Segment<ELFT> *s) { - return s->segmentType() == PT_MIPS_ABIFLAGS; - }); + // Move PT_MIPS_ABIFLAGS or PT_MIPS_REGINFO right after PT_INTERP. + auto abiIt = + std::find_if(this->_segments.begin(), this->_segments.end(), + [](const Segment<ELFT> *s) { + auto typ = s->segmentType(); + return typ == PT_MIPS_ABIFLAGS || typ == PT_MIPS_REGINFO; + }); if (abiIt == this->_segments.end()) return; Segment<ELFT> *abiSeg = *abiIt; diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h index a4099f70458..c8a8985108e 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h @@ -9,6 +9,7 @@ #ifndef LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_LAYOUT_H #define LLD_READER_WRITER_ELF_MIPS_MIPS_TARGET_LAYOUT_H +#include "MipsAbiInfoHandler.h" #include "MipsSectionChunks.h" #include "TargetLayout.h" @@ -26,7 +27,7 @@ public: ORDER_MIPS_OPTIONS, }; - MipsTargetLayout(MipsLinkingContext &ctx); + MipsTargetLayout(MipsLinkingContext &ctx, MipsAbiInfoHandler<ELFT> &abi); const MipsGOTSection<ELFT> &getGOTSection() const { return *_gotSection; } const MipsPLTSection<ELFT> &getPLTSection() const { return *_pltSection; } @@ -57,6 +58,7 @@ protected: void sortSegments() override; private: + MipsAbiInfoHandler<ELFT> &_abiInfo; MipsGOTSection<ELFT> *_gotSection; MipsPLTSection<ELFT> *_pltSection; uint64_t _gpAddr = 0; diff --git a/lld/test/elf/Mips/abi-flags-10.test b/lld/test/elf/Mips/abi-flags-10.test new file mode 100644 index 00000000000..566508dee8f --- /dev/null +++ b/lld/test/elf/Mips/abi-flags-10.test @@ -0,0 +1,60 @@ +# Check that SHT_MIPS_REGINFO section does not get a separate segment +# if there is a SHT_MIPS_ABIFLAGS section. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s + +# CHECK: ProgramHeaders [ +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_PHDR +# CHECK: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_INTERP +# CHECK: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_MIPS_ABIFLAGS +# CHECK: } +# CHECK-NOT: Type: PT_MIPS_REGINFO + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "F0000000E0000000D0000000C0000000B000000000100000" + +- Name: .MIPS.abiflags + Type: SHT_MIPS_ABIFLAGS + AddressAlign: 8 + ISA: MIPS32 + ISARevision: 2 + ISAExtension: EXT_NONE + ASEs: [ MICROMIPS ] + FpABI: FP_XX + GPRSize: REG_32 + CPR1Size: REG_32 + CPR2Size: REG_NONE + Flags1: [ ] + Flags2: 0x0 + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/lld/test/elf/Mips/abi-flags-11.test b/lld/test/elf/Mips/abi-flags-11.test new file mode 100644 index 00000000000..4cd56261aca --- /dev/null +++ b/lld/test/elf/Mips/abi-flags-11.test @@ -0,0 +1,59 @@ +# Check position of PT_MIPS_REGINFO segment. +# It should go right after the PT_INTERP segment. + +# RUN: yaml2obj -format=elf %s > %t.o +# RUN: lld -flavor gnu -target mipsel -e T0 -o %t.exe %t.o +# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s + +# CHECK: ProgramHeader { +# CHECK: Type: PT_INTERP +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 13 +# CHECK-NEXT: MemSize: 13 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 1 +# CHECK-NEXT: } +# CHECK-NEXT: ProgramHeader { +# CHECK-NEXT: Type: PT_MIPS_REGINFO +# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}} +# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# CHECK-NEXT: FileSize: 24 +# CHECK-NEXT: MemSize: 24 +# CHECK-NEXT: Flags [ +# CHECK-NEXT: PF_R +# CHECK-NEXT: ] +# CHECK-NEXT: Alignment: 4 +# CHECK-NEXT: } + +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2] + +Sections: +- Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Size: 4 + AddressAlign: 16 + +- Name: .reginfo + Type: SHT_MIPS_REGINFO + Flags: [ SHF_ALLOC ] + AddressAlign: 4 + Content: "F0000000E0000000D0000000C0000000B000000000100000" + +Symbols: + Global: + - Name: T0 + Section: .text + Type: STT_FUNC + Value: 0 + Size: 4 diff --git a/lld/test/elf/Mips/reginfo-02.test b/lld/test/elf/Mips/reginfo-02.test index 65651ce41cb..e9eb60ab53b 100644 --- a/lld/test/elf/Mips/reginfo-02.test +++ b/lld/test/elf/Mips/reginfo-02.test @@ -8,9 +8,9 @@ # SEC: Index: 1 # SEC-NEXT: Name: .reginfo (1) -# SEC-NEXT: Type: SHT_MIPS_REGINFO (0x70000006) -# SEC-NEXT: Flags [ (0x2) -# SEC-NEXT: SHF_ALLOC (0x2) +# SEC-NEXT: Type: SHT_MIPS_REGINFO +# SEC-NEXT: Flags [ +# SEC-NEXT: SHF_ALLOC # SEC-NEXT: ] # SEC-NEXT: Address: {{[0-9A-F]+}} # SEC-NEXT: Offset: {{[0-9A-F]+}} @@ -20,18 +20,19 @@ # SEC-NEXT: AddressAlignment: 4 # SEC-NEXT: EntrySize: 24 -# SEC: ProgramHeader { -# SEC: Type: PT_MIPS_REGINFO (0x70000000) -# SEC-NEXT: Offset: 0x{{[0-9A-F]+}} -# SEC-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} -# SEC-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} -# SEC-NEXT: FileSize: 24 -# SEC-NEXT: MemSize: 24 -# SEC-NEXT: Flags [ (0x4) -# SEC-NEXT: PF_R (0x4) -# SEC-NEXT: ] -# SEC-NEXT: Alignment: 4 -# SEC-NEXT: } +# SEC: ProgramHeaders [ +# SEC-NEXT: ProgramHeader { +# SEC-NEXT: Type: PT_MIPS_REGINFO +# SEC-NEXT: Offset: 0x{{[0-9A-F]+}} +# SEC-NEXT: VirtualAddress: 0x{{[0-9A-F]+}} +# SEC-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}} +# SEC-NEXT: FileSize: 24 +# SEC-NEXT: MemSize: 24 +# SEC-NEXT: Flags [ +# SEC-NEXT: PF_R +# SEC-NEXT: ] +# SEC-NEXT: Alignment: 4 +# SEC-NEXT: } # RAW: Contents of section .reginfo: # RAW-NEXT: {{[0-9a-f]+}} f0000001 e0000002 d0000003 c0000004 |