aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorcmtice <cmtice@google.com>2024-02-21 08:26:05 -0800
committerGitHub <noreply@github.com>2024-02-21 08:26:05 -0800
commit453b1a2fce3c46e866131797f876976032cff384 (patch)
tree30d8d00a43286d00417ab1c5c0381b98838f2681 /llvm
parent9978f6a10f37d12e1eecad0d4bfacd350d933ed7 (diff)
downloadllvm-453b1a2fce3c46e866131797f876976032cff384.zip
llvm-453b1a2fce3c46e866131797f876976032cff384.tar.gz
llvm-453b1a2fce3c46e866131797f876976032cff384.tar.bz2
[LLVM][DWARF] Refactor code for generating DWARF V5 .debug_names (#82394)
[LLVM][DWARF] Refactor code for generating DWARF v5 .debug_names Refactor the code that uniques the entries and computes the bucket count for the DWARF V5 .debug_names accelerator table.
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/BinaryFormat/Dwarf.h19
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp14
2 files changed, 21 insertions, 12 deletions
diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.h b/llvm/include/llvm/BinaryFormat/Dwarf.h
index 869352b..44c0030 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<uint32_t> 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<uint32_t>(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 22d995a..23fc9b2e 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<uint32_t> Uniques;
+ SmallVector<uint32_t, 0> 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<uint32_t>::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<uint32_t>(UniqueHashCount, 1);
+ BucketCount = llvm::dwarf::getDebugNamesBucketCount(Uniques, UniqueHashCount);
}
void AccelTableBase::finalize(AsmPrinter *Asm, StringRef Prefix) {