mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
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
This commit is contained in:
parent
8232560496
commit
50b935707f
@ -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<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::writeDataSectionData(MCAssembler &Asm,
|
||||
}
|
||||
|
||||
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(MCAssembler &Asm,
|
||||
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(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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user