[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