[llvm] [BOLT][DWARF][NFC] Refactor updateUnitDebugInfo (PR #100811)
Sayhaan Siddiqui via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 26 13:42:50 PDT 2024
https://github.com/sayhaan created https://github.com/llvm/llvm-project/pull/100811
Refactors updateUnitDebugInfo so the code for each case is in its own function.
>From c9cc1da33834000861faf94a622ccfeb2451d12c Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui <sayhaan at meta.com>
Date: Tue, 23 Jul 2024 16:45:04 -0700
Subject: [PATCH 1/7] [BOLT][DWARF][NFC] Add parallelization for processing of
DWO debug information
Summary:
Test Plan:
Reviewers:
Subscribers:
Tasks:
Tags:
Differential Revision: https://phabricator.intern.facebook.com/D60151517
---
bolt/include/bolt/Core/ParallelUtilities.h | 2 +-
bolt/lib/Core/ParallelUtilities.cpp | 11 +++++++----
bolt/lib/Rewrite/DWARFRewriter.cpp | 15 +++++++++++++--
...dwarf4-cross-cu-backward-different-abbrev.test | 2 +-
.../dwarf4-cross-cu-forward-different-abbrev.test | 2 +-
...cu-loclist-dwarf4-loclist--dwarf5-loclist.test | 2 +-
bolt/test/X86/dwarf4-df-dualcu-loclist.test | 2 +-
bolt/test/X86/dwarf4-df-dualcu.test | 2 +-
.../X86/dwarf4-df-input-lowpc-ranges-cus.test | 2 +-
bolt/test/X86/dwarf4-split-dwarf-no-address.test | 2 +-
...warf4-split-gdb-index-types-gdb-generated.test | 2 +-
.../dwarf4-subprogram-multiple-ranges-cus.test | 2 +-
bolt/test/X86/dwarf4-types-dwarf5-types.test | 2 +-
bolt/test/X86/dwarf4-types-dwarf5.test | 2 +-
bolt/test/X86/dwarf5-addr-section-reuse.s | 2 +-
.../X86/dwarf5-call-pc-function-null-check.test | 2 +-
bolt/test/X86/dwarf5-call-pc.test | 2 +-
bolt/test/X86/dwarf5-cu-no-debug-addr.test | 2 +-
.../X86/dwarf5-df-input-lowpc-ranges-cus.test | 2 +-
bolt/test/X86/dwarf5-df-mono-dualcu.test | 2 +-
bolt/test/X86/dwarf5-df-output-dir-same-name.test | 2 +-
bolt/test/X86/dwarf5-df-types-debug-names.test | 2 +-
bolt/test/X86/dwarf5-df-types-dup-dwp-input.test | 2 +-
.../dwarf5-df-types-modify-dwo-name-mixed.test | 2 +-
.../test/X86/dwarf5-df-types-modify-dwo-name.test | 2 +-
...warf4-gdb-index-types-gdb-generated-gdb11.test | 2 +-
...dwarf4-gdb-index-types-gdb-generated-gdb9.test | 2 +-
...arf5-dwarf4-gdb-index-types-lld-generated.test | 2 +-
bolt/test/X86/dwarf5-dwarf4-monolithic.test | 2 +-
...f4-types-backward-forward-cross-reference.test | 2 +-
bolt/test/X86/dwarf5-empty-arange.test | 2 +-
.../dwarf5-ftypes-dwo-mono-input-dwp-output.test | 2 +-
...warf5-gdb-index-types-gdb-generated-gdb11.test | 2 +-
...dwarf5-gdb-index-types-gdb-generated-gdb9.test | 2 +-
.../X86/dwarf5-gdb-index-types-lld-generated.test | 2 +-
bolt/test/X86/dwarf5-locexpr-referrence.test | 2 +-
bolt/test/X86/dwarf5-loclist-offset-form.test | 2 +-
bolt/test/X86/dwarf5-one-loclists-two-bases.test | 2 +-
bolt/test/X86/dwarf5-return-pc-form-addr.test | 2 +-
bolt/test/X86/dwarf5-return-pc.test | 2 +-
bolt/test/X86/dwarf5-split-dwarf4-monolithic.test | 2 +-
...warf5-split-gdb-index-types-gdb-generated.test | 2 +-
.../dwarf5-subprogram-multiple-ranges-cus.test | 2 +-
bolt/test/X86/dwarf5-two-cu-str-offset-table.test | 2 +-
bolt/test/X86/dwarf5-two-loclists.test | 2 +-
bolt/test/X86/dwarf5-two-rnglists.test | 2 +-
.../dwarf5-type-unit-no-cu-str-offset-table.test | 2 +-
.../X86/dwarf5-types-backward-cross-reference.s | 2 +-
bolt/test/X86/dwarf5-types-debug-names.test | 2 +-
49 files changed, 67 insertions(+), 53 deletions(-)
diff --git a/bolt/include/bolt/Core/ParallelUtilities.h b/bolt/include/bolt/Core/ParallelUtilities.h
index e7b35a79acc78..854438e4bba88 100644
--- a/bolt/include/bolt/Core/ParallelUtilities.h
+++ b/bolt/include/bolt/Core/ParallelUtilities.h
@@ -50,7 +50,7 @@ enum SchedulingPolicy {
};
/// Return the managed thread pool and initialize it if not initialized.
-ThreadPoolInterface &getThreadPool();
+ThreadPoolInterface &getThreadPool(const int ThreadsCount = opts::ThreadCount);
/// Perform the work on each BinaryFunction except those that are accepted
/// by SkipPredicate, scheduling heuristic is based on SchedPolicy.
diff --git a/bolt/lib/Core/ParallelUtilities.cpp b/bolt/lib/Core/ParallelUtilities.cpp
index a24c37c06f1ac..63ecec83ca816 100644
--- a/bolt/lib/Core/ParallelUtilities.cpp
+++ b/bolt/lib/Core/ParallelUtilities.cpp
@@ -49,7 +49,7 @@ namespace ParallelUtilities {
namespace {
/// A single thread pool that is used to run parallel tasks
-std::unique_ptr<DefaultThreadPool> ThreadPoolPtr;
+std::unique_ptr<ThreadPoolInterface> ThreadPoolPtr;
unsigned computeCostFor(const BinaryFunction &BF,
const PredicateTy &SkipPredicate,
@@ -102,12 +102,15 @@ inline unsigned estimateTotalCost(const BinaryContext &BC,
} // namespace
-ThreadPoolInterface &getThreadPool() {
+ThreadPoolInterface &getThreadPool(const int ThreadsCount) {
if (ThreadPoolPtr.get())
return *ThreadPoolPtr;
- ThreadPoolPtr = std::make_unique<DefaultThreadPool>(
- llvm::hardware_concurrency(opts::ThreadCount));
+ if (ThreadsCount > 1)
+ ThreadPoolPtr = std::make_unique<DefaultThreadPool>(
+ llvm::hardware_concurrency(ThreadsCount));
+ else
+ ThreadPoolPtr = std::make_unique<SingleThreadExecutor>();
return *ThreadPoolPtr;
}
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 674b5f17adb3f..963a02e05000c 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -326,6 +326,12 @@ static cl::opt<bool> KeepARanges(
"keep or generate .debug_aranges section if .gdb_index is written"),
cl::Hidden, cl::cat(BoltCategory));
+static cl::opt<int>
+ DebugThreadCount("debug-thread-count",
+ cl::desc("specifies thread count for the multithreading "
+ "for updating DWO debug info"),
+ cl::init(1), cl::cat(BoltCategory));
+
static cl::opt<std::string> DwarfOutputPath(
"dwarf-output-path",
cl::desc("Path to where .dwo files or dwp file will be written out to."),
@@ -738,6 +744,8 @@ void DWARFRewriter::updateDebugInfo() {
CUPartitionVector PartVec = partitionCUs(*BC.DwCtx);
for (std::vector<DWARFUnit *> &Vec : PartVec) {
DIEBlder.buildCompileUnits(Vec);
+ ThreadPoolInterface &ThreadPool =
+ ParallelUtilities::getThreadPool(opts::DebugThreadCount);
for (DWARFUnit *CU : DIEBlder.getProcessedCUs()) {
createRangeLocListAddressWriters(*CU);
std::optional<DWARFUnit *> SplitCU;
@@ -757,9 +765,12 @@ void DWARFRewriter::updateDebugInfo() {
: std::optional<std::string>(opts::DwarfOutputPath.c_str());
std::string DWOName = DIEBlder.updateDWONameCompDir(
*StrOffstsWriter, *StrWriter, *CU, DwarfOutputPath, std::nullopt);
- processSplitCU(*CU, **SplitCU, DIEBlder, *TempRangesSectionWriter,
- AddressWriter, DWOName, DwarfOutputPath);
+ ThreadPool.async([&, DwarfOutputPath, DWOName] {
+ processSplitCU(*CU, **SplitCU, DIEBlder, *TempRangesSectionWriter,
+ AddressWriter, DWOName, DwarfOutputPath);
+ });
}
+ ThreadPool.wait();
for (DWARFUnit *CU : DIEBlder.getProcessedCUs())
processMainBinaryCU(*CU, DIEBlder);
finalizeCompileUnits(DIEBlder, *Streamer, OffsetMap,
diff --git a/bolt/test/X86/dwarf4-cross-cu-backward-different-abbrev.test b/bolt/test/X86/dwarf4-cross-cu-backward-different-abbrev.test
index 555887a067589..580a61e0aa4be 100644
--- a/bolt/test/X86/dwarf4-cross-cu-backward-different-abbrev.test
+++ b/bolt/test/X86/dwarf4-cross-cu-backward-different-abbrev.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-cross-reference-different-abbrev-dst.s -o %t.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-cross-reference-different-abbrev-src.s -o %t1.o
# RUN: %clang %cflags -gdwarf-4 %t.o %t1.o -o %t.exe
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
diff --git a/bolt/test/X86/dwarf4-cross-cu-forward-different-abbrev.test b/bolt/test/X86/dwarf4-cross-cu-forward-different-abbrev.test
index 74c9491d95d36..5b42034eabf7f 100644
--- a/bolt/test/X86/dwarf4-cross-cu-forward-different-abbrev.test
+++ b/bolt/test/X86/dwarf4-cross-cu-forward-different-abbrev.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-cross-reference-different-abbrev-dst.s -o %t.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-cross-reference-different-abbrev-src.s -o %t1.o
# RUN: %clang %cflags -gdwarf-4 %t1.o %t.o -o %t.exe
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
diff --git a/bolt/test/X86/dwarf4-cross-cu-loclist-dwarf4-loclist--dwarf5-loclist.test b/bolt/test/X86/dwarf4-cross-cu-loclist-dwarf4-loclist--dwarf5-loclist.test
index 6bcf8892ed0a8..4dfb0df51902d 100644
--- a/bolt/test/X86/dwarf4-cross-cu-loclist-dwarf4-loclist--dwarf5-loclist.test
+++ b/bolt/test/X86/dwarf4-cross-cu-loclist-dwarf4-loclist--dwarf5-loclist.test
@@ -4,7 +4,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-loclist.s -o %t1.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-two-entries-loclist.s -o %t2.o
# RUN: %clang %cflags %t1.o %t2.o %t.o -o %t.exe
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
diff --git a/bolt/test/X86/dwarf4-df-dualcu-loclist.test b/bolt/test/X86/dwarf4-df-dualcu-loclist.test
index 57c75e282421a..03aa77e819596 100644
--- a/bolt/test/X86/dwarf4-df-dualcu-loclist.test
+++ b/bolt/test/X86/dwarf4-df-dualcu-loclist.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-df-dualcu-loclist-helper.s \
; RUN: -split-dwarf-file=helper.dwo -o helper.o
; RUN: %clang %cflags -gdwarf-5 -O2 -gsplit-dwarf=split main.o helper.o -o main.exe
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.dwo | FileCheck -check-prefix=PRE-BOLT-DWO-MAIN %s
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.dwo.dwo | FileCheck -check-prefix=BOLT-DWO-MAIN %s
; RUN: llvm-dwarfdump --show-form --verbose --debug-info helper.dwo | FileCheck -check-prefix=PRE-BOLT-DWO-HELPER %s
diff --git a/bolt/test/X86/dwarf4-df-dualcu.test b/bolt/test/X86/dwarf4-df-dualcu.test
index 468c924de3a90..7cc6dd0bb1614 100644
--- a/bolt/test/X86/dwarf4-df-dualcu.test
+++ b/bolt/test/X86/dwarf4-df-dualcu.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-df-dualcu-helper.s \
; RUN: -split-dwarf-file=helper.dwo -o helper.o
; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe -fno-pic -no-pie
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --always-convert-to-ranges
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --always-convert-to-ranges --debug-thread-count=72
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe | FileCheck -check-prefix=PRE-BOLT %s
; RUN: llvm-dwarfdump --show-form --verbose --debug-ranges main.exe.bolt &> %t/foo.txt
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe.bolt >> %t/foo.txt
diff --git a/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test b/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test
index a97377400eeb7..021cf43c03981 100644
--- a/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test
+++ b/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-df-input-lowpc-ranges-other.s \
; RUN: -split-dwarf-file=mainOther.dwo -o other.o
; RUN: %clang %cflags -gdwarf-4 -gsplit-dwarf=split main.o other.o -o main.exe
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --show-form --verbose --debug-ranges main.exe.bolt &> %t/foo.txt
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe.bolt >> %t/foo.txt
; RUN: cat %t/foo.txt | FileCheck -check-prefix=BOLT %s
diff --git a/bolt/test/X86/dwarf4-split-dwarf-no-address.test b/bolt/test/X86/dwarf4-split-dwarf-no-address.test
index fc6d8d324b959..223b9248089ae 100644
--- a/bolt/test/X86/dwarf4-split-dwarf-no-address.test
+++ b/bolt/test/X86/dwarf4-split-dwarf-no-address.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc --split-dwarf-file=helper.dwo --triple=x86_64-unknown-linux-gnu \
; RUN: --filetype=obj %p/Inputs/dwarf4-split-dwarf-no-address-helper.s -o=helper.o
; RUN: %clang %cflags -gdwarf-4 -gsplit-dwarf=split main.o helper.o -o main.exe -fno-pic -no-pie
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe.bolt | FileCheck -check-prefix=BOLT %s
;; Testing that there are no asserts/crashes when one of the DWARF4 CUs does not modify .debug_addr
diff --git a/bolt/test/X86/dwarf4-split-gdb-index-types-gdb-generated.test b/bolt/test/X86/dwarf4-split-gdb-index-types-gdb-generated.test
index c9b12574caa3a..20b6288c5532c 100644
--- a/bolt/test/X86/dwarf4-split-gdb-index-types-gdb-generated.test
+++ b/bolt/test/X86/dwarf4-split-gdb-index-types-gdb-generated.test
@@ -7,7 +7,7 @@
# RUN: llvm-mc --split-dwarf-file=helper.dwo -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-split-gdb-index-types-helper.s -o helpergdb.o
# RUN: %clang %cflags maingdb.o helpergdb.o -o maingdb.exe -Wl,-q
# RUN: llvm-objcopy maingdb.exe --add-section=.gdb_index=%p/Inputs/dwarf4-split-gdb-index-types-v8.gdb-index
-# RUN: llvm-bolt maingdb.exe -o maingdb.exe.bolt --update-debug-sections
+# RUN: llvm-bolt maingdb.exe -o maingdb.exe.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index maingdb.exe.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by GDB with split-dwarf DWARF4.
diff --git a/bolt/test/X86/dwarf4-subprogram-multiple-ranges-cus.test b/bolt/test/X86/dwarf4-subprogram-multiple-ranges-cus.test
index c9ade995b7087..9eda54cd76a50 100644
--- a/bolt/test/X86/dwarf4-subprogram-multiple-ranges-cus.test
+++ b/bolt/test/X86/dwarf4-subprogram-multiple-ranges-cus.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-subprogram-multiple-ranges-main.s -o %t1.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-subprogram-multiple-ranges-other.s -o %t2.o
# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-objdump %t.bolt --disassemble > %t1.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t1.txt
# RUN: cat %t1.txt | FileCheck --check-prefix=POSTCHECK %s
diff --git a/bolt/test/X86/dwarf4-types-dwarf5-types.test b/bolt/test/X86/dwarf4-types-dwarf5-types.test
index a253f22836090..6e58ea9c21fea 100644
--- a/bolt/test/X86/dwarf4-types-dwarf5-types.test
+++ b/bolt/test/X86/dwarf4-types-dwarf5-types.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-types-dwarf5-types-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-types-dwarf5-types-helper.s -o %thelper.o
# RUN: %clang %cflags %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-types %t.bolt | FileCheck --check-prefix=POSTCHECKTU %s
diff --git a/bolt/test/X86/dwarf4-types-dwarf5.test b/bolt/test/X86/dwarf4-types-dwarf5.test
index 1eb42683e40ee..e1c5d1199fbad 100644
--- a/bolt/test/X86/dwarf4-types-dwarf5.test
+++ b/bolt/test/X86/dwarf4-types-dwarf5.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-types-dwarf5-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-types-dwarf5-helper.s -o %thelper.o
# RUN: %clang %cflags %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-types %t.bolt | FileCheck --check-prefix=POSTCHECKTU %s
diff --git a/bolt/test/X86/dwarf5-addr-section-reuse.s b/bolt/test/X86/dwarf5-addr-section-reuse.s
index cf511d6d111e0..cf7fddd2240ac 100644
--- a/bolt/test/X86/dwarf5-addr-section-reuse.s
+++ b/bolt/test/X86/dwarf5-addr-section-reuse.s
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-helper2-addr-section-reuse.s -o %thelper2.o
# RUN: %clang %cflags -dwarf-5 %thelper1.o %tmain.o %thelper2.o -o %t.exe -Wl,-q
# RUN: llvm-dwarfdump --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
-# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --debug-info %t.exe.bolt | FileCheck --check-prefix=POSTCHECK %s
## This test checks that when a binary is bolted if CU is not modified and has DW_AT_addr_base that is shared
diff --git a/bolt/test/X86/dwarf5-call-pc-function-null-check.test b/bolt/test/X86/dwarf5-call-pc-function-null-check.test
index 761a4da696217..3f1ec9da158e2 100644
--- a/bolt/test/X86/dwarf5-call-pc-function-null-check.test
+++ b/bolt/test/X86/dwarf5-call-pc-function-null-check.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-call-pc-function-null-check-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-call-pc-function-null-check-helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe > %t.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe.bolt >> %t.txt
# RUN: cat %t.txt | FileCheck --check-prefix=CHECK %s
diff --git a/bolt/test/X86/dwarf5-call-pc.test b/bolt/test/X86/dwarf5-call-pc.test
index dc7773dc053d9..1d7617faafa11 100644
--- a/bolt/test/X86/dwarf5-call-pc.test
+++ b/bolt/test/X86/dwarf5-call-pc.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-call-pc-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-call-pc-helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections -reorder-blocks=reverse
+# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections -reorder-blocks=reverse --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe > %tmain.txt
# RUN: llvm-objdump %t.exe --disassemble >> %tmain.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe.bolt > %tmainbolt.txt
diff --git a/bolt/test/X86/dwarf5-cu-no-debug-addr.test b/bolt/test/X86/dwarf5-cu-no-debug-addr.test
index e78b68680d6cc..f8b475ddb2b45 100644
--- a/bolt/test/X86/dwarf5-cu-no-debug-addr.test
+++ b/bolt/test/X86/dwarf5-cu-no-debug-addr.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-cu-no-debug-addr-main.s -o %t1main.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-cu-no-debug-addr-helper.s -o %t1helper.o
# RUN: %clang %cflags -dwarf-5 %t1main.o %t1helper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
diff --git a/bolt/test/X86/dwarf5-df-input-lowpc-ranges-cus.test b/bolt/test/X86/dwarf5-df-input-lowpc-ranges-cus.test
index a325395fd5320..18f9105eb04bb 100644
--- a/bolt/test/X86/dwarf5-df-input-lowpc-ranges-cus.test
+++ b/bolt/test/X86/dwarf5-df-input-lowpc-ranges-cus.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-input-lowpc-ranges-other.s \
; RUN: -split-dwarf-file=mainOther.dwo -o other.o
; RUN: %clang %cflags main.o other.o -o main.exe
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --show-form --verbose --debug-rnglists main.exe.bolt &> %t/foo.txt
; RUN: llvm-dwarfdump --show-form --verbose --debug-addr main.exe.bolt >> %t/foo.txt
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe.bolt >> %t/foo.txt
diff --git a/bolt/test/X86/dwarf5-df-mono-dualcu.test b/bolt/test/X86/dwarf5-df-mono-dualcu.test
index 13272cc1c3c4d..69cd054a4c20a 100644
--- a/bolt/test/X86/dwarf5-df-mono-dualcu.test
+++ b/bolt/test/X86/dwarf5-df-mono-dualcu.test
@@ -5,7 +5,7 @@
; RUN: -split-dwarf-file=main.dwo -o main.o
; RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux-gnu %p/Inputs/dwarf5-df-mono-helper.s -o=helper.o
; RUN: %clang %cflags -gdwarf-5 main.o helper.o -o main.exe -fno-pic -no-pie
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --always-convert-to-ranges
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --always-convert-to-ranges --debug-thread-count=72
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe | FileCheck -check-prefix=PRE-BOLT %s
; RUN: llvm-dwarfdump --show-form --verbose --debug-addr main.exe.bolt &> %t/foo.txt
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe.bolt >> %t/foo.txt
diff --git a/bolt/test/X86/dwarf5-df-output-dir-same-name.test b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
index b466f87d95e5e..9501e3175776c 100644
--- a/bolt/test/X86/dwarf5-df-output-dir-same-name.test
+++ b/bolt/test/X86/dwarf5-df-output-dir-same-name.test
@@ -9,7 +9,7 @@
; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-output-dir-same-name-helper.s \
; RUN: -split-dwarf-file=objects/o2/split.dwo -o helper.o
; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --dwarf-output-path=%t/dwo
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --dwarf-output-path=%t/dwo --debug-thread-count=72
; RUN: ls -l %t/dwo > log
; RUN: llvm-dwarfdump --debug-info main.exe.bolt >> log
; RUN: cat log | FileCheck -check-prefix=BOLT %s
diff --git a/bolt/test/X86/dwarf5-df-types-debug-names.test b/bolt/test/X86/dwarf5-df-types-debug-names.test
index 7c1c8e4fd5b38..0f8dfc003d0d0 100644
--- a/bolt/test/X86/dwarf5-df-types-debug-names.test
+++ b/bolt/test/X86/dwarf5-df-types-debug-names.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-types-debug-names-helper.s \
; RUN: -split-dwarf-file=helper.dwo -o helper.o
; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --debug-info -r 0 main.dwo.dwo > log.txt
; RUN: llvm-dwarfdump --debug-info -r 0 helper.dwo.dwo >> log.txt
; RUN: llvm-dwarfdump --debug-info --debug-names main.exe.bolt >> log.txt
diff --git a/bolt/test/X86/dwarf5-df-types-dup-dwp-input.test b/bolt/test/X86/dwarf5-df-types-dup-dwp-input.test
index 754f05dc96328..143c4d55d5d76 100644
--- a/bolt/test/X86/dwarf5-df-types-dup-dwp-input.test
+++ b/bolt/test/X86/dwarf5-df-types-dup-dwp-input.test
@@ -7,7 +7,7 @@
; RUN: -split-dwarf-file=helper.dwo -o helper.o
; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
; RUN: llvm-dwp -e main.exe -o main.exe.dwp
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --debug-info -r 0 main.dwo.dwo | FileCheck -check-prefix=BOLT-DWO-DWO-MAIN %s
; RUN: llvm-dwarfdump --debug-info -r 0 helper.dwo.dwo | FileCheck -check-prefix=BOLT-DWO-DWO-HELPER %s
diff --git a/bolt/test/X86/dwarf5-df-types-modify-dwo-name-mixed.test b/bolt/test/X86/dwarf5-df-types-modify-dwo-name-mixed.test
index 6c603ba4ee19d..d57af3e687c48 100644
--- a/bolt/test/X86/dwarf5-df-types-modify-dwo-name-mixed.test
+++ b/bolt/test/X86/dwarf5-df-types-modify-dwo-name-mixed.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-types-dup-helper.s \
; RUN: -split-dwarf-file=helper.dwo -o helper.o
; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --debug-info -r 0 main.exe.bolt > log.txt
; RUN: llvm-dwarfdump --debug-info -r 0 main.dwo.dwo >> log.txt
; RUN: llvm-dwarfdump --debug-info -r 0 helper.dwo.dwo >> log.txt
diff --git a/bolt/test/X86/dwarf5-df-types-modify-dwo-name.test b/bolt/test/X86/dwarf5-df-types-modify-dwo-name.test
index 086f8f8139628..cb00ead686632 100644
--- a/bolt/test/X86/dwarf5-df-types-modify-dwo-name.test
+++ b/bolt/test/X86/dwarf5-df-types-modify-dwo-name.test
@@ -6,7 +6,7 @@
; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-df-types-debug-names-helper.s \
; RUN: -split-dwarf-file=helper.dwo -o helper.o
; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper.o -o main.exe
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --debug-info -r 0 main.exe.bolt > log.txt
; RUN: llvm-dwarfdump --debug-info -r 0 main.dwo.dwo >> log.txt
; RUN: llvm-dwarfdump --debug-info -r 0 helper.dwo.dwo >> log.txt
diff --git a/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb11.test b/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb11.test
index 10ad6ed404f1c..714f0e2915a5a 100644
--- a/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb11.test
+++ b/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb11.test
@@ -4,7 +4,7 @@
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-gdb-index-types-helper.s -o %thelpergdb.o
# RUN: %clang %cflags %tmaingdb.o %thelpergdb.o -o %tgdb.exe -Wl,-q
# RUN: llvm-objcopy %tgdb.exe --add-section=.gdb_index=%p/Inputs/dwarf5-dwarf4-gdb-index-types-v8.generted-gdb11.gdb-index
-# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections
+# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index %tgdb.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by GDB.
diff --git a/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb9.test b/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb9.test
index 2da0bcca89b2a..e71e12ac8daed 100644
--- a/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb9.test
+++ b/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-gdb-generated-gdb9.test
@@ -4,7 +4,7 @@
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-gdb-index-types-helper.s -o %thelpergdb.o
# RUN: %clang %cflags %tmaingdb.o %thelpergdb.o -o %tgdb.exe -Wl,-q
# RUN: llvm-objcopy %tgdb.exe --add-section=.gdb_index=%p/Inputs/dwarf5-dwarf4-gdb-index-types-v8.generted-gdb9.gdb-index
-# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections
+# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index %tgdb.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by GDB.
diff --git a/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-lld-generated.test b/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-lld-generated.test
index 9be540352005d..7b6f0abb5a79e 100644
--- a/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-lld-generated.test
+++ b/bolt/test/X86/dwarf5-dwarf4-gdb-index-types-lld-generated.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-gdb-index-types-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf4-gdb-index-types-helper.s -o %thelper.o
# RUN: %clang %cflags %tmain.o %thelper.o -o %t.exe -Wl,-q -Wl,--gdb-index
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index %t.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by LLD.
diff --git a/bolt/test/X86/dwarf5-dwarf4-monolithic.test b/bolt/test/X86/dwarf5-dwarf4-monolithic.test
index ff0f6990aaac0..12200096b8dd2 100644
--- a/bolt/test/X86/dwarf5-dwarf4-monolithic.test
+++ b/bolt/test/X86/dwarf5-dwarf4-monolithic.test
@@ -5,7 +5,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper1.s -o %t1.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper2.s -o %t2.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %t0.o %t1.o %t2.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt --always-convert-to-ranges %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt --always-convert-to-ranges %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-line %t.exe > %t_line.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt > %t.txt
diff --git a/bolt/test/X86/dwarf5-dwarf4-types-backward-forward-cross-reference.test b/bolt/test/X86/dwarf5-dwarf4-types-backward-forward-cross-reference.test
index b48d6a5dc20d4..fda94786a3345 100644
--- a/bolt/test/X86/dwarf5-dwarf4-types-backward-forward-cross-reference.test
+++ b/bolt/test/X86/dwarf5-dwarf4-types-backward-forward-cross-reference.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-types-backward-forward-cross-reference-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-types-backward-forward-cross-reference-helper.s -o %thelper.o
# RUN: %clang %cflags %tmain.o %thelper.o -o %t.exe
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt | FileCheck --check-prefix=POSTCHECKADDR %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-types %t.bolt | FileCheck --check-prefix=POSTCHECKTU %s
diff --git a/bolt/test/X86/dwarf5-empty-arange.test b/bolt/test/X86/dwarf5-empty-arange.test
index 61e9662048434..6f2836c36ca32 100644
--- a/bolt/test/X86/dwarf5-empty-arange.test
+++ b/bolt/test/X86/dwarf5-empty-arange.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-empty-arange-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-empty-arange-helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,--entry=main -Wl,-q -Wl,-gc-sections
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --debug-aranges %t.bolt > %t.txt
# RUN: llvm-dwarfdump --debug-info -r 0 %t.bolt >> %t.txt
# RUN: cat %t.txt | FileCheck --check-prefix=POSTCHECK %s
diff --git a/bolt/test/X86/dwarf5-ftypes-dwo-mono-input-dwp-output.test b/bolt/test/X86/dwarf5-ftypes-dwo-mono-input-dwp-output.test
index b6e9f60bbfc70..4b9bc87e0bcfc 100644
--- a/bolt/test/X86/dwarf5-ftypes-dwo-mono-input-dwp-output.test
+++ b/bolt/test/X86/dwarf5-ftypes-dwo-mono-input-dwp-output.test
@@ -8,7 +8,7 @@
; RUN: %clang %cflags -gdwarf-5 -gsplit-dwarf=split main.o helper1.o helper2.o -o main.exe
; RUN: llvm-dwarfdump --show-form --verbose --debug-info main.dwo | FileCheck -check-prefix=PRE-BOLT %s
; RUN: llvm-dwarfdump --show-form --verbose --debug-info helper2.o | FileCheck -check-prefix=PRE-BOLT2 %s
-; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --write-dwp
+; RUN: llvm-bolt main.exe -o main.exe.bolt --update-debug-sections --write-dwp --debug-thread-count=72
; RUN: llvm-dwarfdump --show-form --verbose --debug-info -r 0 main.exe.bolt.dwp | FileCheck -check-prefix=BOLT %s
; RUN: llvm-dwarfdump --show-form --verbose --debug-tu-index main.exe.bolt.dwp | FileCheck -check-prefix=BOLT-DWP-TU-INDEX %s
; RUN: llvm-dwarfdump --show-form --verbose --debug-cu-index main.exe.bolt.dwp | FileCheck -check-prefix=BOLT-DWP-CU-INDEX %s
diff --git a/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb11.test b/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb11.test
index 338a476e46f3b..394c48d1aecf5 100644
--- a/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb11.test
+++ b/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb11.test
@@ -4,7 +4,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-gdb-index-types-helper.s -o %thelpergdb.o
# RUN: %clang %cflags %tmaingdb.o %thelpergdb.o -o %tgdb.exe -Wl,-q
# RUN: llvm-objcopy %tgdb.exe --add-section=.gdb_index=%p/Inputs/dwarf5-gdb-index-types-v8.generted-gdb11.gdb-index
-# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections
+# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index %tgdb.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by GDB.
diff --git a/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb9.test b/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb9.test
index c9d3913a1933c..ebded013b0c64 100644
--- a/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb9.test
+++ b/bolt/test/X86/dwarf5-gdb-index-types-gdb-generated-gdb9.test
@@ -4,7 +4,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-gdb-index-types-helper.s -o %thelpergdb.o
# RUN: %clang %cflags %tmaingdb.o %thelpergdb.o -o %tgdb.exe -Wl,-q
# RUN: llvm-objcopy %tgdb.exe --add-section=.gdb_index=%p/Inputs/dwarf5-gdb-index-types-v8.generted-gdb9.gdb-index
-# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections
+# RUN: llvm-bolt %tgdb.exe -o %tgdb.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index %tgdb.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by GDB.
diff --git a/bolt/test/X86/dwarf5-gdb-index-types-lld-generated.test b/bolt/test/X86/dwarf5-gdb-index-types-lld-generated.test
index a770e40260dde..b8d6833b951ae 100644
--- a/bolt/test/X86/dwarf5-gdb-index-types-lld-generated.test
+++ b/bolt/test/X86/dwarf5-gdb-index-types-lld-generated.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-gdb-index-types-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-gdb-index-types-helper.s -o %thelper.o
# RUN: %clang %cflags %tmain.o %thelper.o -o %t.exe -Wl,-q -Wl,--gdb-index
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index %t.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by LLD.
diff --git a/bolt/test/X86/dwarf5-locexpr-referrence.test b/bolt/test/X86/dwarf5-locexpr-referrence.test
index cc7bb27ce602e..bd08f167d1bff 100644
--- a/bolt/test/X86/dwarf5-locexpr-referrence.test
+++ b/bolt/test/X86/dwarf5-locexpr-referrence.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-locexpr-referrence-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-locexpr-referrence-helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=CHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt | FileCheck --check-prefix=CHECKADDR %s
diff --git a/bolt/test/X86/dwarf5-loclist-offset-form.test b/bolt/test/X86/dwarf5-loclist-offset-form.test
index 3178c11a67069..244f94015a772 100644
--- a/bolt/test/X86/dwarf5-loclist-offset-form.test
+++ b/bolt/test/X86/dwarf5-loclist-offset-form.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-loclist-offset-form-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-loclist-offset-form-helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt > %t.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t.txt
diff --git a/bolt/test/X86/dwarf5-one-loclists-two-bases.test b/bolt/test/X86/dwarf5-one-loclists-two-bases.test
index f25f6c7a46858..58c6597223071 100644
--- a/bolt/test/X86/dwarf5-one-loclists-two-bases.test
+++ b/bolt/test/X86/dwarf5-one-loclists-two-bases.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-loc-base-no-loc-accesshelper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt > %t.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t.txt
diff --git a/bolt/test/X86/dwarf5-return-pc-form-addr.test b/bolt/test/X86/dwarf5-return-pc-form-addr.test
index 5a83615cac031..7f88d8593f3d0 100644
--- a/bolt/test/X86/dwarf5-return-pc-form-addr.test
+++ b/bolt/test/X86/dwarf5-return-pc-form-addr.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-return-pc-form-addr-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-return-pc-helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections -reorder-blocks=reverse
+# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections -reorder-blocks=reverse --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe > %tmain.txt
# RUN: llvm-objdump %t.exe --disassemble >> %tmain.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe.bolt > %tmainbolt.txt
diff --git a/bolt/test/X86/dwarf5-return-pc.test b/bolt/test/X86/dwarf5-return-pc.test
index e9ef99ef5b945..18b92899704e7 100644
--- a/bolt/test/X86/dwarf5-return-pc.test
+++ b/bolt/test/X86/dwarf5-return-pc.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-return-pc-main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-return-pc-helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections -reorder-blocks=reverse
+# RUN: llvm-bolt %t.exe -o %t.exe.bolt --update-debug-sections -reorder-blocks=reverse --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe > %tmain.txt
# RUN: llvm-objdump %t.exe --disassemble >> %tmain.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe.bolt > %tmainbolt.txt
diff --git a/bolt/test/X86/dwarf5-split-dwarf4-monolithic.test b/bolt/test/X86/dwarf5-split-dwarf4-monolithic.test
index 2cfe5e26bd4cd..dab59d2ed6ad4 100644
--- a/bolt/test/X86/dwarf5-split-dwarf4-monolithic.test
+++ b/bolt/test/X86/dwarf5-split-dwarf4-monolithic.test
@@ -9,7 +9,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux -split-dwarf-file=helper1.dwo %p/Inputs/dwarf5-split-dwarf4-monolithic-helper1.s -o helper1.o
# RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-dwarf4-monolithic-helper2.s -o helper2.o
# RUN: %clang %cflags -dwarf-5 main.o helper0.o helper1.o helper2.o -o main.exe -Wl,-q
-# RUN: llvm-bolt --always-convert-to-ranges main.exe -o main.bolt --update-debug-sections
+# RUN: llvm-bolt --always-convert-to-ranges main.exe -o main.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info main.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-line main.exe | FileCheck --check-prefix=PRECHECK-LINE %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr main.bolt > boltout.txt
diff --git a/bolt/test/X86/dwarf5-split-gdb-index-types-gdb-generated.test b/bolt/test/X86/dwarf5-split-gdb-index-types-gdb-generated.test
index ec2b8f7084c78..fe542bb2df6d6 100644
--- a/bolt/test/X86/dwarf5-split-gdb-index-types-gdb-generated.test
+++ b/bolt/test/X86/dwarf5-split-gdb-index-types-gdb-generated.test
@@ -7,7 +7,7 @@
# RUN: llvm-mc --split-dwarf-file=helper.dwo -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-split-gdb-index-types-helper.s -o helpergdb.o
# RUN: %clang %cflags maingdb.o helpergdb.o -o maingdb.exe -Wl,-q
# RUN: llvm-objcopy maingdb.exe --add-section=.gdb_index=%p/Inputs/dwarf5-split-gdb-index-types-v8.gdb-index
-# RUN: llvm-bolt maingdb.exe -o maingdb.exe.bolt --update-debug-sections
+# RUN: llvm-bolt maingdb.exe -o maingdb.exe.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --gdb-index maingdb.exe.bolt | FileCheck --check-prefix=POSTCHECK %s
## Tests that BOLT correctly handles gdb-index generated by GDB with split-dwarf DWARF4.
diff --git a/bolt/test/X86/dwarf5-subprogram-multiple-ranges-cus.test b/bolt/test/X86/dwarf5-subprogram-multiple-ranges-cus.test
index bcf63fe6a0d8c..af8c95ea89568 100644
--- a/bolt/test/X86/dwarf5-subprogram-multiple-ranges-cus.test
+++ b/bolt/test/X86/dwarf5-subprogram-multiple-ranges-cus.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-subprogram-multiple-ranges-main.s -o %t1.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-subprogram-multiple-ranges-other.s -o %t2.o
# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-objdump %t.bolt --disassemble > %t1.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t1.txt
# RUN: cat %t1.txt | FileCheck --check-prefix=POSTCHECK %s
diff --git a/bolt/test/X86/dwarf5-two-cu-str-offset-table.test b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
index 20503951df4e1..b547c8e35710c 100644
--- a/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
+++ b/bolt/test/X86/dwarf5-two-cu-str-offset-table.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-str-offsets %t.exe > %t.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-str-offsets %t.bolt >> %t.txt
# RUN: cat %t.txt | FileCheck --check-prefix=CHECK %s
diff --git a/bolt/test/X86/dwarf5-two-loclists.test b/bolt/test/X86/dwarf5-two-loclists.test
index a7c6351f9813c..33affb6ff15b7 100644
--- a/bolt/test/X86/dwarf5-two-loclists.test
+++ b/bolt/test/X86/dwarf5-two-loclists.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt > %t.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t.txt
diff --git a/bolt/test/X86/dwarf5-two-rnglists.test b/bolt/test/X86/dwarf5-two-rnglists.test
index 98f2e347d7673..8c19f9dea379a 100644
--- a/bolt/test/X86/dwarf5-two-rnglists.test
+++ b/bolt/test/X86/dwarf5-two-rnglists.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_main.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5_helper.s -o %thelper.o
# RUN: %clang %cflags -dwarf-5 %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt --always-convert-to-ranges %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt --always-convert-to-ranges %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe | FileCheck --check-prefix=PRECHECK %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-addr %t.bolt > %t.txt
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t.txt
diff --git a/bolt/test/X86/dwarf5-type-unit-no-cu-str-offset-table.test b/bolt/test/X86/dwarf5-type-unit-no-cu-str-offset-table.test
index 21ced6ce687b5..4c9a36a47699e 100644
--- a/bolt/test/X86/dwarf5-type-unit-no-cu-str-offset-table.test
+++ b/bolt/test/X86/dwarf5-type-unit-no-cu-str-offset-table.test
@@ -3,7 +3,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-basic-cu.s -o %tmain.o
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-types-no-cu.s -o %thelper.o
# RUN: %clang %cflags %tmain.o %thelper.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-str-offsets %t.exe | FileCheck -check-prefix=PRE-BOLT %s
# RUN: llvm-dwarfdump --show-form --verbose --debug-str-offsets %t.bolt | FileCheck -check-prefix=POST-BOLT %s
diff --git a/bolt/test/X86/dwarf5-types-backward-cross-reference.s b/bolt/test/X86/dwarf5-types-backward-cross-reference.s
index 2345cac2fde96..7f187450acc21 100644
--- a/bolt/test/X86/dwarf5-types-backward-cross-reference.s
+++ b/bolt/test/X86/dwarf5-types-backward-cross-reference.s
@@ -2,7 +2,7 @@
# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %s -o %t.o
# RUN: %clang %cflags -gdwarf-5 %t.o -o %t.exe
-# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
+# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --debug-thread-count=72
# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=POSTCHECK %s
## This test checks that BOLT handles backward cross CU references for dwarf5
diff --git a/bolt/test/X86/dwarf5-types-debug-names.test b/bolt/test/X86/dwarf5-types-debug-names.test
index 94624298e289d..ee7c771e43c7d 100644
--- a/bolt/test/X86/dwarf5-types-debug-names.test
+++ b/bolt/test/X86/dwarf5-types-debug-names.test
@@ -1,7 +1,7 @@
; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-types-debug-names-main.s -o %tmain.o
; RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %p/Inputs/dwarf5-types-debug-names-helper.s -o %thelper.o
; RUN: %clang %cflags -gdwarf-5 %tmain.o %thelper.o -o %tmain.exe
-; RUN: llvm-bolt %tmain.exe -o %tmain.exe.bolt --update-debug-sections
+; RUN: llvm-bolt %tmain.exe -o %tmain.exe.bolt --update-debug-sections --debug-thread-count=72
; RUN: llvm-dwarfdump --debug-info --debug-names %tmain.exe.bolt > %tlog.txt
; RUN: cat %tlog.txt | FileCheck -check-prefix=BOLT %s
>From 4fe6a42922bbf09d0946a7a67a6d1b51f2051cf9 Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui <sayhaan at meta.com>
Date: Wed, 24 Jul 2024 12:27:07 -0700
Subject: [PATCH 2/7] Updates
---
bolt/lib/Rewrite/DWARFRewriter.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 963a02e05000c..3334ee7e2a42a 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -326,7 +326,7 @@ static cl::opt<bool> KeepARanges(
"keep or generate .debug_aranges section if .gdb_index is written"),
cl::Hidden, cl::cat(BoltCategory));
-static cl::opt<int>
+static cl::opt<unsigned>
DebugThreadCount("debug-thread-count",
cl::desc("specifies thread count for the multithreading "
"for updating DWO debug info"),
@@ -744,8 +744,11 @@ void DWARFRewriter::updateDebugInfo() {
CUPartitionVector PartVec = partitionCUs(*BC.DwCtx);
for (std::vector<DWARFUnit *> &Vec : PartVec) {
DIEBlder.buildCompileUnits(Vec);
+ const int ThreadCount = (opts::DebugThreadCount < opts::ThreadCount)
+ ? opts::DebugThreadCount
+ : opts::ThreadCount;
ThreadPoolInterface &ThreadPool =
- ParallelUtilities::getThreadPool(opts::DebugThreadCount);
+ ParallelUtilities::getThreadPool(ThreadCount);
for (DWARFUnit *CU : DIEBlder.getProcessedCUs()) {
createRangeLocListAddressWriters(*CU);
std::optional<DWARFUnit *> SplitCU;
>From 5e50157a5cc3660555b06b1fedc8e8ec6abf30f6 Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui <sayhaan at meta.com>
Date: Wed, 24 Jul 2024 15:56:48 -0700
Subject: [PATCH 3/7] Updates
---
bolt/lib/Rewrite/DWARFRewriter.cpp | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 3334ee7e2a42a..600c419dc0a7f 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -744,9 +744,7 @@ void DWARFRewriter::updateDebugInfo() {
CUPartitionVector PartVec = partitionCUs(*BC.DwCtx);
for (std::vector<DWARFUnit *> &Vec : PartVec) {
DIEBlder.buildCompileUnits(Vec);
- const int ThreadCount = (opts::DebugThreadCount < opts::ThreadCount)
- ? opts::DebugThreadCount
- : opts::ThreadCount;
+ const int ThreadCount = std::min(opts::DebugThreadCount, opts::ThreadCount);
ThreadPoolInterface &ThreadPool =
ParallelUtilities::getThreadPool(ThreadCount);
for (DWARFUnit *CU : DIEBlder.getProcessedCUs()) {
>From 5787dfddbd1e2124dffe0ff8500752e36eb20744 Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui <sayhaan at meta.com>
Date: Wed, 24 Jul 2024 15:57:27 -0700
Subject: [PATCH 4/7] Updates
---
bolt/include/bolt/Core/ParallelUtilities.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bolt/include/bolt/Core/ParallelUtilities.h b/bolt/include/bolt/Core/ParallelUtilities.h
index 854438e4bba88..95352925d139d 100644
--- a/bolt/include/bolt/Core/ParallelUtilities.h
+++ b/bolt/include/bolt/Core/ParallelUtilities.h
@@ -50,7 +50,7 @@ enum SchedulingPolicy {
};
/// Return the managed thread pool and initialize it if not initialized.
-ThreadPoolInterface &getThreadPool(const int ThreadsCount = opts::ThreadCount);
+ThreadPoolInterface &getThreadPool(const unsigned int ThreadsCount = opts::ThreadCount);
/// Perform the work on each BinaryFunction except those that are accepted
/// by SkipPredicate, scheduling heuristic is based on SchedPolicy.
>From f0bc92c6f62ea77494a91f2cee053c4bdfd5d9b6 Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui <sayhaan at meta.com>
Date: Wed, 24 Jul 2024 16:02:05 -0700
Subject: [PATCH 5/7] Formatting changes
---
bolt/include/bolt/Core/ParallelUtilities.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/bolt/include/bolt/Core/ParallelUtilities.h b/bolt/include/bolt/Core/ParallelUtilities.h
index 95352925d139d..96b75ef71ff84 100644
--- a/bolt/include/bolt/Core/ParallelUtilities.h
+++ b/bolt/include/bolt/Core/ParallelUtilities.h
@@ -50,7 +50,8 @@ enum SchedulingPolicy {
};
/// Return the managed thread pool and initialize it if not initialized.
-ThreadPoolInterface &getThreadPool(const unsigned int ThreadsCount = opts::ThreadCount);
+ThreadPoolInterface &
+getThreadPool(const unsigned int ThreadsCount = opts::ThreadCount);
/// Perform the work on each BinaryFunction except those that are accepted
/// by SkipPredicate, scheduling heuristic is based on SchedPolicy.
>From 4389c2ab280aba297606ea5a0a60913806725c1c Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui <sayhaan at meta.com>
Date: Wed, 24 Jul 2024 16:18:24 -0700
Subject: [PATCH 6/7] Updates
---
bolt/lib/Core/ParallelUtilities.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bolt/lib/Core/ParallelUtilities.cpp b/bolt/lib/Core/ParallelUtilities.cpp
index 63ecec83ca816..74fa5835e21ae 100644
--- a/bolt/lib/Core/ParallelUtilities.cpp
+++ b/bolt/lib/Core/ParallelUtilities.cpp
@@ -102,7 +102,7 @@ inline unsigned estimateTotalCost(const BinaryContext &BC,
} // namespace
-ThreadPoolInterface &getThreadPool(const int ThreadsCount) {
+ThreadPoolInterface &getThreadPool(const unsigned int ThreadsCount) {
if (ThreadPoolPtr.get())
return *ThreadPoolPtr;
>From f42e8a11e577735536876b2473b7420545afcc21 Mon Sep 17 00:00:00 2001
From: Sayhaan Siddiqui <sayhaan at meta.com>
Date: Wed, 24 Jul 2024 22:47:49 -0700
Subject: [PATCH 7/7] [BOLT][DWARF][NFC] Refactor updateUnitDebugInfo
---
bolt/include/bolt/Rewrite/DWARFRewriter.h | 26 +
bolt/lib/Rewrite/DWARFRewriter.cpp | 761 ++++++++++++----------
2 files changed, 437 insertions(+), 350 deletions(-)
diff --git a/bolt/include/bolt/Rewrite/DWARFRewriter.h b/bolt/include/bolt/Rewrite/DWARFRewriter.h
index b798c5b76fc28..9ff6c2c892fda 100644
--- a/bolt/include/bolt/Rewrite/DWARFRewriter.h
+++ b/bolt/include/bolt/Rewrite/DWARFRewriter.h
@@ -115,6 +115,32 @@ class DWARFRewriter {
DebugAddrWriter &AddressWriter,
std::optional<uint64_t> RangesBase = std::nullopt);
+ void handleCompileUnit(DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugLocWriter &DebugLocWriter,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter,
+ std::optional<uint64_t> &RangesBase);
+
+ void
+ handleSubprogram(DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter,
+ std::map<DebugAddressRangesVector, uint64_t> &CachedRanges);
+
+ void handleLexicalBlock(
+ DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter,
+ std::map<DebugAddressRangesVector, uint64_t> &CachedRanges);
+
+ void handleCallSite(DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugAddrWriter &AddressWriter);
+
+ void handleDefaultCase(DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugLocWriter &DebugLocWriter,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter);
+
/// Patches the binary for an object's address ranges to be updated.
/// The object can be anything that has associated address ranges via either
/// DW_AT_low/high_pc or DW_AT_ranges (i.e. functions, lexical blocks, etc).
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index 600c419dc0a7f..0cd047ad765ab 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -793,7 +793,6 @@ void DWARFRewriter::updateUnitDebugInfo(
DWARFUnit &Unit, DIEBuilder &DIEBldr, DebugLocWriter &DebugLocWriter,
DebugRangesSectionWriter &RangesSectionWriter,
DebugAddrWriter &AddressWriter, std::optional<uint64_t> RangesBase) {
- // Cache debug ranges so that the offset for identical ranges could be reused.
std::map<DebugAddressRangesVector, uint64_t> CachedRanges;
uint64_t DIEOffset = Unit.getOffset() + Unit.getHeaderSize();
@@ -801,7 +800,87 @@ void DWARFRewriter::updateUnitDebugInfo(
const std::vector<std::unique_ptr<DIEBuilder::DIEInfo>> &DIs =
DIEBldr.getDIEsByUnit(Unit);
- // Either updates or normalizes DW_AT_range to DW_AT_low_pc and DW_AT_high_pc.
+ for (const std::unique_ptr<DIEBuilder::DIEInfo> &DI : DIs) {
+ DIE *Die = DI->Die;
+ switch (Die->getTag()) {
+ case dwarf::DW_TAG_compile_unit:
+ case dwarf::DW_TAG_skeleton_unit:
+ handleCompileUnit(*Die, Unit, DIEBldr, DebugLocWriter,
+ RangesSectionWriter, AddressWriter, RangesBase);
+ break;
+ case dwarf::DW_TAG_subprogram:
+ handleSubprogram(*Die, Unit, DIEBldr, RangesSectionWriter, AddressWriter,
+ CachedRanges);
+ break;
+ case dwarf::DW_TAG_lexical_block:
+ case dwarf::DW_TAG_inlined_subroutine:
+ case dwarf::DW_TAG_try_block:
+ case dwarf::DW_TAG_catch_block:
+ handleLexicalBlock(*Die, Unit, DIEBldr, RangesSectionWriter,
+ AddressWriter, CachedRanges);
+ break;
+ case dwarf::DW_TAG_call_site:
+ handleCallSite(*Die, Unit, DIEBldr, AddressWriter);
+ break;
+ default:
+ handleDefaultCase(*Die, Unit, DIEBldr, DebugLocWriter,
+ RangesSectionWriter, AddressWriter);
+ break;
+ }
+ }
+
+ if (DIEOffset > NextCUOffset)
+ errs() << "BOLT-WARNING: corrupt DWARF detected at 0x"
+ << Twine::utohexstr(Unit.getOffset()) << '\n';
+}
+
+void DWARFRewriter::handleCompileUnit(
+ DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugLocWriter &DebugLocWriter,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter, std::optional<uint64_t> &RangesBase) {
+ // For dwarf5 section 3.1.3
+ // The following attributes are not part of a split full compilation unit
+ // entry but instead are inherited (if present) from the corresponding
+ // skeleton compilation unit: DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges,
+ // DW_AT_stmt_list, DW_AT_comp_dir, DW_AT_str_offsets_base,
+ // DW_AT_addr_base and DW_AT_rnglists_base.
+ if (Unit.getVersion() == 5 && Unit.isDWOUnit())
+ return;
+ auto ModuleRangesOrError = getDIEAddressRanges(Die, Unit);
+ if (!ModuleRangesOrError) {
+ consumeError(ModuleRangesOrError.takeError());
+ return;
+ }
+ DWARFAddressRangesVector &ModuleRanges = *ModuleRangesOrError;
+ DebugAddressRangesVector OutputRanges =
+ BC.translateModuleAddressRanges(ModuleRanges);
+ DIEValue LowPCAttrInfo = Die.findAttribute(dwarf::DW_AT_low_pc);
+ // For a case where LLD GCs only function used in the CU.
+ // If CU doesn't have DW_AT_low_pc we are not going to convert,
+ // so don't need to do anything.
+ if (OutputRanges.empty() && !Unit.isDWOUnit() && LowPCAttrInfo)
+ OutputRanges.push_back({0, 0});
+ const uint64_t RangesSectionOffset =
+ RangesSectionWriter.addRanges(OutputRanges);
+ // Don't emit the zero low_pc arange.
+ if (!Unit.isDWOUnit() && !OutputRanges.empty() && OutputRanges.back().LowPC)
+ ARangesSectionWriter->addCURanges(Unit.getOffset(),
+ std::move(OutputRanges));
+ updateDWARFObjectAddressRanges(Unit, DIEBldr, Die, RangesSectionOffset,
+ RangesBase);
+ DIEValue StmtListAttrVal = Die.findAttribute(dwarf::DW_AT_stmt_list);
+ if (LineTablePatchMap.count(&Unit))
+ DIEBldr.replaceValue(&Die, dwarf::DW_AT_stmt_list,
+ StmtListAttrVal.getForm(),
+ DIEInteger(LineTablePatchMap[&Unit]));
+}
+
+void DWARFRewriter::handleSubprogram(
+ DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter,
+ std::map<DebugAddressRangesVector, uint64_t> &CachedRanges) {
auto updateLowPCHighPC = [&](DIE *Die, const DIEValue &LowPCVal,
const DIEValue &HighPCVal, uint64_t LowPC,
const uint64_t HighPC) {
@@ -839,83 +918,36 @@ void DWARFRewriter::updateUnitDebugInfo(
DIEBldr.addValue(Die, AttrHighPC, FormHighPC, DIEInteger(Size));
}
};
-
- for (const std::unique_ptr<DIEBuilder::DIEInfo> &DI : DIs) {
- DIE *Die = DI->Die;
- switch (Die->getTag()) {
- case dwarf::DW_TAG_compile_unit:
- case dwarf::DW_TAG_skeleton_unit: {
- // For dwarf5 section 3.1.3
- // The following attributes are not part of a split full compilation unit
- // entry but instead are inherited (if present) from the corresponding
- // skeleton compilation unit: DW_AT_low_pc, DW_AT_high_pc, DW_AT_ranges,
- // DW_AT_stmt_list, DW_AT_comp_dir, DW_AT_str_offsets_base,
- // DW_AT_addr_base and DW_AT_rnglists_base.
- if (Unit.getVersion() == 5 && Unit.isDWOUnit())
- continue;
- auto ModuleRangesOrError = getDIEAddressRanges(*Die, Unit);
- if (!ModuleRangesOrError) {
- consumeError(ModuleRangesOrError.takeError());
- break;
- }
- DWARFAddressRangesVector &ModuleRanges = *ModuleRangesOrError;
- DebugAddressRangesVector OutputRanges =
- BC.translateModuleAddressRanges(ModuleRanges);
- DIEValue LowPCAttrInfo = Die->findAttribute(dwarf::DW_AT_low_pc);
- // For a case where LLD GCs only function used in the CU.
- // If CU doesn't have DW_AT_low_pc we are not going to convert,
- // so don't need to do anything.
- if (OutputRanges.empty() && !Unit.isDWOUnit() && LowPCAttrInfo)
- OutputRanges.push_back({0, 0});
- const uint64_t RangesSectionOffset =
- RangesSectionWriter.addRanges(OutputRanges);
- // Don't emit the zero low_pc arange.
- if (!Unit.isDWOUnit() && !OutputRanges.empty() &&
- OutputRanges.back().LowPC)
- ARangesSectionWriter->addCURanges(Unit.getOffset(),
- std::move(OutputRanges));
- updateDWARFObjectAddressRanges(Unit, DIEBldr, *Die, RangesSectionOffset,
- RangesBase);
- DIEValue StmtListAttrVal = Die->findAttribute(dwarf::DW_AT_stmt_list);
- if (LineTablePatchMap.count(&Unit))
- DIEBldr.replaceValue(Die, dwarf::DW_AT_stmt_list,
- StmtListAttrVal.getForm(),
- DIEInteger(LineTablePatchMap[&Unit]));
- break;
+ // Get function address either from ranges or [LowPC, HighPC) pair.
+ uint64_t Address = UINT64_MAX;
+ uint64_t SectionIndex, HighPC;
+ DebugAddressRangesVector FunctionRanges;
+ if (!getLowAndHighPC(Die, Unit, Address, HighPC, SectionIndex)) {
+ Expected<DWARFAddressRangesVector> RangesOrError =
+ getDIEAddressRanges(Die, Unit);
+ if (!RangesOrError) {
+ consumeError(RangesOrError.takeError());
+ return;
}
+ DWARFAddressRangesVector Ranges = *RangesOrError;
+ // Not a function definition.
+ if (Ranges.empty())
+ return;
- case dwarf::DW_TAG_subprogram: {
- // Get function address either from ranges or [LowPC, HighPC) pair.
- uint64_t Address = UINT64_MAX;
- uint64_t SectionIndex, HighPC;
- DebugAddressRangesVector FunctionRanges;
- if (!getLowAndHighPC(*Die, Unit, Address, HighPC, SectionIndex)) {
- Expected<DWARFAddressRangesVector> RangesOrError =
- getDIEAddressRanges(*Die, Unit);
- if (!RangesOrError) {
- consumeError(RangesOrError.takeError());
- break;
- }
- DWARFAddressRangesVector Ranges = *RangesOrError;
- // Not a function definition.
- if (Ranges.empty())
- break;
-
- for (const DWARFAddressRange &Range : Ranges) {
- if (const BinaryFunction *Function =
- BC.getBinaryFunctionAtAddress(Range.LowPC))
- FunctionRanges.append(Function->getOutputAddressRanges());
- }
- } else {
- if (const BinaryFunction *Function =
- BC.getBinaryFunctionAtAddress(Address))
- FunctionRanges = Function->getOutputAddressRanges();
- }
+ for (const DWARFAddressRange &Range : Ranges) {
+ if (const BinaryFunction *Function =
+ BC.getBinaryFunctionAtAddress(Range.LowPC))
+ FunctionRanges.append(Function->getOutputAddressRanges());
+ }
+ } else {
+ if (const BinaryFunction *Function = BC.getBinaryFunctionAtAddress(Address))
+ FunctionRanges = Function->getOutputAddressRanges();
+ }
// Clear cached ranges as the new function will have its own set.
CachedRanges.clear();
- DIEValue LowPCVal = Die->findAttribute(dwarf::DW_AT_low_pc);
- DIEValue HighPCVal = Die->findAttribute(dwarf::DW_AT_high_pc);
+ DIEValue LowPCVal = Die.findAttribute(dwarf::DW_AT_low_pc);
+ DIEValue HighPCVal = Die.findAttribute(dwarf::DW_AT_high_pc);
if (FunctionRanges.empty()) {
if (LowPCVal && HighPCVal)
FunctionRanges.push_back({0, HighPCVal.getDIEInteger().getValue()});
@@ -924,123 +956,163 @@ void DWARFRewriter::updateUnitDebugInfo(
}
if (FunctionRanges.size() == 1 && !opts::AlwaysConvertToRanges) {
- updateLowPCHighPC(Die, LowPCVal, HighPCVal, FunctionRanges.back().LowPC,
+ updateLowPCHighPC(&Die, LowPCVal, HighPCVal,
+ FunctionRanges.back().LowPC,
FunctionRanges.back().HighPC);
- break;
+ return;
}
updateDWARFObjectAddressRanges(
- Unit, DIEBldr, *Die, RangesSectionWriter.addRanges(FunctionRanges));
+ Unit, DIEBldr, Die, RangesSectionWriter.addRanges(FunctionRanges));
+}
- break;
+void DWARFRewriter::handleLexicalBlock(
+ DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter,
+ std::map<DebugAddressRangesVector, uint64_t> &CachedRanges) {
+ auto updateLowPCHighPC = [&](DIE *Die, const DIEValue &LowPCVal,
+ const DIEValue &HighPCVal, uint64_t LowPC,
+ const uint64_t HighPC) {
+ dwarf::Attribute AttrLowPC = dwarf::DW_AT_low_pc;
+ dwarf::Form FormLowPC = dwarf::DW_FORM_addr;
+ dwarf::Attribute AttrHighPC = dwarf::DW_AT_high_pc;
+ dwarf::Form FormHighPC = dwarf::DW_FORM_data4;
+ const uint32_t Size = HighPC - LowPC;
+ // Whatever was generated is not low_pc/high_pc, so will reset to
+ // default for size 1.
+ if (!LowPCVal || !HighPCVal) {
+ if (Unit.getVersion() >= 5)
+ FormLowPC = dwarf::DW_FORM_addrx;
+ else if (Unit.isDWOUnit())
+ FormLowPC = dwarf::DW_FORM_GNU_addr_index;
+ } else {
+ AttrLowPC = LowPCVal.getAttribute();
+ FormLowPC = LowPCVal.getForm();
+ AttrHighPC = HighPCVal.getAttribute();
+ FormHighPC = HighPCVal.getForm();
}
- case dwarf::DW_TAG_lexical_block:
- case dwarf::DW_TAG_inlined_subroutine:
- case dwarf::DW_TAG_try_block:
- case dwarf::DW_TAG_catch_block: {
- uint64_t RangesSectionOffset = 0;
- Expected<DWARFAddressRangesVector> RangesOrError =
- getDIEAddressRanges(*Die, Unit);
- const BinaryFunction *Function =
- RangesOrError && !RangesOrError->empty()
- ? BC.getBinaryFunctionContainingAddress(
- RangesOrError->front().LowPC)
- : nullptr;
- DebugAddressRangesVector OutputRanges;
- if (Function) {
- OutputRanges = translateInputToOutputRanges(*Function, *RangesOrError);
- LLVM_DEBUG(if (OutputRanges.empty() != RangesOrError->empty()) {
- dbgs() << "BOLT-DEBUG: problem with DIE at 0x"
- << Twine::utohexstr(Die->getOffset()) << " in CU at 0x"
- << Twine::utohexstr(Unit.getOffset()) << '\n';
- });
- if (opts::AlwaysConvertToRanges || OutputRanges.size() > 1) {
- RangesSectionOffset = RangesSectionWriter.addRanges(
- std::move(OutputRanges), CachedRanges);
- OutputRanges.clear();
- } else if (OutputRanges.empty()) {
- OutputRanges.push_back({0, RangesOrError.get().front().HighPC});
- }
- } else if (!RangesOrError) {
- consumeError(RangesOrError.takeError());
- } else {
- OutputRanges.push_back({0, !RangesOrError->empty()
- ? RangesOrError.get().front().HighPC
- : 0});
- }
- DIEValue LowPCVal = Die->findAttribute(dwarf::DW_AT_low_pc);
- DIEValue HighPCVal = Die->findAttribute(dwarf::DW_AT_high_pc);
- if (OutputRanges.size() == 1) {
- updateLowPCHighPC(Die, LowPCVal, HighPCVal, OutputRanges.back().LowPC,
- OutputRanges.back().HighPC);
- break;
- }
- updateDWARFObjectAddressRanges(Unit, DIEBldr, *Die, RangesSectionOffset);
- break;
+
+ if (FormLowPC == dwarf::DW_FORM_addrx ||
+ FormLowPC == dwarf::DW_FORM_GNU_addr_index)
+ LowPC = AddressWriter.getIndexFromAddress(LowPC, Unit);
+
+ if (LowPCVal)
+ DIEBldr.replaceValue(Die, AttrLowPC, FormLowPC, DIEInteger(LowPC));
+ else
+ DIEBldr.addValue(Die, AttrLowPC, FormLowPC, DIEInteger(LowPC));
+ if (HighPCVal) {
+ DIEBldr.replaceValue(Die, AttrHighPC, FormHighPC, DIEInteger(Size));
+ } else {
+ DIEBldr.deleteValue(Die, dwarf::DW_AT_ranges);
+ DIEBldr.addValue(Die, AttrHighPC, FormHighPC, DIEInteger(Size));
}
- case dwarf::DW_TAG_call_site: {
- auto patchPC = [&](DIE *Die, DIEValue &AttrVal, StringRef Entry) -> void {
- std::optional<uint64_t> Address = getAsAddress(Unit, AttrVal);
- const BinaryFunction *Function =
- BC.getBinaryFunctionContainingAddress(*Address);
- uint64_t UpdatedAddress = *Address;
- if (Function)
- UpdatedAddress =
- Function->translateInputToOutputAddress(UpdatedAddress);
-
- if (AttrVal.getForm() == dwarf::DW_FORM_addrx) {
- const uint32_t Index =
- AddressWriter.getIndexFromAddress(UpdatedAddress, Unit);
- DIEBldr.replaceValue(Die, AttrVal.getAttribute(), AttrVal.getForm(),
- DIEInteger(Index));
- } else if (AttrVal.getForm() == dwarf::DW_FORM_addr) {
- DIEBldr.replaceValue(Die, AttrVal.getAttribute(), AttrVal.getForm(),
- DIEInteger(UpdatedAddress));
- } else {
- errs() << "BOLT-ERROR: unsupported form for " << Entry << "\n";
- }
- };
- DIEValue CallPcAttrVal = Die->findAttribute(dwarf::DW_AT_call_pc);
- if (CallPcAttrVal)
- patchPC(Die, CallPcAttrVal, "DW_AT_call_pc");
+ };
- DIEValue CallRetPcAttrVal =
- Die->findAttribute(dwarf::DW_AT_call_return_pc);
- if (CallRetPcAttrVal)
- patchPC(Die, CallRetPcAttrVal, "DW_AT_call_return_pc");
+ uint64_t RangesSectionOffset = 0;
+ Expected<DWARFAddressRangesVector> RangesOrError =
+ getDIEAddressRanges(Die, Unit);
+ const BinaryFunction *Function =
+ RangesOrError && !RangesOrError->empty()
+ ? BC.getBinaryFunctionContainingAddress(RangesOrError->front().LowPC)
+ : nullptr;
+ DebugAddressRangesVector OutputRanges;
+ if (Function) {
+ OutputRanges = translateInputToOutputRanges(*Function, *RangesOrError);
+ LLVM_DEBUG(if (OutputRanges.empty() != RangesOrError->empty()) {
+ dbgs() << "BOLT-DEBUG: problem with DIE at 0x"
+ << Twine::utohexstr(Die.getOffset()) << " in CU at 0x"
+ << Twine::utohexstr(Unit.getOffset()) << '\n';
+ });
+ if (opts::AlwaysConvertToRanges || OutputRanges.size() > 1) {
+ RangesSectionOffset =
+ RangesSectionWriter.addRanges(std::move(OutputRanges), CachedRanges);
+ OutputRanges.clear();
+ } else if (OutputRanges.empty()) {
+ OutputRanges.push_back({0, RangesOrError.get().front().HighPC});
+ }
+ } else if (!RangesOrError) {
+ consumeError(RangesOrError.takeError());
+ } else {
+ OutputRanges.push_back(
+ {0, !RangesOrError->empty() ? RangesOrError.get().front().HighPC : 0});
+ }
+ DIEValue LowPCVal = Die.findAttribute(dwarf::DW_AT_low_pc);
+ DIEValue HighPCVal = Die.findAttribute(dwarf::DW_AT_high_pc);
+ if (OutputRanges.size() == 1) {
+ updateLowPCHighPC(&Die, LowPCVal, HighPCVal, OutputRanges.back().LowPC,
+ OutputRanges.back().HighPC);
+ return;
+ }
+ updateDWARFObjectAddressRanges(Unit, DIEBldr, Die, RangesSectionOffset);
+}
- break;
+void DWARFRewriter::handleCallSite(DIE &Die, DWARFUnit &Unit,
+ DIEBuilder &DIEBldr,
+ DebugAddrWriter &AddressWriter) {
+ auto patchPC = [&](DIE *Die, DIEValue &AttrVal, StringRef Entry) -> void {
+ std::optional<uint64_t> Address = getAsAddress(Unit, AttrVal);
+ const BinaryFunction *Function =
+ BC.getBinaryFunctionContainingAddress(*Address);
+ uint64_t UpdatedAddress = *Address;
+ if (Function)
+ UpdatedAddress = Function->translateInputToOutputAddress(UpdatedAddress);
+
+ if (AttrVal.getForm() == dwarf::DW_FORM_addrx) {
+ const uint32_t Index =
+ AddressWriter.getIndexFromAddress(UpdatedAddress, Unit);
+ DIEBldr.replaceValue(Die, AttrVal.getAttribute(), AttrVal.getForm(),
+ DIEInteger(Index));
+ } else if (AttrVal.getForm() == dwarf::DW_FORM_addr) {
+ DIEBldr.replaceValue(Die, AttrVal.getAttribute(), AttrVal.getForm(),
+ DIEInteger(UpdatedAddress));
+ } else {
+ errs() << "BOLT-ERROR: unsupported form for " << Entry << "\n";
}
- default: {
- // Handle any tag that can have DW_AT_location attribute.
- DIEValue LocAttrInfo = Die->findAttribute(dwarf::DW_AT_location);
- DIEValue LowPCAttrInfo = Die->findAttribute(dwarf::DW_AT_low_pc);
- if (LocAttrInfo) {
- if (doesFormBelongToClass(LocAttrInfo.getForm(),
- DWARFFormValue::FC_Constant,
- Unit.getVersion()) ||
- doesFormBelongToClass(LocAttrInfo.getForm(),
- DWARFFormValue::FC_SectionOffset,
- Unit.getVersion())) {
- uint64_t Offset = LocAttrInfo.getForm() == dwarf::DW_FORM_loclistx
- ? LocAttrInfo.getDIELocList().getValue()
- : LocAttrInfo.getDIEInteger().getValue();
- DebugLocationsVector InputLL;
-
- std::optional<object::SectionedAddress> SectionAddress =
- Unit.getBaseAddress();
- uint64_t BaseAddress = 0;
- if (SectionAddress)
- BaseAddress = SectionAddress->Address;
-
- if (Unit.getVersion() >= 5 &&
- LocAttrInfo.getForm() == dwarf::DW_FORM_loclistx) {
- std::optional<uint64_t> LocOffset = Unit.getLoclistOffset(Offset);
- assert(LocOffset && "Location Offset is invalid.");
- Offset = *LocOffset;
- }
+ };
+ DIEValue CallPcAttrVal = Die.findAttribute(dwarf::DW_AT_call_pc);
+ if (CallPcAttrVal)
+ patchPC(&Die, CallPcAttrVal, "DW_AT_call_pc");
- Error E = Unit.getLocationTable().visitLocationList(
+ DIEValue CallRetPcAttrVal = Die.findAttribute(dwarf::DW_AT_call_return_pc);
+ if (CallRetPcAttrVal)
+ patchPC(&Die, CallRetPcAttrVal, "DW_AT_call_return_pc");
+}
+
+void DWARFRewriter::handleDefaultCase(
+ DIE &Die, DWARFUnit &Unit, DIEBuilder &DIEBldr,
+ DebugLocWriter &DebugLocWriter,
+ DebugRangesSectionWriter &RangesSectionWriter,
+ DebugAddrWriter &AddressWriter) {
+ // Handle any tag that can have DW_AT_location attribute.
+ DIEValue LocAttrInfo = Die.findAttribute(dwarf::DW_AT_location);
+ DIEValue LowPCAttrInfo = Die.findAttribute(dwarf::DW_AT_low_pc);
+ if (LocAttrInfo) {
+ if (doesFormBelongToClass(LocAttrInfo.getForm(),
+ DWARFFormValue::FC_Constant, Unit.getVersion()) ||
+ doesFormBelongToClass(LocAttrInfo.getForm(),
+ DWARFFormValue::FC_SectionOffset,
+ Unit.getVersion())) {
+ uint64_t Offset = LocAttrInfo.getForm() == dwarf::DW_FORM_loclistx
+ ? LocAttrInfo.getDIELocList().getValue()
+ : LocAttrInfo.getDIEInteger().getValue();
+ DebugLocationsVector InputLL;
+
+ std::optional<object::SectionedAddress> SectionAddress =
+ Unit.getBaseAddress();
+ uint64_t BaseAddress = 0;
+ if (SectionAddress)
+ BaseAddress = SectionAddress->Address;
+
+ if (Unit.getVersion() >= 5 &&
+ LocAttrInfo.getForm() == dwarf::DW_FORM_loclistx) {
+ std::optional<uint64_t> LocOffset = Unit.getLoclistOffset(Offset);
+ assert(LocOffset && "Location Offset is invalid.");
+ Offset = *LocOffset;
+ }
+
+ Error E =
+ Unit.getLocationTable().visitLocationList(
&Offset, [&](const DWARFLocationEntry &Entry) {
switch (Entry.Kind) {
default:
@@ -1097,188 +1169,177 @@ void DWARFRewriter::updateUnitDebugInfo(
return true;
});
- if (E || InputLL.empty()) {
- consumeError(std::move(E));
- errs() << "BOLT-WARNING: empty location list detected at 0x"
- << Twine::utohexstr(Offset) << " for DIE at 0x" << Die
- << " in CU at 0x" << Twine::utohexstr(Unit.getOffset())
- << '\n';
- } else {
- const uint64_t Address = InputLL.front().LowPC;
- DebugLocationsVector OutputLL;
- if (const BinaryFunction *Function =
- BC.getBinaryFunctionContainingAddress(Address)) {
- OutputLL = translateInputToOutputLocationList(*Function, InputLL);
- LLVM_DEBUG(if (OutputLL.empty()) {
- dbgs() << "BOLT-DEBUG: location list translated to an empty "
- "one at 0x"
- << Die << " in CU at 0x"
- << Twine::utohexstr(Unit.getOffset()) << '\n';
- });
- } else {
- // It's possible for a subprogram to be removed and to have
- // address of 0. Adding this entry to output to preserve debug
- // information.
- OutputLL = InputLL;
- }
- DebugLocWriter.addList(DIEBldr, *Die, LocAttrInfo, OutputLL);
+ if (E || InputLL.empty()) {
+ consumeError(std::move(E));
+ errs() << "BOLT-WARNING: empty location list detected at 0x"
+ << Twine::utohexstr(Offset) << " for DIE at 0x" << &Die
+ << " in CU at 0x" << Twine::utohexstr(Unit.getOffset()) << '\n';
+ } else {
+ const uint64_t Address = InputLL.front().LowPC;
+ DebugLocationsVector OutputLL;
+ if (const BinaryFunction *Function =
+ BC.getBinaryFunctionContainingAddress(Address)) {
+ OutputLL = translateInputToOutputLocationList(*Function, InputLL);
+ LLVM_DEBUG(if (OutputLL.empty()) {
+ dbgs() << "BOLT-DEBUG: location list translated to an empty "
+ "one at 0x"
+ << &Die << " in CU at 0x"
+ << Twine::utohexstr(Unit.getOffset()) << '\n';
+ });
+ } else {
+ // It's possible for a subprogram to be removed and to have
+ // address of 0. Adding this entry to output to preserve debug
+ // information.
+ OutputLL = InputLL;
+ }
+ DebugLocWriter.addList(DIEBldr, Die, LocAttrInfo, OutputLL);
+ }
+ } else {
+ assert((doesFormBelongToClass(LocAttrInfo.getForm(),
+ DWARFFormValue::FC_Exprloc,
+ Unit.getVersion()) ||
+ doesFormBelongToClass(LocAttrInfo.getForm(),
+ DWARFFormValue::FC_Block,
+ Unit.getVersion())) &&
+ "unexpected DW_AT_location form");
+ if (Unit.isDWOUnit() || Unit.getVersion() >= 5) {
+ std::vector<uint8_t> Sblock;
+ DIEValueList *AttrLocValList;
+ if (doesFormBelongToClass(LocAttrInfo.getForm(),
+ DWARFFormValue::FC_Exprloc,
+ Unit.getVersion())) {
+ for (const DIEValue &Val : LocAttrInfo.getDIELoc().values()) {
+ Sblock.push_back(Val.getDIEInteger().getValue());
}
+ DIELoc *LocAttr = const_cast<DIELoc *>(&LocAttrInfo.getDIELoc());
+ AttrLocValList = static_cast<DIEValueList *>(LocAttr);
} else {
- assert((doesFormBelongToClass(LocAttrInfo.getForm(),
- DWARFFormValue::FC_Exprloc,
- Unit.getVersion()) ||
- doesFormBelongToClass(LocAttrInfo.getForm(),
- DWARFFormValue::FC_Block,
- Unit.getVersion())) &&
- "unexpected DW_AT_location form");
- if (Unit.isDWOUnit() || Unit.getVersion() >= 5) {
- std::vector<uint8_t> Sblock;
- DIEValueList *AttrLocValList;
- if (doesFormBelongToClass(LocAttrInfo.getForm(),
- DWARFFormValue::FC_Exprloc,
- Unit.getVersion())) {
- for (const DIEValue &Val : LocAttrInfo.getDIELoc().values()) {
- Sblock.push_back(Val.getDIEInteger().getValue());
- }
- DIELoc *LocAttr = const_cast<DIELoc *>(&LocAttrInfo.getDIELoc());
- AttrLocValList = static_cast<DIEValueList *>(LocAttr);
- } else {
- for (const DIEValue &Val : LocAttrInfo.getDIEBlock().values()) {
- Sblock.push_back(Val.getDIEInteger().getValue());
- }
- DIEBlock *BlockAttr =
- const_cast<DIEBlock *>(&LocAttrInfo.getDIEBlock());
- AttrLocValList = static_cast<DIEValueList *>(BlockAttr);
- }
- ArrayRef<uint8_t> Expr = ArrayRef<uint8_t>(Sblock);
- DataExtractor Data(
- StringRef((const char *)Expr.data(), Expr.size()),
- Unit.getContext().isLittleEndian(), 0);
- DWARFExpression LocExpr(Data, Unit.getAddressByteSize(),
- Unit.getFormParams().Format);
- uint32_t PrevOffset = 0;
- DIEValueList *NewAttr;
- DIEValue Value;
- uint32_t NewExprSize = 0;
- DIELoc *Loc = nullptr;
- DIEBlock *Block = nullptr;
- if (LocAttrInfo.getForm() == dwarf::DW_FORM_exprloc) {
- Loc = DIEBldr.allocateDIEValue<DIELoc>();
- NewAttr = Loc;
- Value = DIEValue(LocAttrInfo.getAttribute(),
- LocAttrInfo.getForm(), Loc);
- } else if (doesFormBelongToClass(LocAttrInfo.getForm(),
- DWARFFormValue::FC_Block,
- Unit.getVersion())) {
- Block = DIEBldr.allocateDIEValue<DIEBlock>();
- NewAttr = Block;
- Value = DIEValue(LocAttrInfo.getAttribute(),
- LocAttrInfo.getForm(), Block);
- } else {
- errs() << "BOLT-WARNING: Unexpected Form value in Updating "
- "DW_AT_Location\n";
- continue;
- }
-
- for (const DWARFExpression::Operation &Expr : LocExpr) {
- uint32_t CurEndOffset = PrevOffset + 1;
- if (Expr.getDescription().Op.size() == 1)
- CurEndOffset = Expr.getOperandEndOffset(0);
- if (Expr.getDescription().Op.size() == 2)
- CurEndOffset = Expr.getOperandEndOffset(1);
- if (Expr.getDescription().Op.size() > 2)
- errs() << "BOLT-WARNING: [internal-dwarf-error]: Unsupported "
- "number of operands.\n";
- // not addr index, just copy.
- if (!(Expr.getCode() == dwarf::DW_OP_GNU_addr_index ||
- Expr.getCode() == dwarf::DW_OP_addrx)) {
- auto Itr = AttrLocValList->values().begin();
- std::advance(Itr, PrevOffset);
- uint32_t CopyNum = CurEndOffset - PrevOffset;
- NewExprSize += CopyNum;
- while (CopyNum--) {
- DIEBldr.addValue(NewAttr, *Itr);
- std::advance(Itr, 1);
- }
- } else {
- const uint64_t Index = Expr.getRawOperand(0);
- std::optional<object::SectionedAddress> EntryAddress =
- Unit.getAddrOffsetSectionItem(Index);
- assert(EntryAddress && "Address is not found.");
- assert(Index <= std::numeric_limits<uint32_t>::max() &&
- "Invalid Operand Index.");
- const uint32_t AddrIndex = AddressWriter.getIndexFromAddress(
- EntryAddress->Address, Unit);
- // update Index into .debug_address section for DW_AT_location.
- // The Size field is not stored in IR, we need to minus 1 in
- // offset for each expr.
- SmallString<8> Tmp;
- raw_svector_ostream OSE(Tmp);
- encodeULEB128(AddrIndex, OSE);
-
- DIEBldr.addValue(NewAttr, static_cast<dwarf::Attribute>(0),
- dwarf::DW_FORM_data1,
- DIEInteger(Expr.getCode()));
- NewExprSize += 1;
- for (uint8_t Byte : Tmp) {
- DIEBldr.addValue(NewAttr, static_cast<dwarf::Attribute>(0),
- dwarf::DW_FORM_data1, DIEInteger(Byte));
- NewExprSize += 1;
- }
- }
- PrevOffset = CurEndOffset;
- }
-
- // update the size since the index might be changed
- if (Loc)
- Loc->setSize(NewExprSize);
- else
- Block->setSize(NewExprSize);
- DIEBldr.replaceValue(Die, LocAttrInfo.getAttribute(),
- LocAttrInfo.getForm(), Value);
+ for (const DIEValue &Val : LocAttrInfo.getDIEBlock().values()) {
+ Sblock.push_back(Val.getDIEInteger().getValue());
}
+ DIEBlock *BlockAttr =
+ const_cast<DIEBlock *>(&LocAttrInfo.getDIEBlock());
+ AttrLocValList = static_cast<DIEValueList *>(BlockAttr);
+ }
+ ArrayRef<uint8_t> Expr = ArrayRef<uint8_t>(Sblock);
+ DataExtractor Data(StringRef((const char *)Expr.data(), Expr.size()),
+ Unit.getContext().isLittleEndian(), 0);
+ DWARFExpression LocExpr(Data, Unit.getAddressByteSize(),
+ Unit.getFormParams().Format);
+ uint32_t PrevOffset = 0;
+ DIEValueList *NewAttr;
+ DIEValue Value;
+ uint32_t NewExprSize = 0;
+ DIELoc *Loc = nullptr;
+ DIEBlock *Block = nullptr;
+ if (LocAttrInfo.getForm() == dwarf::DW_FORM_exprloc) {
+ Loc = DIEBldr.allocateDIEValue<DIELoc>();
+ NewAttr = Loc;
+ Value =
+ DIEValue(LocAttrInfo.getAttribute(), LocAttrInfo.getForm(), Loc);
+ } else if (doesFormBelongToClass(LocAttrInfo.getForm(),
+ DWARFFormValue::FC_Block,
+ Unit.getVersion())) {
+ Block = DIEBldr.allocateDIEValue<DIEBlock>();
+ NewAttr = Block;
+ Value = DIEValue(LocAttrInfo.getAttribute(), LocAttrInfo.getForm(),
+ Block);
+ } else {
+ errs() << "BOLT-WARNING: Unexpected Form value in Updating "
+ "DW_AT_Location\n";
+ return;
}
- } else if (LowPCAttrInfo) {
- uint64_t Address = 0;
- uint64_t SectionIndex = 0;
- if (getLowPC(*Die, Unit, Address, SectionIndex)) {
- uint64_t NewAddress = 0;
- if (const BinaryFunction *Function =
- BC.getBinaryFunctionContainingAddress(Address)) {
- NewAddress = Function->translateInputToOutputAddress(Address);
- LLVM_DEBUG(dbgs()
- << "BOLT-DEBUG: Fixing low_pc 0x"
- << Twine::utohexstr(Address) << " for DIE with tag "
- << Die->getTag() << " to 0x"
- << Twine::utohexstr(NewAddress) << '\n');
- }
- dwarf::Form Form = LowPCAttrInfo.getForm();
- assert(Form != dwarf::DW_FORM_LLVM_addrx_offset &&
- "DW_FORM_LLVM_addrx_offset is not supported");
- std::lock_guard<std::mutex> Lock(DWARFRewriterMutex);
- if (Form == dwarf::DW_FORM_addrx ||
- Form == dwarf::DW_FORM_GNU_addr_index) {
- const uint32_t Index = AddressWriter.getIndexFromAddress(
- NewAddress ? NewAddress : Address, Unit);
- DIEBldr.replaceValue(Die, LowPCAttrInfo.getAttribute(),
- LowPCAttrInfo.getForm(), DIEInteger(Index));
+ for (const DWARFExpression::Operation &Expr : LocExpr) {
+ uint32_t CurEndOffset = PrevOffset + 1;
+ if (Expr.getDescription().Op.size() == 1)
+ CurEndOffset = Expr.getOperandEndOffset(0);
+ if (Expr.getDescription().Op.size() == 2)
+ CurEndOffset = Expr.getOperandEndOffset(1);
+ if (Expr.getDescription().Op.size() > 2)
+ errs() << "BOLT-WARNING: [internal-dwarf-error]: Unsupported "
+ "number of operands.\n";
+ // not addr index, just copy.
+ if (!(Expr.getCode() == dwarf::DW_OP_GNU_addr_index ||
+ Expr.getCode() == dwarf::DW_OP_addrx)) {
+ auto Itr = AttrLocValList->values().begin();
+ std::advance(Itr, PrevOffset);
+ uint32_t CopyNum = CurEndOffset - PrevOffset;
+ NewExprSize += CopyNum;
+ while (CopyNum--) {
+ DIEBldr.addValue(NewAttr, *Itr);
+ std::advance(Itr, 1);
+ }
} else {
- DIEBldr.replaceValue(Die, LowPCAttrInfo.getAttribute(),
- LowPCAttrInfo.getForm(),
- DIEInteger(NewAddress));
+ const uint64_t Index = Expr.getRawOperand(0);
+ std::optional<object::SectionedAddress> EntryAddress =
+ Unit.getAddrOffsetSectionItem(Index);
+ assert(EntryAddress && "Address is not found.");
+ assert(Index <= std::numeric_limits<uint32_t>::max() &&
+ "Invalid Operand Index.");
+ const uint32_t AddrIndex =
+ AddressWriter.getIndexFromAddress(EntryAddress->Address, Unit);
+ // update Index into .debug_address section for DW_AT_location.
+ // The Size field is not stored in IR, we need to minus 1 in
+ // offset for each expr.
+ SmallString<8> Tmp;
+ raw_svector_ostream OSE(Tmp);
+ encodeULEB128(AddrIndex, OSE);
+
+ DIEBldr.addValue(NewAttr, static_cast<dwarf::Attribute>(0),
+ dwarf::DW_FORM_data1, DIEInteger(Expr.getCode()));
+ NewExprSize += 1;
+ for (uint8_t Byte : Tmp) {
+ DIEBldr.addValue(NewAttr, static_cast<dwarf::Attribute>(0),
+ dwarf::DW_FORM_data1, DIEInteger(Byte));
+ NewExprSize += 1;
+ }
}
- } else if (opts::Verbosity >= 1) {
- errs() << "BOLT-WARNING: unexpected form value for attribute "
- "LowPCAttrInfo\n";
+ PrevOffset = CurEndOffset;
}
+
+ // update the size since the index might be changed
+ if (Loc)
+ Loc->setSize(NewExprSize);
+ else
+ Block->setSize(NewExprSize);
+ DIEBldr.replaceValue(&Die, LocAttrInfo.getAttribute(),
+ LocAttrInfo.getForm(), Value);
}
}
+ } else if (LowPCAttrInfo) {
+ uint64_t Address = 0;
+ uint64_t SectionIndex = 0;
+ if (getLowPC(Die, Unit, Address, SectionIndex)) {
+ uint64_t NewAddress = 0;
+ if (const BinaryFunction *Function =
+ BC.getBinaryFunctionContainingAddress(Address)) {
+ NewAddress = Function->translateInputToOutputAddress(Address);
+ LLVM_DEBUG(dbgs() << "BOLT-DEBUG: Fixing low_pc 0x"
+ << Twine::utohexstr(Address) << " for DIE with tag "
+ << Die.getTag() << " to 0x"
+ << Twine::utohexstr(NewAddress) << '\n');
+ }
+
+ dwarf::Form Form = LowPCAttrInfo.getForm();
+ assert(Form != dwarf::DW_FORM_LLVM_addrx_offset &&
+ "DW_FORM_LLVM_addrx_offset is not supported");
+ std::lock_guard<std::mutex> Lock(DWARFRewriterMutex);
+ if (Form == dwarf::DW_FORM_addrx ||
+ Form == dwarf::DW_FORM_GNU_addr_index) {
+ const uint32_t Index = AddressWriter.getIndexFromAddress(
+ NewAddress ? NewAddress : Address, Unit);
+ DIEBldr.replaceValue(&Die, LowPCAttrInfo.getAttribute(),
+ LowPCAttrInfo.getForm(), DIEInteger(Index));
+ } else {
+ DIEBldr.replaceValue(&Die, LowPCAttrInfo.getAttribute(),
+ LowPCAttrInfo.getForm(), DIEInteger(NewAddress));
+ }
+ } else if (opts::Verbosity >= 1) {
+ errs() << "BOLT-WARNING: unexpected form value for attribute "
+ "LowPCAttrInfo\n";
}
}
- if (DIEOffset > NextCUOffset)
- errs() << "BOLT-WARNING: corrupt DWARF detected at 0x"
- << Twine::utohexstr(Unit.getOffset()) << '\n';
}
void DWARFRewriter::updateDWARFObjectAddressRanges(
More information about the llvm-commits
mailing list