diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2015-02-13 07:52:39 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2015-02-13 07:52:39 +0000 |
commit | d99f427e31377e93cf40690cb521850a2b755233 (patch) | |
tree | 8d9813019fc24462da325057a31918e06c2f0a99 /llvm/lib/MC/ELFObjectWriter.cpp | |
parent | 191b57478e2bdb46d2c2155ba3e3fe19f2e5d731 (diff) | |
download | bcm5719-llvm-d99f427e31377e93cf40690cb521850a2b755233.tar.gz bcm5719-llvm-d99f427e31377e93cf40690cb521850a2b755233.zip |
Revert a series of commits starting at r228886 which is triggering some
regressions for LLDB on Linux. Rafael indicated on lldb-dev that we
should just go ahead and revert these but that he wasn't at a computer.
The patches backed out are as follows:
r228980: Add support for having multiple sections with the name and ...
r228889: Invert the section relocation map.
r228888: Use the existing SymbolTableIndex intsead of doing a lookup.
r228886: Create the Section -> Rel Section map when it is first needed.
These patches look pretty nice to me, so hoping its not too hard to get
them re-instated. =D
llvm-svn: 229080
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 153 |
1 files changed, 82 insertions, 71 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index b4948e659fb..600d06472fc 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -247,12 +247,11 @@ class ELFObjectWriter : public MCObjectWriter { const RevGroupMapTy &RevGroupMap, unsigned NumRegularSections); - void computeIndexMap(MCAssembler &Asm, + void ComputeIndexMap(MCAssembler &Asm, SectionIndexMapTy &SectionIndexMap, - RelMapTy &RelMap); + const RelMapTy &RelMap); - MCSectionData *createRelocationSection(MCAssembler &Asm, - const MCSectionData &SD); + void CreateRelocationSections(MCAssembler &Asm, RelMapTy &RelMap); void CompressDebugSections(MCAssembler &Asm, MCAsmLayout &Layout); @@ -264,19 +263,18 @@ class ELFObjectWriter : public MCObjectWriter { // Create the sections that show up in the symbol table. Currently // those are the .note.GNU-stack section and the group sections. - void createIndexedSections(MCAssembler &Asm, MCAsmLayout &Layout, + void CreateIndexedSections(MCAssembler &Asm, MCAsmLayout &Layout, GroupMapTy &GroupMap, RevGroupMapTy &RevGroupMap, SectionIndexMapTy &SectionIndexMap, - RelMapTy &RelMap); + const RelMapTy &RelMap); void ExecutePostLayoutBinding(MCAssembler &Asm, const MCAsmLayout &Layout) override; - void writeSectionHeader(MCAssembler &Asm, const GroupMapTy &GroupMap, + void WriteSectionHeader(MCAssembler &Asm, const GroupMapTy &GroupMap, const MCAsmLayout &Layout, const SectionIndexMapTy &SectionIndexMap, - const RelMapTy &RelMap, const SectionOffsetMapTy &SectionOffsetMap); void ComputeSectionOrder(MCAssembler &Asm, @@ -299,9 +297,8 @@ class ELFObjectWriter : public MCObjectWriter { bool IsPCRel) const override; void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override; - void writeSection(MCAssembler &Asm, + void WriteSection(MCAssembler &Asm, const SectionIndexMapTy &SectionIndexMap, - const RelMapTy &RelMap, uint32_t GroupSymbolIndex, uint64_t Offset, uint64_t Size, uint64_t Alignment, const MCSectionELF &Section); @@ -944,9 +941,9 @@ bool ELFObjectWriter::isLocal(const MCSymbolData &Data, bool isUsedInReloc) { return true; } -void ELFObjectWriter::computeIndexMap(MCAssembler &Asm, +void ELFObjectWriter::ComputeIndexMap(MCAssembler &Asm, SectionIndexMapTy &SectionIndexMap, - RelMapTy &RelMap) { + const RelMapTy &RelMap) { unsigned Index = 1; for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it) { @@ -959,20 +956,16 @@ void ELFObjectWriter::computeIndexMap(MCAssembler &Asm, for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it) { - const MCSectionData &SD = *it; const MCSectionELF &Section = - static_cast<const MCSectionELF &>(SD.getSection()); + static_cast<const MCSectionELF &>(it->getSection()); if (Section.getType() == ELF::SHT_GROUP || Section.getType() == ELF::SHT_REL || Section.getType() == ELF::SHT_RELA) continue; SectionIndexMap[&Section] = Index++; - if (MCSectionData *RelSD = createRelocationSection(Asm, SD)) { - const MCSectionELF *RelSection = - static_cast<const MCSectionELF *>(&RelSD->getSection()); - RelMap[RelSection] = &Section; + const MCSectionELF *RelSection = RelMap.lookup(&Section); + if (RelSection) SectionIndexMap[RelSection] = Index++; - } } } @@ -1122,37 +1115,42 @@ ELFObjectWriter::computeSymbolTable(MCAssembler &Asm, const MCAsmLayout &Layout, UndefinedSymbolData[i].SymbolData->setIndex(Index++); } -MCSectionData * -ELFObjectWriter::createRelocationSection(MCAssembler &Asm, - const MCSectionData &SD) { - if (Relocations[&SD].empty()) - return nullptr; +void ELFObjectWriter::CreateRelocationSections(MCAssembler &Asm, + RelMapTy &RelMap) { + for (MCAssembler::const_iterator it = Asm.begin(), + ie = Asm.end(); it != ie; ++it) { + const MCSectionData &SD = *it; + if (Relocations[&SD].empty()) + continue; - MCContext &Ctx = Asm.getContext(); - const MCSectionELF &Section = - static_cast<const MCSectionELF &>(SD.getSection()); + MCContext &Ctx = Asm.getContext(); + const MCSectionELF &Section = + static_cast<const MCSectionELF&>(SD.getSection()); - const StringRef SectionName = Section.getSectionName(); - std::string RelaSectionName = hasRelocationAddend() ? ".rela" : ".rel"; - RelaSectionName += SectionName; + const StringRef SectionName = Section.getSectionName(); + std::string RelaSectionName = hasRelocationAddend() ? ".rela" : ".rel"; + RelaSectionName += SectionName; - unsigned EntrySize; - if (hasRelocationAddend()) - EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rela) : sizeof(ELF::Elf32_Rela); - else - EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rel) : sizeof(ELF::Elf32_Rel); + unsigned EntrySize; + if (hasRelocationAddend()) + EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rela) : sizeof(ELF::Elf32_Rela); + else + EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rel) : sizeof(ELF::Elf32_Rel); - unsigned Flags = 0; - StringRef Group = ""; - if (Section.getFlags() & ELF::SHF_GROUP) { - Flags = ELF::SHF_GROUP; - Group = Section.getGroup()->getName(); - } + unsigned Flags = 0; + StringRef Group = ""; + if (Section.getFlags() & ELF::SHF_GROUP) { + Flags = ELF::SHF_GROUP; + Group = Section.getGroup()->getName(); + } - const MCSectionELF *RelaSection = Ctx.getELFSection( - RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL, - Flags, EntrySize, Group, true); - return &Asm.getOrCreateSectionData(*RelaSection); + const MCSectionELF *RelaSection = + Ctx.getELFSection(RelaSectionName, hasRelocationAddend() ? + ELF::SHT_RELA : ELF::SHT_REL, Flags, + EntrySize, Group); + RelMap[&Section] = RelaSection; + Asm.getOrCreateSectionData(*RelaSection); + } } static SmallVector<char, 128> @@ -1302,21 +1300,20 @@ void ELFObjectWriter::CompressDebugSections(MCAssembler &Asm, void ELFObjectWriter::WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout, const RelMapTy &RelMap) { - for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it) { - MCSectionData &RelSD = *it; - const MCSectionELF &RelSection = - static_cast<const MCSectionELF &>(RelSD.getSection()); + for (MCAssembler::const_iterator it = Asm.begin(), + ie = Asm.end(); it != ie; ++it) { + const MCSectionData &SD = *it; + const MCSectionELF &Section = + static_cast<const MCSectionELF&>(SD.getSection()); - unsigned Type = RelSection.getType(); - if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA) + const MCSectionELF *RelaSection = RelMap.lookup(&Section); + if (!RelaSection) continue; + MCSectionData &RelaSD = Asm.getOrCreateSectionData(*RelaSection); + RelaSD.setAlignment(is64Bit() ? 8 : 4); - const MCSectionELF *Section = RelMap.lookup(&RelSection); - MCSectionData &SD = Asm.getOrCreateSectionData(*Section); - RelSD.setAlignment(is64Bit() ? 8 : 4); - - MCDataFragment *F = new MCDataFragment(&RelSD); - WriteRelocationsFragment(Asm, F, &SD); + MCDataFragment *F = new MCDataFragment(&RelaSD); + WriteRelocationsFragment(Asm, F, &*it); } } @@ -1448,12 +1445,12 @@ void ELFObjectWriter::CreateMetadataSections( ShStrTabBuilder.data().end()); } -void ELFObjectWriter::createIndexedSections(MCAssembler &Asm, +void ELFObjectWriter::CreateIndexedSections(MCAssembler &Asm, MCAsmLayout &Layout, GroupMapTy &GroupMap, RevGroupMapTy &RevGroupMap, SectionIndexMapTy &SectionIndexMap, - RelMapTy &RelMap) { + const RelMapTy &RelMap) { MCContext &Ctx = Asm.getContext(); // Build the groups @@ -1477,7 +1474,7 @@ void ELFObjectWriter::createIndexedSections(MCAssembler &Asm, GroupMap[Group] = SignatureSymbol; } - computeIndexMap(Asm, SectionIndexMap, RelMap); + ComputeIndexMap(Asm, SectionIndexMap, RelMap); // Add sections to the groups for (MCAssembler::const_iterator it = Asm.begin(), ie = Asm.end(); @@ -1495,9 +1492,8 @@ void ELFObjectWriter::createIndexedSections(MCAssembler &Asm, } } -void ELFObjectWriter::writeSection(MCAssembler &Asm, +void ELFObjectWriter::WriteSection(MCAssembler &Asm, const SectionIndexMapTy &SectionIndexMap, - const RelMapTy &RelMap, uint32_t GroupSymbolIndex, uint64_t Offset, uint64_t Size, uint64_t Alignment, @@ -1513,9 +1509,21 @@ void ELFObjectWriter::writeSection(MCAssembler &Asm, case ELF::SHT_REL: case ELF::SHT_RELA: { - sh_link = SymbolTableIndex; + const MCSectionELF *SymtabSection; + const MCSectionELF *InfoSection; + SymtabSection = + Asm.getContext().getELFSection(".symtab", ELF::SHT_SYMTAB, 0); + sh_link = SectionIndexMap.lookup(SymtabSection); assert(sh_link && ".symtab not found"); - const MCSectionELF *InfoSection = RelMap.find(&Section)->second; + + // Remove ".rel" and ".rela" prefixes. + unsigned SecNameLen = (Section.getType() == ELF::SHT_REL) ? 4 : 5; + StringRef SectionName = Section.getSectionName().substr(SecNameLen); + StringRef GroupName = + Section.getGroup() ? Section.getGroup()->getName() : ""; + + InfoSection = Asm.getContext().getELFSection(SectionName, ELF::SHT_PROGBITS, + 0, 0, GroupName); sh_info = SectionIndexMap.lookup(InfoSection); break; } @@ -1626,10 +1634,11 @@ void ELFObjectWriter::WriteDataSectionData(MCAssembler &Asm, } } -void ELFObjectWriter::writeSectionHeader( - MCAssembler &Asm, const GroupMapTy &GroupMap, const MCAsmLayout &Layout, - const SectionIndexMapTy &SectionIndexMap, const RelMapTy &RelMap, - const SectionOffsetMapTy &SectionOffsetMap) { +void ELFObjectWriter::WriteSectionHeader(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; @@ -1660,7 +1669,7 @@ void ELFObjectWriter::writeSectionHeader( uint64_t Size = GetSectionAddressSize(Layout, SD); - writeSection(Asm, SectionIndexMap, RelMap, GroupSymbolIndex, + WriteSection(Asm, SectionIndexMap, GroupSymbolIndex, SectionOffsetMap.lookup(&Section), Size, SD.getAlignment(), Section); } @@ -1707,8 +1716,10 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, CompressDebugSections(Asm, const_cast<MCAsmLayout &>(Layout)); DenseMap<const MCSectionELF*, const MCSectionELF*> RelMap; + CreateRelocationSections(Asm, RelMap); + const unsigned NumUserAndRelocSections = Asm.size(); - createIndexedSections(Asm, const_cast<MCAsmLayout&>(Layout), GroupMap, + CreateIndexedSections(Asm, const_cast<MCAsmLayout&>(Layout), GroupMap, RevGroupMap, SectionIndexMap, RelMap); const unsigned AllSections = Asm.size(); const unsigned NumIndexedSections = AllSections - NumUserAndRelocSections; @@ -1780,7 +1791,7 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm, WriteZeros(Padding); // ... then the section header table ... - writeSectionHeader(Asm, GroupMap, Layout, SectionIndexMap, RelMap, + WriteSectionHeader(Asm, GroupMap, Layout, SectionIndexMap, SectionOffsetMap); // ... and then the remaining sections ... |