diff options
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Native')
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp b/llvm/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp index eabb9d44669..f7f36901e4d 100644 --- a/llvm/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp @@ -60,7 +60,19 @@ static uint32_t computeBucketCount(uint32_t NumStrings) { // 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<uint32_t, uint32_t> StringsToBuckets = { + {0, 1}, {1, 2}, {2, 4}, {4, 7}, @@ -110,7 +122,8 @@ static uint32_t computeBucketCount(uint32_t NumStrings) { {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; |

