Use SpecificBumpPtrAllocator to simplify the MCSeciton destruction.

llvm-svn: 249589
This commit is contained in:
Rafael Espindola 2015-10-07 19:08:19 +00:00
parent 730c27894a
commit 4264e2d531
2 changed files with 15 additions and 14 deletions

View File

@ -71,6 +71,10 @@ namespace llvm {
/// objects. /// objects.
BumpPtrAllocator Allocator; BumpPtrAllocator Allocator;
SpecificBumpPtrAllocator<MCSectionCOFF> COFFAllocator;
SpecificBumpPtrAllocator<MCSectionELF> ELFAllocator;
SpecificBumpPtrAllocator<MCSectionMachO> MachOAllocator;
/// Bindings of names to symbols. /// Bindings of names to symbols.
SymbolTable Symbols; SymbolTable Symbols;

View File

@ -74,12 +74,9 @@ MCContext::~MCContext() {
void MCContext::reset() { void MCContext::reset() {
// Call the destructors so the fragments are freed // Call the destructors so the fragments are freed
for (auto &I : ELFUniquingMap) COFFAllocator.DestroyAll();
I.second->~MCSectionELF(); ELFAllocator.DestroyAll();
for (auto &I : COFFUniquingMap) MachOAllocator.DestroyAll();
I.second->~MCSectionCOFF();
for (auto &I : MachOUniquingMap)
I.second->~MCSectionMachO();
UsedNames.clear(); UsedNames.clear();
Symbols.clear(); Symbols.clear();
@ -294,8 +291,8 @@ MCSectionMachO *MCContext::getMachOSection(StringRef Segment, StringRef Section,
Begin = createTempSymbol(BeginSymName, false); Begin = createTempSymbol(BeginSymName, false);
// Otherwise, return a new section. // Otherwise, return a new section.
return Entry = new (*this) MCSectionMachO(Segment, Section, TypeAndAttributes, return Entry = new (MachOAllocator.Allocate()) MCSectionMachO(
Reserved2, Kind, Begin); Segment, Section, TypeAndAttributes, Reserved2, Kind, Begin);
} }
void MCContext::renameELFSection(MCSectionELF *Section, StringRef Name) { void MCContext::renameELFSection(MCSectionELF *Section, StringRef Name) {
@ -322,7 +319,7 @@ MCSectionELF *MCContext::createELFRelSection(StringRef Name, unsigned Type,
bool Inserted; bool Inserted;
std::tie(I, Inserted) = ELFRelSecNames.insert(std::make_pair(Name, true)); std::tie(I, Inserted) = ELFRelSecNames.insert(std::make_pair(Name, true));
return new (*this) return new (ELFAllocator.Allocate())
MCSectionELF(I->getKey(), Type, Flags, SectionKind::getReadOnly(), MCSectionELF(I->getKey(), Type, Flags, SectionKind::getReadOnly(),
EntrySize, Group, true, nullptr, Associated); EntrySize, Group, true, nullptr, Associated);
} }
@ -367,15 +364,15 @@ MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
if (BeginSymName) if (BeginSymName)
Begin = createTempSymbol(BeginSymName, false); Begin = createTempSymbol(BeginSymName, false);
MCSectionELF *Result = MCSectionELF *Result = new (ELFAllocator.Allocate())
new (*this) MCSectionELF(CachedName, Type, Flags, Kind, EntrySize, MCSectionELF(CachedName, Type, Flags, Kind, EntrySize, GroupSym, UniqueID,
GroupSym, UniqueID, Begin, Associated); Begin, Associated);
Entry.second = Result; Entry.second = Result;
return Result; return Result;
} }
MCSectionELF *MCContext::createELFGroupSection(const MCSymbolELF *Group) { MCSectionELF *MCContext::createELFGroupSection(const MCSymbolELF *Group) {
MCSectionELF *Result = new (*this) MCSectionELF *Result = new (ELFAllocator.Allocate())
MCSectionELF(".group", ELF::SHT_GROUP, 0, SectionKind::getReadOnly(), 4, MCSectionELF(".group", ELF::SHT_GROUP, 0, SectionKind::getReadOnly(), 4,
Group, ~0, nullptr, nullptr); Group, ~0, nullptr, nullptr);
return Result; return Result;
@ -404,7 +401,7 @@ MCSectionCOFF *MCContext::getCOFFSection(StringRef Section,
Begin = createTempSymbol(BeginSymName, false); Begin = createTempSymbol(BeginSymName, false);
StringRef CachedName = Iter->first.SectionName; StringRef CachedName = Iter->first.SectionName;
MCSectionCOFF *Result = new (*this) MCSectionCOFF( MCSectionCOFF *Result = new (COFFAllocator.Allocate()) MCSectionCOFF(
CachedName, Characteristics, COMDATSymbol, Selection, Kind, Begin); CachedName, Characteristics, COMDATSymbol, Selection, Kind, Begin);
Iter->second = Result; Iter->second = Result;