From 0bd11cd898ae3bda83ed5cfd81335534954905f5 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 30 Mar 2015 13:39:16 +0000 Subject: [PATCH] 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 --- include/llvm/MC/MCContext.h | 5 +++++ lib/MC/ELFObjectWriter.cpp | 9 +++------ lib/MC/MCContext.cpp | 12 ++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index ca4eae53a88..a17e05d87c1 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -194,6 +194,7 @@ namespace llvm { StringMap MachOUniquingMap; std::map ELFUniquingMap; std::map COFFUniquingMap; + StringMap 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(); diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index c99a3ee5e26..6be37bfd641 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -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); } diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 09de4ee05e6..2afa21219fc 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -275,6 +275,18 @@ void MCContext::renameELFSection(const MCSectionELF *Section, StringRef Name) { const_cast(Section)->setSectionName(CachedName); } +const MCSectionELF * +MCContext::createELFRelSection(StringRef Name, unsigned Type, unsigned Flags, + unsigned EntrySize, const MCSymbol *Group) { + StringMap::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, -- 2.34.1