Index: llvm/trunk/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp +++ llvm/trunk/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp @@ -60,7 +60,19 @@ // 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. + // The reference implementation does (in nmt.h, NMT::grow()): + // unsigned StringCount = 0; + // unsigned BucketCount = 1; + // fn insert() { + // ++StringCount; + // if (BucketCount * 3 / 4 < StringCount) + // BucketCount = BucketCount * 3 / 2 + 1; + // } + // This list contains all StringCount, BucketCount pairs where BucketCount was + // just incremented. It ends before the first BucketCount entry where + // BucketCount * 3 would overflow a 32-bit unsigned int. static std::map StringsToBuckets = { + {0, 1}, {1, 2}, {2, 4}, {4, 7}, @@ -110,7 +122,8 @@ {229865455, 459730910}, {344798183, 689596366}, {517197275, 1034394550}, - {775795913, 1551591826}}; + {775795913, 1551591826}, + {1163693870, 2327387740}}; auto Entry = StringsToBuckets.lower_bound(NumStrings); assert(Entry != StringsToBuckets.end()); return Entry->second;