[BOLT][DWARF][NFC] Split processUnitDIE into two lambdas (#99957)
Split processUnitDIE into two lambdas to separate the processing of DWO CUs and CUs in the main binary.
This commit is contained in:
@@ -620,8 +620,8 @@ void DWARFRewriter::updateDebugInfo() {
|
||||
uint32_t CUIndex = 0;
|
||||
std::mutex AccessMutex;
|
||||
// Needs to be invoked in the same order as CUs are processed.
|
||||
auto createRangeLocListAddressWriters =
|
||||
[&](DWARFUnit &CU) -> DebugLocWriter * {
|
||||
llvm::DenseMap<uint64_t, uint64_t> LocListWritersIndexByCU;
|
||||
auto createRangeLocListAddressWriters = [&](DWARFUnit &CU) {
|
||||
std::lock_guard<std::mutex> Lock(AccessMutex);
|
||||
const uint16_t DwarfVersion = CU.getVersion();
|
||||
if (DwarfVersion >= 5) {
|
||||
@@ -641,7 +641,6 @@ void DWARFRewriter::updateDebugInfo() {
|
||||
RangeListsWritersByCU[*DWOId] = std::move(DWORangeListsSectionWriter);
|
||||
}
|
||||
AddressWritersByCU[CU.getOffset()] = std::move(AddrW);
|
||||
|
||||
} else {
|
||||
auto AddrW =
|
||||
std::make_unique<DebugAddrWriter>(&BC, CU.getAddressByteSize());
|
||||
@@ -657,7 +656,7 @@ void DWARFRewriter::updateDebugInfo() {
|
||||
std::move(LegacyRangesSectionWriterByCU);
|
||||
}
|
||||
}
|
||||
return LocListWritersByCU[CUIndex++].get();
|
||||
LocListWritersIndexByCU[CU.getOffset()] = CUIndex++;
|
||||
};
|
||||
|
||||
DWARF5AcceleratorTable DebugNamesTable(opts::CreateDebugNames, BC,
|
||||
@@ -666,74 +665,70 @@ void DWARFRewriter::updateDebugInfo() {
|
||||
DWPState State;
|
||||
if (opts::WriteDWP)
|
||||
initDWPState(State);
|
||||
auto processUnitDIE = [&](DWARFUnit *Unit, DIEBuilder *DIEBlder) {
|
||||
// Check if the unit is a skeleton and we need special updates for it and
|
||||
// its matching split/DWO CU.
|
||||
auto processSplitCU = [&](DWARFUnit &Unit, DWARFUnit &SplitCU,
|
||||
DIEBuilder &DIEBlder,
|
||||
DebugRangesSectionWriter &TempRangesSectionWriter,
|
||||
DebugAddrWriter &AddressWriter) {
|
||||
DIEBuilder DWODIEBuilder(BC, &(SplitCU).getContext(), DebugNamesTable,
|
||||
&Unit);
|
||||
DWODIEBuilder.buildDWOUnit(SplitCU);
|
||||
std::string DWOName = "";
|
||||
std::optional<std::string> DwarfOutputPath =
|
||||
opts::DwarfOutputPath.empty()
|
||||
? std::nullopt
|
||||
: std::optional<std::string>(opts::DwarfOutputPath.c_str());
|
||||
{
|
||||
std::lock_guard<std::mutex> Lock(AccessMutex);
|
||||
DWOName = DIEBlder.updateDWONameCompDir(
|
||||
*StrOffstsWriter, *StrWriter, Unit, DwarfOutputPath, std::nullopt);
|
||||
}
|
||||
DebugStrOffsetsWriter DWOStrOffstsWriter(BC);
|
||||
DebugStrWriter DWOStrWriter((SplitCU).getContext(), true);
|
||||
DWODIEBuilder.updateDWONameCompDirForTypes(
|
||||
DWOStrOffstsWriter, DWOStrWriter, SplitCU, DwarfOutputPath, DWOName);
|
||||
DebugLoclistWriter DebugLocDWoWriter(Unit, Unit.getVersion(), true,
|
||||
AddressWriter);
|
||||
|
||||
updateUnitDebugInfo(SplitCU, DWODIEBuilder, DebugLocDWoWriter,
|
||||
TempRangesSectionWriter, AddressWriter);
|
||||
DebugLocDWoWriter.finalize(DWODIEBuilder,
|
||||
*DWODIEBuilder.getUnitDIEbyUnit(SplitCU));
|
||||
if (Unit.getVersion() >= 5)
|
||||
TempRangesSectionWriter.finalizeSection();
|
||||
|
||||
emitDWOBuilder(DWOName, DWODIEBuilder, *this, SplitCU, Unit, State,
|
||||
DebugLocDWoWriter, DWOStrOffstsWriter, DWOStrWriter,
|
||||
GDBIndexSection);
|
||||
};
|
||||
auto processMainBinaryCU = [&](DWARFUnit &Unit, DIEBuilder &DIEBlder) {
|
||||
std::optional<DWARFUnit *> SplitCU;
|
||||
std::optional<uint64_t> RangesBase;
|
||||
std::optional<uint64_t> DWOId = Unit->getDWOId();
|
||||
std::optional<uint64_t> DWOId = Unit.getDWOId();
|
||||
if (DWOId)
|
||||
SplitCU = BC.getDWOCU(*DWOId);
|
||||
DebugLocWriter *DebugLocWriter = createRangeLocListAddressWriters(*Unit);
|
||||
DebugRangesSectionWriter *RangesSectionWriter =
|
||||
Unit->getVersion() >= 5 ? RangeListsSectionWriter.get()
|
||||
: LegacyRangesSectionWriter.get();
|
||||
DebugAddrWriter *AddressWriter =
|
||||
AddressWritersByCU[Unit->getOffset()].get();
|
||||
// Skipping CUs that failed to load.
|
||||
if (SplitCU) {
|
||||
DIEBuilder DWODIEBuilder(BC, &(*SplitCU)->getContext(), DebugNamesTable,
|
||||
Unit);
|
||||
DWODIEBuilder.buildDWOUnit(**SplitCU);
|
||||
std::string DWOName = "";
|
||||
std::optional<std::string> DwarfOutputPath =
|
||||
opts::DwarfOutputPath.empty()
|
||||
? std::nullopt
|
||||
: std::optional<std::string>(opts::DwarfOutputPath.c_str());
|
||||
{
|
||||
std::lock_guard<std::mutex> Lock(AccessMutex);
|
||||
DWOName = DIEBlder->updateDWONameCompDir(
|
||||
*StrOffstsWriter, *StrWriter, *Unit, DwarfOutputPath, std::nullopt);
|
||||
}
|
||||
DebugStrOffsetsWriter DWOStrOffstsWriter(BC);
|
||||
DebugStrWriter DWOStrWriter((*SplitCU)->getContext(), true);
|
||||
DWODIEBuilder.updateDWONameCompDirForTypes(DWOStrOffstsWriter,
|
||||
DWOStrWriter, **SplitCU,
|
||||
DwarfOutputPath, DWOName);
|
||||
DebugLoclistWriter DebugLocDWoWriter(*Unit, Unit->getVersion(), true,
|
||||
*AddressWriter);
|
||||
DebugRangesSectionWriter *TempRangesSectionWriter = RangesSectionWriter;
|
||||
if (Unit->getVersion() >= 5) {
|
||||
TempRangesSectionWriter = RangeListsWritersByCU[*DWOId].get();
|
||||
} else {
|
||||
TempRangesSectionWriter = LegacyRangesWritersByCU[*DWOId].get();
|
||||
RangesBase = RangesSectionWriter->getSectionOffset();
|
||||
}
|
||||
|
||||
updateUnitDebugInfo(*(*SplitCU), DWODIEBuilder, DebugLocDWoWriter,
|
||||
*TempRangesSectionWriter, *AddressWriter);
|
||||
DebugLocDWoWriter.finalize(DWODIEBuilder,
|
||||
*DWODIEBuilder.getUnitDIEbyUnit(**SplitCU));
|
||||
if (Unit->getVersion() >= 5)
|
||||
TempRangesSectionWriter->finalizeSection();
|
||||
|
||||
emitDWOBuilder(DWOName, DWODIEBuilder, *this, **SplitCU, *Unit, State,
|
||||
DebugLocDWoWriter, DWOStrOffstsWriter, DWOStrWriter,
|
||||
GDBIndexSection);
|
||||
}
|
||||
|
||||
if (Unit->getVersion() >= 5) {
|
||||
RangesBase = RangesSectionWriter->getSectionOffset() +
|
||||
DebugLocWriter &DebugLocWriter =
|
||||
*LocListWritersByCU[LocListWritersIndexByCU[Unit.getOffset()]].get();
|
||||
DebugRangesSectionWriter &RangesSectionWriter =
|
||||
Unit.getVersion() >= 5 ? *RangeListsSectionWriter.get()
|
||||
: *LegacyRangesSectionWriter.get();
|
||||
DebugAddrWriter &AddressWriter =
|
||||
*AddressWritersByCU[Unit.getOffset()].get();
|
||||
if (Unit.getVersion() >= 5)
|
||||
RangeListsSectionWriter->setAddressWriter(&AddressWriter);
|
||||
if (Unit.getVersion() >= 5) {
|
||||
RangesBase = RangesSectionWriter.getSectionOffset() +
|
||||
getDWARF5RngListLocListHeaderSize();
|
||||
RangesSectionWriter->initSection(*Unit);
|
||||
StrOffstsWriter->finalizeSection(*Unit, *DIEBlder);
|
||||
RangesSectionWriter.initSection(Unit);
|
||||
StrOffstsWriter->finalizeSection(Unit, DIEBlder);
|
||||
} else if (SplitCU) {
|
||||
RangesBase = LegacyRangesSectionWriter.get()->getSectionOffset();
|
||||
}
|
||||
|
||||
updateUnitDebugInfo(*Unit, *DIEBlder, *DebugLocWriter, *RangesSectionWriter,
|
||||
*AddressWriter, RangesBase);
|
||||
DebugLocWriter->finalize(*DIEBlder, *DIEBlder->getUnitDIEbyUnit(*Unit));
|
||||
if (Unit->getVersion() >= 5)
|
||||
RangesSectionWriter->finalizeSection();
|
||||
updateUnitDebugInfo(Unit, DIEBlder, DebugLocWriter, RangesSectionWriter,
|
||||
AddressWriter, RangesBase);
|
||||
DebugLocWriter.finalize(DIEBlder, *DIEBlder.getUnitDIEbyUnit(Unit));
|
||||
if (Unit.getVersion() >= 5)
|
||||
RangesSectionWriter.finalizeSection();
|
||||
};
|
||||
|
||||
DIEBuilder DIEBlder(BC, BC.DwCtx.get(), DebugNamesTable);
|
||||
@@ -751,8 +746,24 @@ void DWARFRewriter::updateDebugInfo() {
|
||||
CUPartitionVector PartVec = partitionCUs(*BC.DwCtx);
|
||||
for (std::vector<DWARFUnit *> &Vec : PartVec) {
|
||||
DIEBlder.buildCompileUnits(Vec);
|
||||
for (DWARFUnit *CU : DIEBlder.getProcessedCUs()) {
|
||||
createRangeLocListAddressWriters(*CU);
|
||||
std::optional<DWARFUnit *> SplitCU;
|
||||
std::optional<uint64_t> DWOId = CU->getDWOId();
|
||||
if (DWOId)
|
||||
SplitCU = BC.getDWOCU(*DWOId);
|
||||
if (!SplitCU)
|
||||
continue;
|
||||
DebugAddrWriter &AddressWriter =
|
||||
*AddressWritersByCU[CU->getOffset()].get();
|
||||
DebugRangesSectionWriter *TempRangesSectionWriter =
|
||||
CU->getVersion() >= 5 ? RangeListsWritersByCU[*DWOId].get()
|
||||
: LegacyRangesWritersByCU[*DWOId].get();
|
||||
processSplitCU(*CU, **SplitCU, DIEBlder, *TempRangesSectionWriter,
|
||||
AddressWriter);
|
||||
}
|
||||
for (DWARFUnit *CU : DIEBlder.getProcessedCUs())
|
||||
processUnitDIE(CU, &DIEBlder);
|
||||
processMainBinaryCU(*CU, DIEBlder);
|
||||
finalizeCompileUnits(DIEBlder, *Streamer, OffsetMap,
|
||||
DIEBlder.getProcessedCUs(), *FinalAddrWriter);
|
||||
}
|
||||
|
||||
@@ -5,10 +5,11 @@
|
||||
# RUN: %clang %cflags %tmain.o %thelper.o -o %t.exe
|
||||
# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections
|
||||
# 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
|
||||
|
||||
## This test checks that BOLT handles correctly backward and forward cross CU references
|
||||
## for DWARF5 and DWARF4 with -fdebug-types-section
|
||||
## for DWARF5 and DWARF4 with -fdebug-types-section and checks the address table is correct.
|
||||
|
||||
# POSTCHECK: version = 0x0005
|
||||
# POSTCHECK: DW_TAG_type_unit
|
||||
@@ -29,6 +30,15 @@
|
||||
# POSTCHECK: DW_TAG_variable [20]
|
||||
# POSTCHECK: DW_AT_type [DW_FORM_ref_addr] (0x{{[0-9a-f]+}} "Foo3a")
|
||||
|
||||
# POSTCHECKADDR: Addrs: [
|
||||
# POSTCHECKADDR-NEXT: 0x0000000000001360
|
||||
# POSTCHECKADDR-NEXT: 0x0000000000000000
|
||||
# POSTCHECKADDR-NEXT: ]
|
||||
# POSTCHECKADDR: Addrs: [
|
||||
# POSTCHECKADDR-NEXT: 0x00000000000013e0
|
||||
# POSTCHECKADDR-NEXT: 0x0000000000000000
|
||||
# POSTCHECKADDR-NEXT: ]
|
||||
|
||||
# POSTCHECKTU: version = 0x0004
|
||||
# POSTCHECKTU: DW_TAG_type_unit
|
||||
# POSTCHECKTU: DW_TAG_structure_type
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
# 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-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
|
||||
|
||||
## This test checks that we update relative DIE references with DW_OP_convert that are in locexpr.
|
||||
## This test checks that we update relative DIE references with DW_OP_convert that are in locexpr
|
||||
## and checks the address table is correct.
|
||||
|
||||
# CHECK: version = 0x0005
|
||||
# CHECK: DW_TAG_variable
|
||||
@@ -19,3 +21,18 @@
|
||||
# CHECK-SAME: DW_OP_convert (0x00000028 -> 0x00000092)
|
||||
# CHECK-SAME: DW_OP_convert (0x0000002c -> 0x00000096)
|
||||
# CHECK: version = 0x0005
|
||||
|
||||
# CHECKADDR: Addrs: [
|
||||
# CHECKADDR-NEXT: 0x0000000000001330
|
||||
# CHECKADDR-NEXT: 0x0000000000000000
|
||||
# CHECKADDR-NEXT: 0x0000000000001333
|
||||
# CHECKADDR-NEXT: ]
|
||||
# CHECKADDR: Addrs: [
|
||||
# CHECKADDR-NEXT: 0x0000000000001340
|
||||
# CHECKADDR-NEXT: 0x0000000000000000
|
||||
# CHECKADDR-NEXT: 0x0000000000001343
|
||||
# CHECKADDR-NEXT: ]
|
||||
# CHECKADDR: Addrs: [
|
||||
# CHECKADDR-NEXT: 0x0000000000001320
|
||||
# CHECKADDR-NEXT: 0x0000000000000000
|
||||
# CHECKADDR-NEXT: ]
|
||||
|
||||
Reference in New Issue
Block a user