From 50b935707f29bb5d6fd8a5d254a2650efd955fb9 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 15 Apr 2015 13:07:47 +0000 Subject: [PATCH] Write section and section table entries in the same order. We had two different orders, which has no value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235004 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/ELFObjectWriter.cpp | 65 +++++++++----------------------------- test/MC/ARM/eh-link.s | 4 +-- test/MC/ELF/debug-line.s | 2 +- 3 files changed, 18 insertions(+), 53 deletions(-) diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 583f2fd15a5..8cb01c43edd 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -257,14 +257,12 @@ class ELFObjectWriter : public MCObjectWriter { void ExecutePostLayoutBinding(MCAssembler &Asm, const MCAsmLayout &Layout) override; - void writeSectionHeader(MCAssembler &Asm, const GroupMapTy &GroupMap, + void writeSectionHeader(ArrayRef Sections, + MCAssembler &Asm, const GroupMapTy &GroupMap, const MCAsmLayout &Layout, const SectionIndexMapTy &SectionIndexMap, const SectionOffsetMapTy &SectionOffsetMap); - void ComputeSectionOrder(MCAssembler &Asm, - std::vector &Sections); - void WriteSecHdrEntry(uint32_t Name, uint32_t Type, uint64_t Flags, uint64_t Address, uint64_t Offset, uint64_t Size, uint32_t Link, uint32_t Info, @@ -1550,28 +1548,20 @@ void ELFObjectWriter::writeDataSectionData(MCAssembler &Asm, } void ELFObjectWriter::writeSectionHeader( - MCAssembler &Asm, const GroupMapTy &GroupMap, const MCAsmLayout &Layout, + ArrayRef Sections, MCAssembler &Asm, + const GroupMapTy &GroupMap, const MCAsmLayout &Layout, const SectionIndexMapTy &SectionIndexMap, const SectionOffsetMapTy &SectionOffsetMap) { - const unsigned NumSections = Asm.size() + 1; - - std::vector Sections; - Sections.resize(NumSections - 1); - - for (SectionIndexMapTy::const_iterator i= - SectionIndexMap.begin(), e = SectionIndexMap.end(); i != e; ++i) { - const std::pair &p = *i; - Sections[p.second - 1] = p.first; - } + const unsigned NumSections = Asm.size(); // Null section first. uint64_t FirstSectionSize = - NumSections >= ELF::SHN_LORESERVE ? NumSections : 0; + (NumSections + 1) >= ELF::SHN_LORESERVE ? NumSections + 1 : 0; uint32_t FirstSectionLink = ShstrtabIndex >= ELF::SHN_LORESERVE ? ShstrtabIndex : 0; WriteSecHdrEntry(0, 0, 0, 0, 0, FirstSectionSize, FirstSectionLink, 0, 0, 0); - for (unsigned i = 0; i < NumSections - 1; ++i) { + for (unsigned i = 0; i < NumSections; ++i) { const MCSectionELF &Section = *Sections[i]; const MCSectionData &SD = Asm.getOrCreateSectionData(Section); uint32_t GroupSymbolIndex; @@ -1589,36 +1579,6 @@ void ELFObjectWriter::writeSectionHeader( } } -void ELFObjectWriter::ComputeSectionOrder(MCAssembler &Asm, - std::vector &Sections) { - for (MCAssembler::iterator it = Asm.begin(), - ie = Asm.end(); it != ie; ++it) { - const MCSectionELF &Section = - static_cast(it->getSection()); - if (Section.getType() == ELF::SHT_GROUP) - Sections.push_back(&Section); - } - - for (MCAssembler::iterator it = Asm.begin(), - ie = Asm.end(); it != ie; ++it) { - const MCSectionELF &Section = - static_cast(it->getSection()); - if (Section.getType() != ELF::SHT_GROUP && - Section.getType() != ELF::SHT_REL && - Section.getType() != ELF::SHT_RELA) - Sections.push_back(&Section); - } - - for (MCAssembler::iterator it = Asm.begin(), - ie = Asm.end(); it != ie; ++it) { - const MCSectionELF &Section = - static_cast(it->getSection()); - if (Section.getType() == ELF::SHT_REL || - Section.getType() == ELF::SHT_RELA) - Sections.push_back(&Section); - } -} - void ELFObjectWriter::WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) { GroupMapTy GroupMap; @@ -1638,9 +1598,13 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, const_cast(Layout), SectionIndexMap); + unsigned NumSections = Asm.size(); std::vector Sections; - ComputeSectionOrder(Asm, Sections); - unsigned NumSections = Sections.size(); + Sections.resize(NumSections); + + for (auto &Pair : SectionIndexMap) + Sections[Pair.second - 1] = Pair.first; + SectionOffsetMapTy SectionOffsetMap; // Write out the ELF header ... @@ -1666,7 +1630,8 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, const unsigned SectionHeaderOffset = OS.tell(); // ... then the section header table ... - writeSectionHeader(Asm, GroupMap, Layout, SectionIndexMap, SectionOffsetMap); + writeSectionHeader(Sections, Asm, GroupMap, Layout, SectionIndexMap, + SectionOffsetMap); if (is64Bit()) { uint64_t Val = SectionHeaderOffset; diff --git a/test/MC/ARM/eh-link.s b/test/MC/ARM/eh-link.s index b7bed61bd44..0c44c0e2c06 100644 --- a/test/MC/ARM/eh-link.s +++ b/test/MC/ARM/eh-link.s @@ -52,7 +52,7 @@ @ CHECK-NEXT: SHF_GROUP @ CHECK-NEXT: ] @ CHECK-NEXT: Address: 0x0 -@ CHECK-NEXT: Offset: 0x60 +@ CHECK-NEXT: Offset: @ CHECK-NEXT: Size: 4 @ CHECK-NEXT: Link: 0 @ CHECK-NEXT: Info: 0 @@ -69,7 +69,7 @@ @ CHECK-NEXT: SHF_LINK_ORDER @ CHECK-NEXT: ] @ CHECK-NEXT: Address: 0x0 -@ CHECK-NEXT: Offset: 0x64 +@ CHECK-NEXT: Offset: @ CHECK-NEXT: Size: 8 @ CHECK-NEXT: Link: 9 @ CHECK-NEXT: Info: 0 diff --git a/test/MC/ELF/debug-line.s b/test/MC/ELF/debug-line.s index 38ef8284a0d..072265c5c70 100644 --- a/test/MC/ELF/debug-line.s +++ b/test/MC/ELF/debug-line.s @@ -17,7 +17,7 @@ // CHECK-NEXT: Flags [ // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x0 -// CHECK-NEXT: Offset: 0x50 +// CHECK-NEXT: Offset: // CHECK-NEXT: Size: 57 // CHECK-NEXT: Link: 0 // CHECK-NEXT: Info: 0 -- 2.34.1