[llvm] [BOLT][DWARF] Refactor helper functions that update DW_AT_comp_dir/DW_AT_dwo_name (PR #91237)
Alexander Yermolovich via llvm-commits
llvm-commits at lists.llvm.org
Mon May 6 09:44:24 PDT 2024
https://github.com/ayermolo created https://github.com/llvm/llvm-project/pull/91237
We need to update DW_AT_comp_dir/DW_AT_dwo_name TU in the .debug_info.dwo section so that the path is correct. Refactored helper functions to make it easier for next step.
>From c2af7c7ed22d5f5cd3b32145a39f2d31704262d2 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 6 May 2024 09:26:38 -0700
Subject: [PATCH] [BOLT][DWARF][NFC] Refactor helper functions that update
CompDIr/DWO_name
Summary:
We need to update DW_AT_comp_dir/DW_AT_dwo_name TU in the .debug_info.dwo
section so that the path is correct. Refactored helper functions to make it
easier for next step.
Test Plan:
Reviewers:
Subscribers:
Tasks:
Tags:
Differential Revision: https://phabricator.intern.facebook.com/D57003722
---
bolt/include/bolt/Rewrite/DWARFRewriter.h | 7 --
bolt/lib/Rewrite/DWARFRewriter.cpp | 80 +++++++++++++----------
2 files changed, 45 insertions(+), 42 deletions(-)
diff --git a/bolt/include/bolt/Rewrite/DWARFRewriter.h b/bolt/include/bolt/Rewrite/DWARFRewriter.h
index 2c482bd2b9ea96..12e0813d089d14 100644
--- a/bolt/include/bolt/Rewrite/DWARFRewriter.h
+++ b/bolt/include/bolt/Rewrite/DWARFRewriter.h
@@ -177,13 +177,6 @@ class DWARFRewriter {
DIEValue &HighPCAttrInfo,
std::optional<uint64_t> RangesBase = std::nullopt);
- /// Adds a \p Str to .debug_str section.
- /// Uses \p AttrInfoVal to either update entry in a DIE for legacy DWARF using
- /// \p DebugInfoPatcher, or for DWARF5 update an index in .debug_str_offsets
- /// for this contribution of \p Unit.
- void addStringHelper(DIEBuilder &DIEBldr, DIE &Die, const DWARFUnit &Unit,
- DIEValue &DIEAttrInfo, StringRef Str);
-
public:
DWARFRewriter(BinaryContext &BC) : BC(BC) {}
diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp
index feeba89a40dc4d..26e4889faadace 100644
--- a/bolt/lib/Rewrite/DWARFRewriter.cpp
+++ b/bolt/lib/Rewrite/DWARFRewriter.cpp
@@ -582,19 +582,51 @@ static void emitDWOBuilder(const std::string &DWOName,
Rewriter.writeDWOFiles(CU, OverriddenSections, DWOName, LocWriter);
}
-void DWARFRewriter::addStringHelper(DIEBuilder &DIEBldr, DIE &Die,
- const DWARFUnit &Unit,
- DIEValue &DIEAttrInfo, StringRef Str) {
- uint32_t NewOffset = StrWriter->addString(Str);
+/// Adds a \p Str to .debug_str section.
+/// Uses \p AttrInfoVal to either update entry in a DIE for legacy DWARF using
+/// \p DebugInfoPatcher, or for DWARF5 update an index in .debug_str_offsets
+/// for this contribution of \p Unit.
+static void addStringHelper(DebugStrOffsetsWriter &StrOffstsWriter,
+ DebugStrWriter &StrWriter, DIEBuilder &DIEBldr,
+ DIE &Die, const DWARFUnit &Unit,
+ DIEValue &DIEAttrInfo, StringRef Str) {
+ uint32_t NewOffset = StrWriter.addString(Str);
if (Unit.getVersion() >= 5) {
- StrOffstsWriter->updateAddressMap(DIEAttrInfo.getDIEInteger().getValue(),
- NewOffset);
+ StrOffstsWriter.updateAddressMap(DIEAttrInfo.getDIEInteger().getValue(),
+ NewOffset);
return;
}
DIEBldr.replaceValue(&Die, DIEAttrInfo.getAttribute(), DIEAttrInfo.getForm(),
DIEInteger(NewOffset));
}
+static std::string
+updateDWONameCompDir(DebugStrOffsetsWriter &StrOffstsWriter,
+ DebugStrWriter &StrWriter,
+ std::unordered_map<std::string, uint32_t> &NameToIndexMap,
+ DWARFUnit &Unit, DIEBuilder &DIEBldr, DIE &UnitDIE) {
+ DIEValue DWONameAttrInfo = UnitDIE.findAttribute(dwarf::DW_AT_dwo_name);
+ if (!DWONameAttrInfo)
+ DWONameAttrInfo = UnitDIE.findAttribute(dwarf::DW_AT_GNU_dwo_name);
+ assert(DWONameAttrInfo && "DW_AT_dwo_name is not in Skeleton CU.");
+ std::string ObjectName;
+
+ ObjectName = getDWOName(Unit, NameToIndexMap);
+ addStringHelper(StrOffstsWriter, StrWriter, DIEBldr, UnitDIE, Unit,
+ DWONameAttrInfo, ObjectName.c_str());
+
+ DIEValue CompDirAttrInfo = UnitDIE.findAttribute(dwarf::DW_AT_comp_dir);
+ assert(CompDirAttrInfo && "DW_AT_comp_dir is not in Skeleton CU.");
+
+ if (!opts::DwarfOutputPath.empty()) {
+ if (!sys::fs::exists(opts::DwarfOutputPath))
+ sys::fs::create_directory(opts::DwarfOutputPath);
+ addStringHelper(StrOffstsWriter, StrWriter, DIEBldr, UnitDIE, Unit,
+ CompDirAttrInfo, opts::DwarfOutputPath.c_str());
+ }
+ return ObjectName;
+}
+
using DWARFUnitVec = std::vector<DWARFUnit *>;
using CUPartitionVector = std::vector<DWARFUnitVec>;
/// Partitions CUs in to buckets. Bucket size is controlled by
@@ -692,33 +724,6 @@ void DWARFRewriter::updateDebugInfo() {
// specified.
std::unordered_map<std::string, uint32_t> NameToIndexMap;
- auto updateDWONameCompDir = [&](DWARFUnit &Unit, DIEBuilder &DIEBldr,
- DIE &UnitDIE) -> std::string {
- DIEValue DWONameAttrInfo = UnitDIE.findAttribute(dwarf::DW_AT_dwo_name);
- if (!DWONameAttrInfo)
- DWONameAttrInfo = UnitDIE.findAttribute(dwarf::DW_AT_GNU_dwo_name);
- assert(DWONameAttrInfo && "DW_AT_dwo_name is not in Skeleton CU.");
- std::string ObjectName;
-
- {
- std::lock_guard<std::mutex> Lock(AccessMutex);
- ObjectName = getDWOName(Unit, NameToIndexMap);
- }
- addStringHelper(DIEBldr, UnitDIE, Unit, DWONameAttrInfo,
- ObjectName.c_str());
-
- DIEValue CompDirAttrInfo = UnitDIE.findAttribute(dwarf::DW_AT_comp_dir);
- assert(CompDirAttrInfo && "DW_AT_comp_dir is not in Skeleton CU.");
-
- if (!opts::DwarfOutputPath.empty()) {
- if (!sys::fs::exists(opts::DwarfOutputPath))
- sys::fs::create_directory(opts::DwarfOutputPath);
- addStringHelper(DIEBldr, UnitDIE, Unit, CompDirAttrInfo,
- opts::DwarfOutputPath.c_str());
- }
- return ObjectName;
- };
-
DWARF5AcceleratorTable DebugNamesTable(opts::CreateDebugNames, BC,
*StrWriter);
DWPState State;
@@ -741,8 +746,13 @@ void DWARFRewriter::updateDebugInfo() {
DIEBuilder DWODIEBuilder(BC, &(*SplitCU)->getContext(), DebugNamesTable,
Unit);
DWODIEBuilder.buildDWOUnit(**SplitCU);
- std::string DWOName = updateDWONameCompDir(
- *Unit, *DIEBlder, *DIEBlder->getUnitDIEbyUnit(*Unit));
+ std::string DWOName = "";
+ {
+ std::lock_guard<std::mutex> Lock(AccessMutex);
+ DWOName = updateDWONameCompDir(*StrOffstsWriter, *StrWriter,
+ NameToIndexMap, *Unit, *DIEBlder,
+ *DIEBlder->getUnitDIEbyUnit(*Unit));
+ }
DebugLoclistWriter DebugLocDWoWriter(*Unit, Unit->getVersion(), true);
DebugRangesSectionWriter *TempRangesSectionWriter = RangesSectionWriter;
More information about the llvm-commits
mailing list