[llvm] r235004 - Write section and section table entries in the same order.
Rafael Espindola
rafael.espindola at gmail.com
Wed Apr 15 06:07:47 PDT 2015
Author: rafael
Date: Wed Apr 15 08:07:47 2015
New Revision: 235004
URL: http://llvm.org/viewvc/llvm-project?rev=235004&view=rev
Log:
Write section and section table entries in the same order.
We had two different orders, which has no value.
Modified:
llvm/trunk/lib/MC/ELFObjectWriter.cpp
llvm/trunk/test/MC/ARM/eh-link.s
llvm/trunk/test/MC/ELF/debug-line.s
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=235004&r1=235003&r2=235004&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Wed Apr 15 08:07:47 2015
@@ -257,14 +257,12 @@ class ELFObjectWriter : public MCObjectW
void ExecutePostLayoutBinding(MCAssembler &Asm,
const MCAsmLayout &Layout) override;
- void writeSectionHeader(MCAssembler &Asm, const GroupMapTy &GroupMap,
+ void writeSectionHeader(ArrayRef<const MCSectionELF *> Sections,
+ MCAssembler &Asm, const GroupMapTy &GroupMap,
const MCAsmLayout &Layout,
const SectionIndexMapTy &SectionIndexMap,
const SectionOffsetMapTy &SectionOffsetMap);
- void ComputeSectionOrder(MCAssembler &Asm,
- std::vector<const MCSectionELF*> &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::writeDataSectionDa
}
void ELFObjectWriter::writeSectionHeader(
- MCAssembler &Asm, const GroupMapTy &GroupMap, const MCAsmLayout &Layout,
+ ArrayRef<const MCSectionELF *> Sections, MCAssembler &Asm,
+ const GroupMapTy &GroupMap, const MCAsmLayout &Layout,
const SectionIndexMapTy &SectionIndexMap,
const SectionOffsetMapTy &SectionOffsetMap) {
- const unsigned NumSections = Asm.size() + 1;
-
- std::vector<const MCSectionELF*> Sections;
- Sections.resize(NumSections - 1);
-
- for (SectionIndexMapTy::const_iterator i=
- SectionIndexMap.begin(), e = SectionIndexMap.end(); i != e; ++i) {
- const std::pair<const MCSectionELF*, uint32_t> &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<const MCSectionELF*> &Sections) {
- for (MCAssembler::iterator it = Asm.begin(),
- ie = Asm.end(); it != ie; ++it) {
- const MCSectionELF &Section =
- static_cast<const MCSectionELF &>(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<const MCSectionELF &>(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<const MCSectionELF &>(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(MCAsse
const_cast<MCAsmLayout&>(Layout),
SectionIndexMap);
+ unsigned NumSections = Asm.size();
std::vector<const MCSectionELF*> 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(MCAsse
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;
Modified: llvm/trunk/test/MC/ARM/eh-link.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/eh-link.s?rev=235004&r1=235003&r2=235004&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/eh-link.s (original)
+++ llvm/trunk/test/MC/ARM/eh-link.s Wed Apr 15 08:07:47 2015
@@ -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
Modified: llvm/trunk/test/MC/ELF/debug-line.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/debug-line.s?rev=235004&r1=235003&r2=235004&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/debug-line.s (original)
+++ llvm/trunk/test/MC/ELF/debug-line.s Wed Apr 15 08:07:47 2015
@@ -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
More information about the llvm-commits
mailing list