diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.h b/llvm/include/llvm/BinaryFormat/Dwarf.h index 869352b35e323..44c0030251b37 100644 --- a/llvm/include/llvm/BinaryFormat/Dwarf.h +++ b/llvm/include/llvm/BinaryFormat/Dwarf.h @@ -613,6 +613,25 @@ enum AcceleratorTable { DW_hash_function_djb = 0u }; +// Uniquify the string hashes and calculate the bucket count for the +// DWARF v5 Accelerator Table. NOTE: This function effectively consumes the +// 'hashes' input parameter. +inline uint32_t getDebugNamesBucketCount(MutableArrayRef hashes, + uint32_t &uniqueHashCount) { + uint32_t BucketCount = 0; + + sort(hashes); + 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..23fc9b2e0410e 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::getDebugNamesBucketCount(Uniques, UniqueHashCount); } void AccelTableBase::finalize(AsmPrinter *Asm, StringRef Prefix) {