From: Rafael Espindola Date: Thu, 21 May 2015 20:43:13 +0000 (+0000) Subject: Stop creating MCSectionData is the ELF writer. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=fabbc4985b85bf4adedff9f67f78172127ab154c Stop creating MCSectionData is the ELF writer. Now is is just its use of MCSymbolData that requires it to take a non const MCAssembler. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237951 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 7437aff3120..0e764de7d8d 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -221,7 +221,7 @@ class ELFObjectWriter : public MCObjectWriter { const SectionIndexMapTy &SectionIndexMap, const RevGroupMapTy &RevGroupMap); - MCSectionELF *createRelocationSection(MCAssembler &Asm, + MCSectionELF *createRelocationSection(MCContext &Ctx, const MCSectionELF &Sec); const MCSectionELF *createSectionHeaderStringTable(); @@ -1058,12 +1058,11 @@ void ELFObjectWriter::computeSymbolTable( } MCSectionELF * -ELFObjectWriter::createRelocationSection(MCAssembler &Asm, +ELFObjectWriter::createRelocationSection(MCContext &Ctx, const MCSectionELF &Sec) { if (Relocations[&Sec].empty()) return nullptr; - MCContext &Ctx = Asm.getContext(); const StringRef SectionName = Sec.getSectionName(); std::string RelaSectionName = hasRelocationAddend() ? ".rela" : ".rel"; RelaSectionName += SectionName; @@ -1081,8 +1080,7 @@ ELFObjectWriter::createRelocationSection(MCAssembler &Asm, MCSectionELF *RelaSection = Ctx.createELFRelSection( RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL, Flags, EntrySize, Sec.getGroup(), &Sec); - MCSectionData &RelSD = Asm.getOrCreateSectionData(*RelaSection); - RelSD.setAlignment(is64Bit() ? 8 : 4); + RelaSection->setAlignment(is64Bit() ? 8 : 4); return RelaSection; } @@ -1344,7 +1342,8 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, // ... then the sections ... SectionOffsetsTy SectionOffsets; - bool ComputedSymtab = false; + std::vector Groups; + std::vector Relocations; for (const MCSectionData &SD : Asm) { MCSectionELF &Section = static_cast(SD.getSection()); @@ -1355,32 +1354,12 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, uint64_t SecStart = OS.tell(); const MCSymbol *SignatureSymbol = Section.getGroup(); - unsigned Type = Section.getType(); - if (Type == ELF::SHT_GROUP) { - assert(SignatureSymbol); - write(uint32_t(ELF::GRP_COMDAT)); - for (const MCSectionELF *Member : GroupMembers[SignatureSymbol]) { - uint32_t SecIndex = SectionIndexMap.lookup(Member); - write(SecIndex); - } - } else if (Type == ELF::SHT_REL || Type == ELF::SHT_RELA) { - if (!ComputedSymtab) { - // Compute symbol table information. - computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap); - ComputedSymtab = true; - } - writeRelocations(Asm, *Section.getAssociatedSection()); - } else { - writeSectionData(Asm, SD, Layout); - } + writeSectionData(Asm, SD, Layout); uint64_t SecEnd = OS.tell(); SectionOffsets[&Section] = std::make_pair(SecStart, SecEnd); - if (Type == ELF::SHT_GROUP || Type == ELF::SHT_REL || Type == ELF::SHT_RELA) - continue; - - MCSectionELF *RelSection = createRelocationSection(Asm, Section); + MCSectionELF *RelSection = createRelocationSection(Ctx, Section); if (SignatureSymbol) { Asm.getOrCreateSymbolData(*SignatureSymbol); @@ -1388,8 +1367,8 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, if (!GroupIdx) { MCSectionELF *Group = Ctx.createELFGroupSection(SignatureSymbol); GroupIdx = addToSectionTable(Group); - MCSectionData *GroupD = &Asm.getOrCreateSectionData(*Group); - GroupD->setAlignment(4); + Group->setAlignment(4); + Groups.push_back(Group); } GroupMembers[SignatureSymbol].push_back(&Section); if (RelSection) @@ -1397,14 +1376,45 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, } SectionIndexMap[&Section] = addToSectionTable(&Section); - if (RelSection) + if (RelSection) { SectionIndexMap[RelSection] = addToSectionTable(RelSection); + Relocations.push_back(RelSection); + } + } + + for (MCSectionELF *Group : Groups) { + uint64_t Padding = OffsetToAlignment(OS.tell(), Group->getAlignment()); + WriteZeros(Padding); + + // Remember the offset into the file for this section. + uint64_t SecStart = OS.tell(); + + const MCSymbol *SignatureSymbol = Group->getGroup(); + assert(SignatureSymbol); + write(uint32_t(ELF::GRP_COMDAT)); + for (const MCSectionELF *Member : GroupMembers[SignatureSymbol]) { + uint32_t SecIndex = SectionIndexMap.lookup(Member); + write(SecIndex); + } + + uint64_t SecEnd = OS.tell(); + SectionOffsets[Group] = std::make_pair(SecStart, SecEnd); } - if (!ComputedSymtab) { - // Compute symbol table information. - computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap); - ComputedSymtab = true; + // Compute symbol table information. + computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap); + + for (MCSectionELF *RelSection : Relocations) { + uint64_t Padding = OffsetToAlignment(OS.tell(), RelSection->getAlignment()); + WriteZeros(Padding); + + // Remember the offset into the file for this section. + uint64_t SecStart = OS.tell(); + + writeRelocations(Asm, *RelSection->getAssociatedSection()); + + uint64_t SecEnd = OS.tell(); + SectionOffsets[RelSection] = std::make_pair(SecStart, SecEnd); } writeSymbolTable(Ctx, Layout, SectionOffsets);