diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.h b/llvm/include/llvm/BinaryFormat/Dwarf.h index 869352b35e323..3a245972a2aa9 100644 --- a/llvm/include/llvm/BinaryFormat/Dwarf.h +++ b/llvm/include/llvm/BinaryFormat/Dwarf.h @@ -613,6 +613,24 @@ enum AcceleratorTable { DW_hash_function_djb = 0u }; +// Uniquify the string hashes and calculate the bucket count for the +// DWARF v5 Accelerator Table. +inline uint32_t +ComputeDebugNamesUniqueHashes(SmallVector &hashes) { + uint32_t BucketCount = 0; + + llvm::sort(hashes); + uint32_t uniqueHashCount = llvm::unique(hashes) - hashes.begin(); + if (uniqueHashCount > 1024) + BucketCount = uniqueHashCount / 4; + else if (uniqueHashCount > 16) + BucketCount = uniqueHashCount / 2; + else + BucketCount = std::max(uniqueHashCount, 1); + + return BucketCount; +} + // Constants for the GNU pubnames/pubtypes extensions supporting gdb index. enum GDBIndexEntryKind { GIEK_NONE, diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp index 22d995a9cc3c5..7dce65d668a6d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -33,22 +33,12 @@ using namespace llvm; void AccelTableBase::computeBucketCount() { // First get the number of unique hashes. - std::vector Uniques; + SmallVector Uniques; Uniques.reserve(Entries.size()); for (const auto &E : Entries) Uniques.push_back(E.second.HashValue); - array_pod_sort(Uniques.begin(), Uniques.end()); - std::vector::iterator P = - std::unique(Uniques.begin(), Uniques.end()); - UniqueHashCount = std::distance(Uniques.begin(), P); - - if (UniqueHashCount > 1024) - BucketCount = UniqueHashCount / 4; - else if (UniqueHashCount > 16) - BucketCount = UniqueHashCount / 2; - else - BucketCount = std::max(UniqueHashCount, 1); + BucketCount = llvm::dwarf::ComputeDebugNamesUniqueHashes(Uniques); } void AccelTableBase::finalize(AsmPrinter *Asm, StringRef Prefix) {