From 8a90d87d763ae0530328827f967bf0611c445f70 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 28 Apr 2015 21:52:33 +0000 Subject: [PATCH] Avoid an extra walk over the sections just to assign sections to groups. Assign the sections in the same pass we compute the index. llvm-svn: 236045 --- llvm/lib/MC/ELFObjectWriter.cpp | 71 ++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 21ddf4c..90555ba 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -231,7 +231,13 @@ class ELFObjectWriter : public MCObjectWriter { const SectionIndexMapTy &SectionIndexMap, const RevGroupMapTy &RevGroupMap); - void computeIndexMap(MCAssembler &Asm, SectionIndexMapTy &SectionIndexMap); + void maybeAddToGroup(MCAssembler &Asm, const RevGroupMapTy &RevGroupMap, + const MCSectionELF &Section, unsigned Index); + + void computeIndexMap(MCAssembler &Asm, + std::vector &Sections, + SectionIndexMapTy &SectionIndexMap, + const RevGroupMapTy &RevGroupMap); MCSectionData *createRelocationSection(MCAssembler &Asm, const MCSectionData &SD); @@ -247,6 +253,7 @@ class ELFObjectWriter : public MCObjectWriter { // those are the .note.GNU-stack section and the group sections. void createIndexedSections(MCAssembler &Asm, MCAsmLayout &Layout, RevGroupMapTy &RevGroupMap, + std::vector &Sections, SectionIndexMapTy &SectionIndexMap); void ExecutePostLayoutBinding(MCAssembler &Asm, @@ -933,15 +940,30 @@ bool ELFObjectWriter::isLocal(const MCSymbolData &Data, bool isUsedInReloc) { return true; } -void ELFObjectWriter::computeIndexMap(MCAssembler &Asm, - SectionIndexMapTy &SectionIndexMap) { - unsigned Index = 1; +void ELFObjectWriter::maybeAddToGroup(MCAssembler &Asm, + const RevGroupMapTy &RevGroupMap, + const MCSectionELF &Section, + unsigned Index) { + const MCSymbol *Sym = Section.getGroup(); + if (!Sym) + return; + const MCSectionELF *Group = RevGroupMap.lookup(Sym); + MCSectionData &Data = Asm.getOrCreateSectionData(*Group); + // FIXME: we could use the previous fragment + MCDataFragment *F = new MCDataFragment(&Data); + write(*F, Index); +} + +void ELFObjectWriter::computeIndexMap( + MCAssembler &Asm, std::vector &Sections, + SectionIndexMapTy &SectionIndexMap, const RevGroupMapTy &RevGroupMap) { for (const MCSectionData &SD : Asm) { const MCSectionELF &Section = static_cast(SD.getSection()); if (Section.getType() != ELF::SHT_GROUP) continue; - SectionIndexMap[&Section] = Index++; + Sections.push_back(&Section); + SectionIndexMap[&Section] = Sections.size(); } std::vector RelSections; @@ -952,7 +974,11 @@ void ELFObjectWriter::computeIndexMap(MCAssembler &Asm, Section.getType() == ELF::SHT_REL || Section.getType() == ELF::SHT_RELA) continue; - SectionIndexMap[&Section] = Index++; + Sections.push_back(&Section); + unsigned Index = Sections.size(); + SectionIndexMap[&Section] = Index; + maybeAddToGroup(Asm, RevGroupMap, Section, Index); + if (MCSectionData *RelSD = createRelocationSection(Asm, SD)) { const MCSectionELF *RelSection = static_cast(&RelSD->getSection()); @@ -962,8 +988,11 @@ void ELFObjectWriter::computeIndexMap(MCAssembler &Asm, // Put relocation sections close together. The linker reads them // first, so this improves cache locality. - for (const MCSectionELF * Sec: RelSections) - SectionIndexMap[Sec] = Index++; + for (const MCSectionELF *Sec : RelSections) { + Sections.push_back(Sec); + unsigned Index = Sections.size(); + maybeAddToGroup(Asm, RevGroupMap, *Sec, Index); + } } void ELFObjectWriter::computeSymbolTable( @@ -1420,6 +1449,7 @@ void ELFObjectWriter::CreateMetadataSections( void ELFObjectWriter::createIndexedSections( MCAssembler &Asm, MCAsmLayout &Layout, RevGroupMapTy &RevGroupMap, + std::vector &Sections, SectionIndexMapTy &SectionIndexMap) { MCContext &Ctx = Asm.getContext(); @@ -1443,22 +1473,7 @@ void ELFObjectWriter::createIndexedSections( } } - computeIndexMap(Asm, SectionIndexMap); - - // Add sections to the groups - for (MCAssembler::const_iterator it = Asm.begin(), ie = Asm.end(); - it != ie; ++it) { - const MCSectionELF &Section = - static_cast(it->getSection()); - if (!(Section.getFlags() & ELF::SHF_GROUP)) - continue; - const MCSectionELF *Group = RevGroupMap[Section.getGroup()]; - MCSectionData &Data = Asm.getOrCreateSectionData(*Group); - // FIXME: we could use the previous fragment - MCDataFragment *F = new MCDataFragment(&Data); - uint32_t Index = SectionIndexMap.lookup(&Section); - write(*F, Index); - } + computeIndexMap(Asm, Sections, SectionIndexMap, RevGroupMap); } void ELFObjectWriter::writeSection(MCAssembler &Asm, @@ -1572,19 +1587,15 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, SectionIndexMapTy SectionIndexMap; CompressDebugSections(Asm, const_cast(Layout)); + std::vector Sections; createIndexedSections(Asm, const_cast(Layout), RevGroupMap, - SectionIndexMap); + Sections, SectionIndexMap); // Compute symbol table information. computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap); WriteRelocations(Asm, const_cast(Layout)); - std::vector Sections; - Sections.resize(SectionIndexMap.size()); - for (auto &Pair : SectionIndexMap) - Sections[Pair.second - 1] = Pair.first; - CreateMetadataSections(const_cast(Asm), const_cast(Layout), Sections); -- 2.7.4