mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-29 15:37:46 +00:00
Simplify mapping from relocation sections to relocated sections.
Just store the section in MCSectionELF. This avoids multiple hash lookups. This will also be used by ARM_EXIDX. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234139 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d0440d2705
commit
01183f6492
@ -336,7 +336,8 @@ namespace llvm {
|
||||
|
||||
const MCSectionELF *createELFRelSection(StringRef Name, unsigned Type,
|
||||
unsigned Flags, unsigned EntrySize,
|
||||
const MCSymbol *Group);
|
||||
const MCSymbol *Group,
|
||||
const MCSectionELF *Associated);
|
||||
|
||||
void renameELFSection(const MCSectionELF *Section, StringRef Name);
|
||||
|
||||
|
@ -48,13 +48,17 @@ class MCSectionELF : public MCSection {
|
||||
|
||||
const MCSymbol *Group;
|
||||
|
||||
/// Depending on the type of the section this is sh_link or sh_info.
|
||||
const MCSectionELF *Associated;
|
||||
|
||||
private:
|
||||
friend class MCContext;
|
||||
MCSectionELF(StringRef Section, unsigned type, unsigned flags, SectionKind K,
|
||||
unsigned entrySize, const MCSymbol *group, unsigned UniqueID,
|
||||
MCSymbol *Begin)
|
||||
MCSymbol *Begin, const MCSectionELF *Associated)
|
||||
: MCSection(SV_ELF, K, Begin), SectionName(Section), Type(type),
|
||||
Flags(flags), UniqueID(UniqueID), EntrySize(entrySize), Group(group) {}
|
||||
Flags(flags), UniqueID(UniqueID), EntrySize(entrySize), Group(group),
|
||||
Associated(Associated) {}
|
||||
~MCSectionELF();
|
||||
|
||||
void setSectionName(StringRef Name) { SectionName = Name; }
|
||||
@ -79,6 +83,8 @@ public:
|
||||
bool isUnique() const { return UniqueID != ~0U; }
|
||||
unsigned getUniqueID() const { return UniqueID; }
|
||||
|
||||
const MCSectionELF *getAssociatedSection() const { return Associated; }
|
||||
|
||||
static bool classof(const MCSection *S) {
|
||||
return S->getVariant() == SV_ELF;
|
||||
}
|
||||
|
@ -245,8 +245,6 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
typedef DenseMap<const MCSectionELF*, const MCSymbol*> GroupMapTy;
|
||||
// Map from a signature symbol to the group section
|
||||
typedef DenseMap<const MCSymbol*, const MCSectionELF*> RevGroupMapTy;
|
||||
// Map from a section to the section with the relocations
|
||||
typedef DenseMap<const MCSectionELF*, const MCSectionELF*> RelMapTy;
|
||||
// Map from a section to its offset
|
||||
typedef DenseMap<const MCSectionELF*, uint64_t> SectionOffsetMapTy;
|
||||
|
||||
@ -261,17 +259,14 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
const RevGroupMapTy &RevGroupMap,
|
||||
unsigned NumRegularSections);
|
||||
|
||||
void computeIndexMap(MCAssembler &Asm,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap);
|
||||
void computeIndexMap(MCAssembler &Asm, SectionIndexMapTy &SectionIndexMap);
|
||||
|
||||
MCSectionData *createRelocationSection(MCAssembler &Asm,
|
||||
const MCSectionData &SD);
|
||||
|
||||
void CompressDebugSections(MCAssembler &Asm, MCAsmLayout &Layout);
|
||||
|
||||
void WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout,
|
||||
const RelMapTy &RelMap);
|
||||
void WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout);
|
||||
|
||||
void CreateMetadataSections(MCAssembler &Asm, MCAsmLayout &Layout,
|
||||
SectionIndexMapTy &SectionIndexMap);
|
||||
@ -279,10 +274,8 @@ 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,
|
||||
GroupMapTy &GroupMap,
|
||||
RevGroupMapTy &RevGroupMap,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap);
|
||||
GroupMapTy &GroupMap, RevGroupMapTy &RevGroupMap,
|
||||
SectionIndexMapTy &SectionIndexMap);
|
||||
|
||||
void ExecutePostLayoutBinding(MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout) override;
|
||||
@ -290,7 +283,6 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
void writeSectionHeader(MCAssembler &Asm, const GroupMapTy &GroupMap,
|
||||
const MCAsmLayout &Layout,
|
||||
const SectionIndexMapTy &SectionIndexMap,
|
||||
const RelMapTy &RelMap,
|
||||
const SectionOffsetMapTy &SectionOffsetMap);
|
||||
|
||||
void ComputeSectionOrder(MCAssembler &Asm,
|
||||
@ -317,7 +309,6 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override;
|
||||
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);
|
||||
@ -969,8 +960,7 @@ bool ELFObjectWriter::isLocal(const MCSymbolData &Data, bool isUsedInReloc) {
|
||||
}
|
||||
|
||||
void ELFObjectWriter::computeIndexMap(MCAssembler &Asm,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap) {
|
||||
SectionIndexMapTy &SectionIndexMap) {
|
||||
unsigned Index = 1;
|
||||
for (MCAssembler::iterator it = Asm.begin(),
|
||||
ie = Asm.end(); it != ie; ++it) {
|
||||
@ -994,7 +984,6 @@ void ELFObjectWriter::computeIndexMap(MCAssembler &Asm,
|
||||
if (MCSectionData *RelSD = createRelocationSection(Asm, SD)) {
|
||||
const MCSectionELF *RelSection =
|
||||
static_cast<const MCSectionELF *>(&RelSD->getSection());
|
||||
RelMap[RelSection] = &Section;
|
||||
SectionIndexMap[RelSection] = Index++;
|
||||
}
|
||||
}
|
||||
@ -1172,7 +1161,7 @@ ELFObjectWriter::createRelocationSection(MCAssembler &Asm,
|
||||
|
||||
const MCSectionELF *RelaSection = Ctx.createELFRelSection(
|
||||
RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL,
|
||||
Flags, EntrySize, Section.getGroup());
|
||||
Flags, EntrySize, Section.getGroup(), &Section);
|
||||
return &Asm.getOrCreateSectionData(*RelaSection);
|
||||
}
|
||||
|
||||
@ -1321,8 +1310,7 @@ void ELFObjectWriter::CompressDebugSections(MCAssembler &Asm,
|
||||
}
|
||||
}
|
||||
|
||||
void ELFObjectWriter::WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout,
|
||||
const RelMapTy &RelMap) {
|
||||
void ELFObjectWriter::WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout) {
|
||||
for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it) {
|
||||
MCSectionData &RelSD = *it;
|
||||
const MCSectionELF &RelSection =
|
||||
@ -1332,7 +1320,7 @@ void ELFObjectWriter::WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout,
|
||||
if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA)
|
||||
continue;
|
||||
|
||||
const MCSectionELF *Section = RelMap.lookup(&RelSection);
|
||||
const MCSectionELF *Section = RelSection.getAssociatedSection();
|
||||
MCSectionData &SD = Asm.getOrCreateSectionData(*Section);
|
||||
RelSD.setAlignment(is64Bit() ? 8 : 4);
|
||||
|
||||
@ -1470,12 +1458,9 @@ void ELFObjectWriter::CreateMetadataSections(
|
||||
ShStrTabBuilder.data().end());
|
||||
}
|
||||
|
||||
void ELFObjectWriter::createIndexedSections(MCAssembler &Asm,
|
||||
MCAsmLayout &Layout,
|
||||
GroupMapTy &GroupMap,
|
||||
RevGroupMapTy &RevGroupMap,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap) {
|
||||
void ELFObjectWriter::createIndexedSections(
|
||||
MCAssembler &Asm, MCAsmLayout &Layout, GroupMapTy &GroupMap,
|
||||
RevGroupMapTy &RevGroupMap, SectionIndexMapTy &SectionIndexMap) {
|
||||
MCContext &Ctx = Asm.getContext();
|
||||
|
||||
// Build the groups
|
||||
@ -1499,7 +1484,7 @@ void ELFObjectWriter::createIndexedSections(MCAssembler &Asm,
|
||||
GroupMap[Group] = SignatureSymbol;
|
||||
}
|
||||
|
||||
computeIndexMap(Asm, SectionIndexMap, RelMap);
|
||||
computeIndexMap(Asm, SectionIndexMap);
|
||||
|
||||
// Add sections to the groups
|
||||
for (MCAssembler::const_iterator it = Asm.begin(), ie = Asm.end();
|
||||
@ -1519,7 +1504,6 @@ void ELFObjectWriter::createIndexedSections(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,
|
||||
@ -1537,7 +1521,7 @@ void ELFObjectWriter::writeSection(MCAssembler &Asm,
|
||||
case ELF::SHT_RELA: {
|
||||
sh_link = SymbolTableIndex;
|
||||
assert(sh_link && ".symtab not found");
|
||||
const MCSectionELF *InfoSection = RelMap.find(&Section)->second;
|
||||
const MCSectionELF *InfoSection = Section.getAssociatedSection();
|
||||
sh_info = SectionIndexMap.lookup(InfoSection);
|
||||
break;
|
||||
}
|
||||
@ -1650,7 +1634,7 @@ void ELFObjectWriter::WriteDataSectionData(MCAssembler &Asm,
|
||||
|
||||
void ELFObjectWriter::writeSectionHeader(
|
||||
MCAssembler &Asm, const GroupMapTy &GroupMap, const MCAsmLayout &Layout,
|
||||
const SectionIndexMapTy &SectionIndexMap, const RelMapTy &RelMap,
|
||||
const SectionIndexMapTy &SectionIndexMap,
|
||||
const SectionOffsetMapTy &SectionOffsetMap) {
|
||||
const unsigned NumSections = Asm.size() + 1;
|
||||
|
||||
@ -1682,9 +1666,9 @@ void ELFObjectWriter::writeSectionHeader(
|
||||
|
||||
uint64_t Size = GetSectionAddressSize(Layout, SD);
|
||||
|
||||
writeSection(Asm, SectionIndexMap, RelMap, GroupSymbolIndex,
|
||||
SectionOffsetMap.lookup(&Section), Size,
|
||||
SD.getAlignment(), Section);
|
||||
writeSection(Asm, SectionIndexMap, GroupSymbolIndex,
|
||||
SectionOffsetMap.lookup(&Section), Size, SD.getAlignment(),
|
||||
Section);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1728,10 +1712,9 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
|
||||
CompressDebugSections(Asm, const_cast<MCAsmLayout &>(Layout));
|
||||
|
||||
DenseMap<const MCSectionELF*, const MCSectionELF*> RelMap;
|
||||
const unsigned NumUserAndRelocSections = Asm.size();
|
||||
createIndexedSections(Asm, const_cast<MCAsmLayout&>(Layout), GroupMap,
|
||||
RevGroupMap, SectionIndexMap, RelMap);
|
||||
createIndexedSections(Asm, const_cast<MCAsmLayout &>(Layout), GroupMap,
|
||||
RevGroupMap, SectionIndexMap);
|
||||
const unsigned AllSections = Asm.size();
|
||||
const unsigned NumIndexedSections = AllSections - NumUserAndRelocSections;
|
||||
|
||||
@ -1741,7 +1724,7 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
computeSymbolTable(Asm, Layout, SectionIndexMap, RevGroupMap,
|
||||
NumRegularSections);
|
||||
|
||||
WriteRelocations(Asm, const_cast<MCAsmLayout&>(Layout), RelMap);
|
||||
WriteRelocations(Asm, const_cast<MCAsmLayout &>(Layout));
|
||||
|
||||
CreateMetadataSections(const_cast<MCAssembler&>(Asm),
|
||||
const_cast<MCAsmLayout&>(Layout),
|
||||
@ -1802,8 +1785,7 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
WriteZeros(Padding);
|
||||
|
||||
// ... then the section header table ...
|
||||
writeSectionHeader(Asm, GroupMap, Layout, SectionIndexMap, RelMap,
|
||||
SectionOffsetMap);
|
||||
writeSectionHeader(Asm, GroupMap, Layout, SectionIndexMap, SectionOffsetMap);
|
||||
|
||||
// ... and then the remaining sections ...
|
||||
for (unsigned i = NumRegularSections + 1; i < NumSections; ++i)
|
||||
|
@ -279,14 +279,15 @@ void MCContext::renameELFSection(const MCSectionELF *Section, StringRef Name) {
|
||||
|
||||
const MCSectionELF *
|
||||
MCContext::createELFRelSection(StringRef Name, unsigned Type, unsigned Flags,
|
||||
unsigned EntrySize, const MCSymbol *Group) {
|
||||
unsigned EntrySize, const MCSymbol *Group,
|
||||
const MCSectionELF *Associated) {
|
||||
StringMap<bool>::iterator I;
|
||||
bool Inserted;
|
||||
std::tie(I, Inserted) = ELFRelSecNames.insert(std::make_pair(Name, true));
|
||||
|
||||
return new (*this)
|
||||
MCSectionELF(I->getKey(), Type, Flags, SectionKind::getReadOnly(),
|
||||
EntrySize, Group, true, nullptr);
|
||||
EntrySize, Group, true, nullptr, Associated);
|
||||
}
|
||||
|
||||
const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
|
||||
@ -318,8 +319,9 @@ const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
|
||||
if (BeginSymName)
|
||||
Begin = createTempSymbol(BeginSymName, false);
|
||||
|
||||
MCSectionELF *Result = new (*this) MCSectionELF(
|
||||
CachedName, Type, Flags, Kind, EntrySize, GroupSym, UniqueID, Begin);
|
||||
MCSectionELF *Result =
|
||||
new (*this) MCSectionELF(CachedName, Type, Flags, Kind, EntrySize,
|
||||
GroupSym, UniqueID, Begin, nullptr);
|
||||
Entry.second = Result;
|
||||
return Result;
|
||||
}
|
||||
@ -327,7 +329,7 @@ const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
|
||||
const MCSectionELF *MCContext::CreateELFGroupSection() {
|
||||
MCSectionELF *Result = new (*this)
|
||||
MCSectionELF(".group", ELF::SHT_GROUP, 0, SectionKind::getReadOnly(), 4,
|
||||
nullptr, ~0, nullptr);
|
||||
nullptr, ~0, nullptr, nullptr);
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user