mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-04 02:47:25 +00:00
Special case the creation of relocation sections.
These sections are never looked up and we know when have to create them. Use that to save adding them to the regular map and avoid a symbol->string->symbol conversion for the group symbol. This also makes the implementation independent of the details of how unique sections are implemented. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233539 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
35efeb5e16
commit
0bd11cd898
@ -194,6 +194,7 @@ namespace llvm {
|
||||
StringMap<const MCSectionMachO*> MachOUniquingMap;
|
||||
std::map<ELFSectionKey, const MCSectionELF *> ELFUniquingMap;
|
||||
std::map<COFFSectionKey, const MCSectionCOFF *> COFFUniquingMap;
|
||||
StringMap<bool> ELFRelSecNames;
|
||||
|
||||
/// Do automatic reset in destructor
|
||||
bool AutoReset;
|
||||
@ -304,6 +305,10 @@ namespace llvm {
|
||||
StringRef Group, bool Unique,
|
||||
const char *BeginSymName = nullptr);
|
||||
|
||||
const MCSectionELF *createELFRelSection(StringRef Name, unsigned Type,
|
||||
unsigned Flags, unsigned EntrySize,
|
||||
const MCSymbol *Group);
|
||||
|
||||
void renameELFSection(const MCSectionELF *Section, StringRef Name);
|
||||
|
||||
const MCSectionELF *CreateELFGroupSection();
|
||||
|
@ -1167,15 +1167,12 @@ ELFObjectWriter::createRelocationSection(MCAssembler &Asm,
|
||||
EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rel) : sizeof(ELF::Elf32_Rel);
|
||||
|
||||
unsigned Flags = 0;
|
||||
StringRef Group = "";
|
||||
if (Section.getFlags() & ELF::SHF_GROUP) {
|
||||
if (Section.getFlags() & ELF::SHF_GROUP)
|
||||
Flags = ELF::SHF_GROUP;
|
||||
Group = Section.getGroup()->getName();
|
||||
}
|
||||
|
||||
const MCSectionELF *RelaSection = Ctx.getELFSection(
|
||||
const MCSectionELF *RelaSection = Ctx.createELFRelSection(
|
||||
RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL,
|
||||
Flags, EntrySize, Group, true);
|
||||
Flags, EntrySize, Section.getGroup());
|
||||
return &Asm.getOrCreateSectionData(*RelaSection);
|
||||
}
|
||||
|
||||
|
@ -275,6 +275,18 @@ void MCContext::renameELFSection(const MCSectionELF *Section, StringRef Name) {
|
||||
const_cast<MCSectionELF*>(Section)->setSectionName(CachedName);
|
||||
}
|
||||
|
||||
const MCSectionELF *
|
||||
MCContext::createELFRelSection(StringRef Name, unsigned Type, unsigned Flags,
|
||||
unsigned EntrySize, const MCSymbol *Group) {
|
||||
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);
|
||||
}
|
||||
|
||||
const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
|
||||
unsigned Flags, unsigned EntrySize,
|
||||
StringRef Group, bool Unique,
|
||||
|
Loading…
x
Reference in New Issue
Block a user