From 518dcb905eeb62303656e0779d29e7451bfd1188 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sun, 24 May 2015 16:58:59 +0000 Subject: [PATCH] AsmPrinter: Avoid creating symbols in DwarfStringPool Stop creating symbols we don't need in `DwarfStringPool`. The consumers only call `DwarfStringPoolEntryRef::getSymbol()` when DWARF is relocatable, so this just stops creating the unused symbols when it's not. This drops memory usage from 851 MB to 845 MB, around 0.7%. (I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`; see r236629 for details.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238122 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/DwarfStringPoolEntry.h | 5 ++++- lib/CodeGen/AsmPrinter/DwarfStringPool.cpp | 14 ++++++++++++-- lib/CodeGen/AsmPrinter/DwarfStringPool.h | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/llvm/CodeGen/DwarfStringPoolEntry.h b/include/llvm/CodeGen/DwarfStringPoolEntry.h index 72ee66e97d7..fc2b5ddd2d2 100644 --- a/include/llvm/CodeGen/DwarfStringPoolEntry.h +++ b/include/llvm/CodeGen/DwarfStringPoolEntry.h @@ -34,7 +34,10 @@ public: : I(&I) {} explicit operator bool() const { return I; } - MCSymbol *getSymbol() const { return I->second.Symbol; } + MCSymbol *getSymbol() const { + assert(I->second.Symbol && "No symbol available!"); + return I->second.Symbol; + } unsigned getOffset() const { return I->second.Offset; } unsigned getIndex() const { return I->second.Index; } StringRef getString() const { return I->first(); } diff --git a/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp b/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp index 29cae87a14d..2066f745e31 100644 --- a/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp @@ -9,10 +9,16 @@ #include "DwarfStringPool.h" #include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCStreamer.h" using namespace llvm; +DwarfStringPool::DwarfStringPool(BumpPtrAllocator &A, AsmPrinter &Asm, + StringRef Prefix) + : Pool(A), Prefix(Prefix), + ShouldCreateSymbols(Asm.MAI->doesDwarfUseRelocationsAcrossSections()) {} + DwarfStringPool::EntryRef DwarfStringPool::getEntry(AsmPrinter &Asm, StringRef Str) { auto I = Pool.insert(std::make_pair(Str, EntryTy())); @@ -20,7 +26,7 @@ DwarfStringPool::EntryRef DwarfStringPool::getEntry(AsmPrinter &Asm, auto &Entry = I.first->second; Entry.Index = Pool.size() - 1; Entry.Offset = NumBytes; - Entry.Symbol = Asm.createTempSymbol(Prefix); + Entry.Symbol = ShouldCreateSymbols ? Asm.createTempSymbol(Prefix) : nullptr; NumBytes += Str.size() + 1; assert(NumBytes > Entry.Offset && "Unexpected overflow"); @@ -44,8 +50,12 @@ void DwarfStringPool::emit(AsmPrinter &Asm, MCSection *StrSection, Entries[E.getValue().Index] = &E; for (const auto &Entry : Entries) { + assert(ShouldCreateSymbols == static_cast(Entry->getValue().Symbol) && + "Mismatch between setting and entry"); + // Emit a label for reference from debug information entries. - Asm.OutStreamer->EmitLabel(Entry->getValue().Symbol); + if (ShouldCreateSymbols) + Asm.OutStreamer->EmitLabel(Entry->getValue().Symbol); // Emit the string itself with a terminating null byte. Asm.OutStreamer->AddComment("string offset=" + diff --git a/lib/CodeGen/AsmPrinter/DwarfStringPool.h b/lib/CodeGen/AsmPrinter/DwarfStringPool.h index b042350fb59..93a168485a5 100644 --- a/lib/CodeGen/AsmPrinter/DwarfStringPool.h +++ b/lib/CodeGen/AsmPrinter/DwarfStringPool.h @@ -30,12 +30,12 @@ class DwarfStringPool { StringMap Pool; StringRef Prefix; unsigned NumBytes = 0; + bool ShouldCreateSymbols; public: typedef DwarfStringPoolEntryRef EntryRef; - DwarfStringPool(BumpPtrAllocator &A, AsmPrinter &Asm, StringRef Prefix) - : Pool(A), Prefix(Prefix) {} + DwarfStringPool(BumpPtrAllocator &A, AsmPrinter &Asm, StringRef Prefix); void emit(AsmPrinter &Asm, MCSection *StrSection, MCSection *OffsetSection = nullptr); -- 2.34.1