[llvm] r228886 - Create the Seciton -> Rel Section map when it is first needed. NFC.
Rafael Espindola
rafael.espindola at gmail.com
Wed Feb 11 15:17:48 PST 2015
Author: rafael
Date: Wed Feb 11 17:17:48 2015
New Revision: 228886
URL: http://llvm.org/viewvc/llvm-project?rev=228886&view=rev
Log:
Create the Seciton -> Rel Section map when it is first needed. NFC.
Saves a walk over every section.
Modified:
llvm/trunk/lib/MC/ELFObjectWriter.cpp
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=228886&r1=228885&r2=228886&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Wed Feb 11 17:17:48 2015
@@ -247,11 +247,12 @@ class ELFObjectWriter : public MCObjectW
const RevGroupMapTy &RevGroupMap,
unsigned NumRegularSections);
- void ComputeIndexMap(MCAssembler &Asm,
+ void computeIndexMap(MCAssembler &Asm,
SectionIndexMapTy &SectionIndexMap,
- const RelMapTy &RelMap);
+ RelMapTy &RelMap);
- void CreateRelocationSections(MCAssembler &Asm, RelMapTy &RelMap);
+ MCSectionData *createRelocationSection(MCAssembler &Asm,
+ const MCSectionData &SD);
void CompressDebugSections(MCAssembler &Asm, MCAsmLayout &Layout);
@@ -263,11 +264,11 @@ class ELFObjectWriter : public MCObjectW
// 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,
- const RelMapTy &RelMap);
+ RelMapTy &RelMap);
void ExecutePostLayoutBinding(MCAssembler &Asm,
const MCAsmLayout &Layout) override;
@@ -941,9 +942,9 @@ bool ELFObjectWriter::isLocal(const MCSy
return true;
}
-void ELFObjectWriter::ComputeIndexMap(MCAssembler &Asm,
+void ELFObjectWriter::computeIndexMap(MCAssembler &Asm,
SectionIndexMapTy &SectionIndexMap,
- const RelMapTy &RelMap) {
+ RelMapTy &RelMap) {
unsigned Index = 1;
for (MCAssembler::iterator it = Asm.begin(),
ie = Asm.end(); it != ie; ++it) {
@@ -956,16 +957,20 @@ void ELFObjectWriter::ComputeIndexMap(MC
for (MCAssembler::iterator it = Asm.begin(),
ie = Asm.end(); it != ie; ++it) {
+ const MCSectionData &SD = *it;
const MCSectionELF &Section =
- static_cast<const MCSectionELF &>(it->getSection());
+ static_cast<const MCSectionELF &>(SD.getSection());
if (Section.getType() == ELF::SHT_GROUP ||
Section.getType() == ELF::SHT_REL ||
Section.getType() == ELF::SHT_RELA)
continue;
SectionIndexMap[&Section] = Index++;
- const MCSectionELF *RelSection = RelMap.lookup(&Section);
- if (RelSection)
+ if (MCSectionData *RelSD = createRelocationSection(Asm, SD)) {
+ const MCSectionELF *RelSection =
+ static_cast<const MCSectionELF *>(&RelSD->getSection());
+ RelMap[&Section] = RelSection;
SectionIndexMap[RelSection] = Index++;
+ }
}
}
@@ -1115,42 +1120,37 @@ ELFObjectWriter::computeSymbolTable(MCAs
UndefinedSymbolData[i].SymbolData->setIndex(Index++);
}
-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());
+MCSectionData *
+ELFObjectWriter::createRelocationSection(MCAssembler &Asm,
+ const MCSectionData &SD) {
+ if (Relocations[&SD].empty())
+ return nullptr;
- 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);
+ MCContext &Ctx = Asm.getContext();
+ const MCSectionELF &Section =
+ static_cast<const MCSectionELF &>(SD.getSection());
- unsigned Flags = 0;
- StringRef Group = "";
- if (Section.getFlags() & ELF::SHF_GROUP) {
- Flags = ELF::SHF_GROUP;
- Group = Section.getGroup()->getName();
- }
+ 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);
- const MCSectionELF *RelaSection =
- Ctx.getELFSection(RelaSectionName, hasRelocationAddend() ?
- ELF::SHT_RELA : ELF::SHT_REL, Flags,
- EntrySize, Group);
- RelMap[&Section] = RelaSection;
- Asm.getOrCreateSectionData(*RelaSection);
+ 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);
+ return &Asm.getOrCreateSectionData(*RelaSection);
}
static SmallVector<char, 128>
@@ -1445,12 +1445,12 @@ void ELFObjectWriter::CreateMetadataSect
ShStrTabBuilder.data().end());
}
-void ELFObjectWriter::CreateIndexedSections(MCAssembler &Asm,
+void ELFObjectWriter::createIndexedSections(MCAssembler &Asm,
MCAsmLayout &Layout,
GroupMapTy &GroupMap,
RevGroupMapTy &RevGroupMap,
SectionIndexMapTy &SectionIndexMap,
- const RelMapTy &RelMap) {
+ RelMapTy &RelMap) {
MCContext &Ctx = Asm.getContext();
// Build the groups
@@ -1474,7 +1474,7 @@ void ELFObjectWriter::CreateIndexedSecti
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();
@@ -1716,10 +1716,8 @@ void ELFObjectWriter::WriteObject(MCAsse
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;
More information about the llvm-commits
mailing list