From a414ba7844de23e51689fc741eb58190a6342627 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 6 May 2015 21:34:34 +0000 Subject: [PATCH] MC: Skip names of temporary symbols in object streamer Don't create names for temporary symbols when using an object streamer. The names never make it to the output anyway. From the starting point of r236629, my heap profile says this drops peak memory usage from 1100 MB to 1058 MB for CodeGen of `verify-uselistorder`, a savings of almost 4% on peak memory, and removes `StringMap` from the profile entirely. (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@236642 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCContext.h | 2 ++ lib/CodeGen/LLVMTargetMachine.cpp | 3 +++ lib/MC/MCContext.cpp | 3 +++ 3 files changed, 8 insertions(+) diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index c714f651737..5a3ca29c0cd 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -158,6 +158,7 @@ namespace llvm { /// differences between temporary and non-temporary labels (primarily on /// Darwin). bool AllowTemporaryLabels; + bool UseNamesOnTempLabels = true; /// The Compile Unit ID that we are currently processing. unsigned DwarfCompileUnitID; @@ -224,6 +225,7 @@ namespace llvm { const MCObjectFileInfo *getObjectFileInfo() const { return MOFI; } void setAllowTemporaryLabels(bool Value) { AllowTemporaryLabels = Value; } + void setUseNamesOnTempLabels(bool Value) { UseNamesOnTempLabels = Value; } /// \name Module Lifetime Management /// @{ diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index 61d68f60711..610c9f47bac 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -198,6 +198,9 @@ bool LLVMTargetMachine::addPassesToEmitFile( if (!MCE || !MAB) return true; + // Don't waste memory on names of temp labels. + Context->setUseNamesOnTempLabels(false); + Triple T(getTargetTriple()); AsmStreamer.reset(getTarget().createMCObjectStreamer( T, *Context, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll, diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index fd0422daf29..d6f6dbb04fe 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -150,6 +150,9 @@ MCSymbol *MCContext::CreateSymbol(StringRef Name, bool AlwaysAddSuffix) { if (AllowTemporaryLabels) IsTemporary = Name.startswith(MAI->getPrivateGlobalPrefix()); + if (IsTemporary && AlwaysAddSuffix && !UseNamesOnTempLabels) + return new (*this) MCSymbol("", true); + SmallString<128> NewName = Name; bool AddSuffix = AlwaysAddSuffix; unsigned &NextUniqueID = NextID[Name];