[llvm] [DWARF] Speedup .gdb_index dumping (PR #151806)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 6 05:19:01 PDT 2025
https://github.com/itrofimow updated https://github.com/llvm/llvm-project/pull/151806
>From 0d22a6fa2dca2f452b350de9d5a5425911db98e2 Mon Sep 17 00:00:00 2001
From: Ivan Trofimov <i.trofimow at yandex.ru>
Date: Sat, 2 Aug 2025 11:24:21 +0300
Subject: [PATCH 1/5] [DWARF] Speedup .gdb_index dumping
---
llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp | 25 +++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
index 987e63963a068..c0ad2a38df373 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
@@ -17,6 +17,7 @@
#include <cinttypes>
#include <cstdint>
#include <set>
+#include <unordered_map>
#include <utility>
using namespace llvm;
@@ -60,6 +61,24 @@ void DWARFGdbIndex::dumpSymbolTable(raw_ostream &OS) const {
", filled slots:",
SymbolTableOffset, (uint64_t)SymbolTable.size())
<< '\n';
+
+ std::unordered_map<uint32_t, decltype(ConstantPoolVectors)::const_iterator>
+ CuVectorMap{};
+ CuVectorMap.reserve(ConstantPoolVectors.size());
+ const auto FindCuVector =
+ [&CuVectorMap, notFound = ConstantPoolVectors.end()](uint32_t vecOffset) {
+ const auto it = CuVectorMap.find(vecOffset);
+ if (it != CuVectorMap.end()) {
+ return it->second;
+ }
+
+ return notFound;
+ };
+ for (auto it = ConstantPoolVectors.begin(); it != ConstantPoolVectors.end();
+ ++it) {
+ CuVectorMap.emplace(it->first, it);
+ }
+
uint32_t I = -1;
for (const SymTableEntry &E : SymbolTable) {
++I;
@@ -72,11 +91,7 @@ void DWARFGdbIndex::dumpSymbolTable(raw_ostream &OS) const {
StringRef Name = ConstantPoolStrings.substr(
ConstantPoolOffset - StringPoolOffset + E.NameOffset);
- auto CuVector = llvm::find_if(
- ConstantPoolVectors,
- [&](const std::pair<uint32_t, SmallVector<uint32_t, 0>> &V) {
- return V.first == E.VecOffset;
- });
+ auto CuVector = FindCuVector(E.VecOffset);
assert(CuVector != ConstantPoolVectors.end() && "Invalid symbol table");
uint32_t CuVectorId = CuVector - ConstantPoolVectors.begin();
OS << format(" String name: %s, CU vector index: %d\n", Name.data(),
>From 4d30a5c5785f0c4c0e26e1e532079cfdb244f598 Mon Sep 17 00:00:00 2001
From: Ivan Trofimov <i.trofimow at yandex.ru>
Date: Wed, 6 Aug 2025 14:38:00 +0300
Subject: [PATCH 2/5] cr fixes
---
llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp | 27 ++++++++--------------
1 file changed, 10 insertions(+), 17 deletions(-)
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
index c0ad2a38df373..c076c4547be7f 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/DWARF/DWARFGdbIndex.h"
+#include <llvm/ADT/DenseMap.h>
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/DataExtractor.h"
@@ -17,7 +18,6 @@
#include <cinttypes>
#include <cstdint>
#include <set>
-#include <unordered_map>
#include <utility>
using namespace llvm;
@@ -62,22 +62,15 @@ void DWARFGdbIndex::dumpSymbolTable(raw_ostream &OS) const {
SymbolTableOffset, (uint64_t)SymbolTable.size())
<< '\n';
- std::unordered_map<uint32_t, decltype(ConstantPoolVectors)::const_iterator>
- CuVectorMap{};
- CuVectorMap.reserve(ConstantPoolVectors.size());
- const auto FindCuVector =
- [&CuVectorMap, notFound = ConstantPoolVectors.end()](uint32_t vecOffset) {
- const auto it = CuVectorMap.find(vecOffset);
- if (it != CuVectorMap.end()) {
- return it->second;
- }
-
- return notFound;
+ llvm::DenseMap<uint32_t, decltype(ConstantPoolVectors)::const_pointer>
+ CuVectorMap(ConstantPoolVectors.size());
+ for (const auto& [Offset, CUVector] : ConstantPoolVectors)
+ CuVectorMap.try_emplace(Offset, &CUVector);
+
+ const auto FindCuVector =[&](uint32_t VecOffset) {
+ const auto It = CuVectorMap.find(VecOffset);
+ return It != CuVectorMap.end() ? It->second : ConstantPoolVectors.end();
};
- for (auto it = ConstantPoolVectors.begin(); it != ConstantPoolVectors.end();
- ++it) {
- CuVectorMap.emplace(it->first, it);
- }
uint32_t I = -1;
for (const SymTableEntry &E : SymbolTable) {
@@ -91,7 +84,7 @@ void DWARFGdbIndex::dumpSymbolTable(raw_ostream &OS) const {
StringRef Name = ConstantPoolStrings.substr(
ConstantPoolOffset - StringPoolOffset + E.NameOffset);
- auto CuVector = FindCuVector(E.VecOffset);
+ const auto* CuVector = FindCuVector(E.VecOffset);
assert(CuVector != ConstantPoolVectors.end() && "Invalid symbol table");
uint32_t CuVectorId = CuVector - ConstantPoolVectors.begin();
OS << format(" String name: %s, CU vector index: %d\n", Name.data(),
>From 72ff5d8714b3e03da05773e921b7eaa717e5d7a5 Mon Sep 17 00:00:00 2001
From: Ivan Trofimov <i.trofimow at yandex.ru>
Date: Wed, 6 Aug 2025 14:59:39 +0300
Subject: [PATCH 3/5] cleanup
---
llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
index c076c4547be7f..da771c7f93415 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
@@ -62,15 +62,15 @@ void DWARFGdbIndex::dumpSymbolTable(raw_ostream &OS) const {
SymbolTableOffset, (uint64_t)SymbolTable.size())
<< '\n';
- llvm::DenseMap<uint32_t, decltype(ConstantPoolVectors)::const_pointer>
- CuVectorMap(ConstantPoolVectors.size());
- for (const auto& [Offset, CUVector] : ConstantPoolVectors)
- CuVectorMap.try_emplace(Offset, &CUVector);
+ llvm::DenseMap<uint32_t, uint32_t> OffsetToIdMap(ConstantPoolVectors.size());
+ for (uint32_t Id = 0; Id < ConstantPoolVectors.size(); ++Id)
+ OffsetToIdMap[ConstantPoolVectors[Id].first] = Id;
- const auto FindCuVector =[&](uint32_t VecOffset) {
- const auto It = CuVectorMap.find(VecOffset);
- return It != CuVectorMap.end() ? It->second : ConstantPoolVectors.end();
- };
+ const auto FindCuVectorId = [&](uint32_t VecOffset) {
+ const auto It = OffsetToIdMap.find(VecOffset);
+ assert(It != OffsetToIdMap.end() && "Invalid symbol table");
+ return It->second;
+ };
uint32_t I = -1;
for (const SymTableEntry &E : SymbolTable) {
@@ -84,9 +84,7 @@ void DWARFGdbIndex::dumpSymbolTable(raw_ostream &OS) const {
StringRef Name = ConstantPoolStrings.substr(
ConstantPoolOffset - StringPoolOffset + E.NameOffset);
- const auto* CuVector = FindCuVector(E.VecOffset);
- assert(CuVector != ConstantPoolVectors.end() && "Invalid symbol table");
- uint32_t CuVectorId = CuVector - ConstantPoolVectors.begin();
+ const uint32_t CuVectorId = FindCuVectorId(E.VecOffset);
OS << format(" String name: %s, CU vector index: %d\n", Name.data(),
CuVectorId);
}
>From 9601b2f790b282aa8a7ad9060fd2cc7e90f1680a Mon Sep 17 00:00:00 2001
From: Ivan Trofimov <i.trofimow at yandex.ru>
Date: Wed, 6 Aug 2025 15:12:20 +0300
Subject: [PATCH 4/5] clang-format fixes
---
llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
index da771c7f93415..3b51ea08a1d5a 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
@@ -14,6 +14,7 @@
#include "llvm/Support/Format.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
+
#include <cassert>
#include <cinttypes>
#include <cstdint>
>From b51c2235c1dfcaca709fd0b2540c5e8eb71d23d1 Mon Sep 17 00:00:00 2001
From: Ivan Trofimov <i.trofimow at yandex.ru>
Date: Wed, 6 Aug 2025 15:18:43 +0300
Subject: [PATCH 5/5] clang-format fixes
---
llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
index 3b51ea08a1d5a..750db94a2f848 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFGdbIndex.cpp
@@ -7,14 +7,13 @@
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/DWARF/DWARFGdbIndex.h"
-#include <llvm/ADT/DenseMap.h>
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
-
#include <cassert>
#include <cinttypes>
#include <cstdint>
More information about the llvm-commits
mailing list