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.

llvm-svn: 357192
This commit is contained in:
Reid Kleckner 2019-03-28 17:33:41 +00:00
parent 676d25ab94
commit 85e2cdac73
2 changed files with 79 additions and 79 deletions

View File

@ -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<uint32_t, uint32_t> 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<uint32_t, uint32_t> 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;

View File

@ -63,6 +63,8 @@ struct ManglingRule {
int getNumLeads() const { return (Lead[0] ? 1 : 0) + (Lead[1] ? 1 : 0); }
unsigned getNumArgs() const;
static StringMap<int> 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<unsigned> {
public:
NameMap() {
for (unsigned I = 0; I != TableSize; ++I)
(*this)[Table[I].Name] = I;
}
};
friend class NameMap;
static NameMap Map;
static StringMap<unsigned> buildNameMap();
public:
using ID = AMDGPULibFunc::EFuncId;
@ -101,7 +94,8 @@ public:
static_cast<unsigned>(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<ID>(
Index + 1 + static_cast<unsigned>(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<int> {
ManglingRulesMap()
: StringMap<int>(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<int> ManglingRule::buildManglingRulesMap() {
StringMap<int> 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<int> manglingRulesMap =
ManglingRule::buildManglingRulesMap();
FuncId = static_cast<EFuncId>(manglingRulesMap.lookup(FullName));
return FuncId != EI_NONE;
}
@ -1004,7 +997,15 @@ FunctionCallee AMDGPULibFunc::getOrInsertFunction(Module *M,
return C;
}
StringMap<unsigned> UnmangledFuncInfo::buildNameMap() {
StringMap<unsigned> 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<unsigned> Map = buildNameMap();
auto Loc = Map.find(Name);
if (Loc != Map.end()) {
Id = toFuncId(Loc->second);