From f290220c22d4d26addaeda04439797fbbdb1bd65 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 28 Mar 2019 17:33:41 +0000 Subject: [PATCH] Delay initialization of three static global maps, NFC This avoids allocating a few KB of heap memory on startup, and instead allocates these maps lazily. I noticed this while profiling LLD. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357192 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../PDB/Native/PDBStringTableBuilder.cpp | 111 +++++++++--------- lib/Target/AMDGPU/AMDGPULibFunc.cpp | 47 ++++---- 2 files changed, 79 insertions(+), 79 deletions(-) diff --git a/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp b/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp index b2ae1188bb1..4b69e09a83d 100644 --- a/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp @@ -49,63 +49,62 @@ StringRef PDBStringTableBuilder::getStringForId(uint32_t Id) const { return Strings.getStringForId(Id); } -// This is a precomputed list of Buckets given the specified number of -// strings. Matching the reference algorithm exactly is not strictly -// necessary for correctness, but it helps when comparing LLD's PDBs with -// Microsoft's PDBs so as to eliminate superfluous differences. -static std::map StringsToBuckets = { - {1, 2}, - {2, 4}, - {4, 7}, - {6, 11}, - {9, 17}, - {13, 26}, - {20, 40}, - {31, 61}, - {46, 92}, - {70, 139}, - {105, 209}, - {157, 314}, - {236, 472}, - {355, 709}, - {532, 1064}, - {799, 1597}, - {1198, 2396}, - {1798, 3595}, - {2697, 5393}, - {4045, 8090}, - {6068, 12136}, - {9103, 18205}, - {13654, 27308}, - {20482, 40963}, - {30723, 61445}, - {46084, 92168}, - {69127, 138253}, - {103690, 207380}, - {155536, 311071}, - {233304, 466607}, - {349956, 699911}, - {524934, 1049867}, - {787401, 1574801}, - {1181101, 2362202}, - {1771652, 3543304}, - {2657479, 5314957}, - {3986218, 7972436}, - {5979328, 11958655}, - {8968992, 17937983}, - {13453488, 26906975}, - {20180232, 40360463}, - {30270348, 60540695}, - {45405522, 90811043}, - {68108283, 136216565}, - {102162424, 204324848}, - {153243637, 306487273}, - {229865455, 459730910}, - {344798183, 689596366}, - {517197275, 1034394550}, - {775795913, 1551591826}}; - static uint32_t computeBucketCount(uint32_t NumStrings) { + // This is a precomputed list of Buckets given the specified number of + // strings. Matching the reference algorithm exactly is not strictly + // necessary for correctness, but it helps when comparing LLD's PDBs with + // Microsoft's PDBs so as to eliminate superfluous differences. + static std::map StringsToBuckets = { + {1, 2}, + {2, 4}, + {4, 7}, + {6, 11}, + {9, 17}, + {13, 26}, + {20, 40}, + {31, 61}, + {46, 92}, + {70, 139}, + {105, 209}, + {157, 314}, + {236, 472}, + {355, 709}, + {532, 1064}, + {799, 1597}, + {1198, 2396}, + {1798, 3595}, + {2697, 5393}, + {4045, 8090}, + {6068, 12136}, + {9103, 18205}, + {13654, 27308}, + {20482, 40963}, + {30723, 61445}, + {46084, 92168}, + {69127, 138253}, + {103690, 207380}, + {155536, 311071}, + {233304, 466607}, + {349956, 699911}, + {524934, 1049867}, + {787401, 1574801}, + {1181101, 2362202}, + {1771652, 3543304}, + {2657479, 5314957}, + {3986218, 7972436}, + {5979328, 11958655}, + {8968992, 17937983}, + {13453488, 26906975}, + {20180232, 40360463}, + {30270348, 60540695}, + {45405522, 90811043}, + {68108283, 136216565}, + {102162424, 204324848}, + {153243637, 306487273}, + {229865455, 459730910}, + {344798183, 689596366}, + {517197275, 1034394550}, + {775795913, 1551591826}}; auto Entry = StringsToBuckets.lower_bound(NumStrings); assert(Entry != StringsToBuckets.end()); return Entry->second; diff --git a/lib/Target/AMDGPU/AMDGPULibFunc.cpp b/lib/Target/AMDGPU/AMDGPULibFunc.cpp index 09322594dc8..a5bac25701a 100644 --- a/lib/Target/AMDGPU/AMDGPULibFunc.cpp +++ b/lib/Target/AMDGPU/AMDGPULibFunc.cpp @@ -63,6 +63,8 @@ struct ManglingRule { int getNumLeads() const { return (Lead[0] ? 1 : 0) + (Lead[1] ? 1 : 0); } unsigned getNumArgs() const; + + static StringMap buildManglingRulesMap(); }; // Information about library functions with unmangled names. @@ -76,16 +78,7 @@ class UnmangledFuncInfo { // Number of entries in Table. static const unsigned TableSize; - // Map function name to index. - class NameMap : public StringMap { - public: - NameMap() { - for (unsigned I = 0; I != TableSize; ++I) - (*this)[Table[I].Name] = I; - } - }; - friend class NameMap; - static NameMap Map; + static StringMap buildNameMap(); public: using ID = AMDGPULibFunc::EFuncId; @@ -101,7 +94,8 @@ public: static_cast(AMDGPULibFunc::EI_LAST_MANGLED); } static ID toFuncId(unsigned Index) { - assert(Index < TableSize && "Invalid unmangled library function"); + assert(Index < TableSize && + "Invalid unmangled library function"); return static_cast( Index + 1 + static_cast(AMDGPULibFunc::EI_LAST_MANGLED)); } @@ -349,18 +343,7 @@ const UnmangledFuncInfo UnmangledFuncInfo::Table[] = { }; const unsigned UnmangledFuncInfo::TableSize = - sizeof(UnmangledFuncInfo::Table) / sizeof(UnmangledFuncInfo::Table[0]); - -UnmangledFuncInfo::NameMap UnmangledFuncInfo::Map; - -static const struct ManglingRulesMap : public StringMap { - ManglingRulesMap() - : StringMap(sizeof(manglingRules)/sizeof(manglingRules[0])) { - int Id = 0; - for (auto Rule : manglingRules) - insert({ Rule.Name, Id++ }); - } -} manglingRulesMap; + array_lengthof(UnmangledFuncInfo::Table); static AMDGPULibFunc::Param getRetType(AMDGPULibFunc::EFuncId id, const AMDGPULibFunc::Param (&Leads)[2]) { @@ -568,7 +551,17 @@ static AMDGPULibFunc::ENamePrefix parseNamePrefix(StringRef& mangledName) { return Pfx; } +StringMap ManglingRule::buildManglingRulesMap() { + StringMap Map(array_lengthof(manglingRules)); + int Id = 0; + for (auto Rule : manglingRules) + Map.insert({Rule.Name, Id++}); + return Map; +} + bool AMDGPUMangledLibFunc::parseUnmangledName(StringRef FullName) { + static const StringMap manglingRulesMap = + ManglingRule::buildManglingRulesMap(); FuncId = static_cast(manglingRulesMap.lookup(FullName)); return FuncId != EI_NONE; } @@ -1004,7 +997,15 @@ FunctionCallee AMDGPULibFunc::getOrInsertFunction(Module *M, return C; } +StringMap UnmangledFuncInfo::buildNameMap() { + StringMap Map; + for (unsigned I = 0; I != TableSize; ++I) + Map[Table[I].Name] = I; + return Map; +} + bool UnmangledFuncInfo::lookup(StringRef Name, ID &Id) { + static const StringMap Map = buildNameMap(); auto Loc = Map.find(Name); if (Loc != Map.end()) { Id = toFuncId(Loc->second); -- 2.40.0