Skip to content

Commit f6367f8

Browse files
committed
add isValidDwarfUnit() to indentify if DU is valid
1 parent 9d55563 commit f6367f8

File tree

5 files changed

+657
-4
lines changed

5 files changed

+657
-4
lines changed

bolt/include/bolt/Core/BinaryContext.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,9 @@ class BinaryContext {
326326
/// Returns true if DWARF4 or lower is used.
327327
bool isDWARFLegacyUsed() const { return ContainsDwarfLegacy; }
328328

329+
// Return true if DWARFUnit is valid.
330+
bool isValidDwarfUnit(DWARFUnit *const DU) const;
331+
329332
std::map<unsigned, DwarfLineTable> &getDwarfLineTables() {
330333
return DwarfLineTablesCUMap;
331334
}

bolt/include/bolt/Core/DIEBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ class DIEBuilder {
217217
std::optional<BOLTDWARF5AccelTableData *> Parent,
218218
uint32_t NumberParentsInChain);
219219

220-
void registerUnit(DWARFUnit &DU, bool NeedSort);
220+
bool registerUnit(DWARFUnit &DU, bool NeedSort);
221221

222222
/// \return the unique ID of \p U if it exists.
223223
std::optional<uint32_t> getUnitId(const DWARFUnit &DU);

bolt/lib/Core/BinaryContext.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,10 +1624,26 @@ DWARFContext *BinaryContext::getDWOContext() const {
16241624
return &DWOCUs.begin()->second->getContext();
16251625
}
16261626

1627+
bool BinaryContext::isValidDwarfUnit(DWARFUnit *const DU) const {
1628+
// Invalid DWARF unit with a DWOId but lacking a dwo_name.
1629+
if (DU->getDWOId() && !DU->isDWOUnit() &&
1630+
!DU->getUnitDIE().find(
1631+
{dwarf::DW_AT_dwo_name, dwarf::DW_AT_GNU_dwo_name})) {
1632+
this->outs() << "BOLT-ERROR: Broken DWARF found in CU at offset 0x"
1633+
<< Twine::utohexstr(DU->getOffset()) << " (DWOId=0x"
1634+
<< Twine::utohexstr(*(DU->getDWOId()))
1635+
<< ", missing DW_AT_dwo_name / DW_AT_GNU_dwo_name).\n";
1636+
return false;
1637+
}
1638+
return true;
1639+
}
1640+
16271641
/// Handles DWO sections that can either be in .o, .dwo or .dwp files.
16281642
void BinaryContext::preprocessDWODebugInfo() {
16291643
for (const std::unique_ptr<DWARFUnit> &CU : DwCtx->compile_units()) {
16301644
DWARFUnit *const DwarfUnit = CU.get();
1645+
if (!isValidDwarfUnit(DwarfUnit))
1646+
continue;
16311647
if (std::optional<uint64_t> DWOId = DwarfUnit->getDWOId()) {
16321648
std::string DWOName = dwarf::toString(
16331649
DwarfUnit->getUnitDIE().find(

bolt/lib/Core/DIEBuilder.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,8 @@ DWARFDie DIEBuilder::resolveDIEReference(
584584
if ((RefCU =
585585
getUnitForOffset(*this, *DwarfContext, TmpRefOffset, AttrSpec))) {
586586
/// Trying to add to current working set in case it's cross CU reference.
587-
registerUnit(*RefCU, true);
587+
if (!registerUnit(*RefCU, true))
588+
return DWARFDie();
588589
DWARFDataExtractor DebugInfoData = RefCU->getDebugInfoExtractor();
589590
if (DwarfDebugInfoEntry.extractFast(*RefCU, &TmpRefOffset, DebugInfoData,
590591
RefCU->getNextUnitOffset(), 0)) {
@@ -1008,12 +1009,14 @@ static uint64_t getHash(const DWARFUnit &DU) {
10081009
return DU.getOffset();
10091010
}
10101011

1011-
void DIEBuilder::registerUnit(DWARFUnit &DU, bool NeedSort) {
1012+
bool DIEBuilder::registerUnit(DWARFUnit &DU, bool NeedSort) {
1013+
if (!BC.isValidDwarfUnit(&DU))
1014+
return false;
10121015
auto IterGlobal = AllProcessed.insert(getHash(DU));
10131016
// If DU is already in a current working set or was already processed we can
10141017
// skip it.
10151018
if (!IterGlobal.second)
1016-
return;
1019+
return true;
10171020
if (getState().Type == ProcessingType::DWARF4TUs) {
10181021
getState().DWARF4TUVector.push_back(&DU);
10191022
} else if (getState().Type == ProcessingType::DWARF5TUs) {
@@ -1034,6 +1037,7 @@ void DIEBuilder::registerUnit(DWARFUnit &DU, bool NeedSort) {
10341037
if (getState().DUList.size() == getState().CloneUnitCtxMap.size())
10351038
getState().CloneUnitCtxMap.emplace_back();
10361039
getState().DUList.push_back(&DU);
1040+
return true;
10371041
}
10381042

10391043
std::optional<uint32_t> DIEBuilder::getUnitId(const DWARFUnit &DU) {

0 commit comments

Comments
 (0)