aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/DebugInfo
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-12-02 21:02:54 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-12-02 21:02:54 +0000
commitf65dcba83ce5035ab88a85fe17628b447eb56e1b (patch)
tree35f37bb72b3cfc6060193e66c76ee7c9478969b0 /llvm/lib/DebugInfo
parent846a2208a8ab099f595fe7e8b2e6d54a7b5e67fb (diff)
Diffstat (limited to 'llvm/lib/DebugInfo')
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp80
1 files changed, 30 insertions, 50 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
index fb0798f204e1..7673a721c4ea 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
@@ -15,6 +15,7 @@
#include "llvm/DebugInfo/DWARF/DWARFExpression.h"
#include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
#include "llvm/DebugInfo/DWARF/DWARFSection.h"
+#include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
#include "llvm/Support/DJB.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/WithColor.h"
@@ -317,12 +318,33 @@ bool DWARFVerifier::handleDebugAbbrev() {
return NumErrors == 0;
}
-unsigned DWARFVerifier::verifyUnitSection(const DWARFSection &S,
- DWARFSectionKind SectionKind) {
+unsigned DWARFVerifier::verifyUnits(const DWARFUnitVector &Units) {
+ unsigned NumDebugInfoErrors = 0;
+ ReferenceMap CrossUnitReferences;
+
+ for (const auto &Unit : Units) {
+ ReferenceMap UnitLocalReferences;
+ NumDebugInfoErrors +=
+ verifyUnitContents(*Unit, UnitLocalReferences, CrossUnitReferences);
+ NumDebugInfoErrors += verifyDebugInfoReferences(
+ UnitLocalReferences, [&](uint64_t Offset) { return Unit.get(); });
+ }
+
+ NumDebugInfoErrors += verifyDebugInfoReferences(
+ CrossUnitReferences, [&](uint64_t Offset) -> DWARFUnit * {
+ if (DWARFUnit *U = Units.getUnitForOffset(Offset))
+ return U;
+ return nullptr;
+ });
+
+ return NumDebugInfoErrors;
+}
+
+unsigned DWARFVerifier::verifyUnitSection(const DWARFSection &S) {
const DWARFObject &DObj = DCtx.getDWARFObj();
DWARFDataExtractor DebugInfoData(DObj, S, DCtx.isLittleEndian(), 0);
unsigned NumDebugInfoErrors = 0;
- uint64_t OffsetStart = 0, Offset = 0, UnitIdx = 0;
+ uint64_t Offset = 0, UnitIdx = 0;
uint8_t UnitType = 0;
bool isUnitDWARF64 = false;
bool isHeaderChainValid = true;
@@ -334,48 +356,11 @@ unsigned DWARFVerifier::verifyUnitSection(const DWARFSection &S,
/// lies between to valid DIEs.
ReferenceMap CrossUnitReferences;
while (hasDIE) {
- OffsetStart = Offset;
if (!verifyUnitHeader(DebugInfoData, &Offset, UnitIdx, UnitType,
isUnitDWARF64)) {
isHeaderChainValid = false;
if (isUnitDWARF64)
break;
- } else {
- DWARFUnitHeader Header;
- Header.extract(DCtx, DebugInfoData, &OffsetStart, SectionKind);
- ReferenceMap UnitLocalReferences;
- DWARFUnit *Unit;
- switch (UnitType) {
- case dwarf::DW_UT_type:
- case dwarf::DW_UT_split_type: {
- Unit = TypeUnitVector.addUnit(std::make_unique<DWARFTypeUnit>(
- DCtx, S, Header, DCtx.getDebugAbbrev(), &DObj.getRangesSection(),
- &DObj.getLocSection(), DObj.getStrSection(),
- DObj.getStrOffsetsSection(), &DObj.getAddrSection(),
- DObj.getLineSection(), DCtx.isLittleEndian(), false,
- TypeUnitVector));
- break;
- }
- case dwarf::DW_UT_skeleton:
- case dwarf::DW_UT_split_compile:
- case dwarf::DW_UT_compile:
- case dwarf::DW_UT_partial:
- // UnitType = 0 means that we are verifying a compile unit in DWARF v4.
- case 0: {
- Unit = CompileUnitVector.addUnit(std::make_unique<DWARFCompileUnit>(
- DCtx, S, Header, DCtx.getDebugAbbrev(), &DObj.getRangesSection(),
- &DObj.getLocSection(), DObj.getStrSection(),
- DObj.getStrOffsetsSection(), &DObj.getAddrSection(),
- DObj.getLineSection(), DCtx.isLittleEndian(), false,
- CompileUnitVector));
- break;
- }
- default: { llvm_unreachable("Invalid UnitType."); }
- }
- NumDebugInfoErrors +=
- verifyUnitContents(*Unit, UnitLocalReferences, CrossUnitReferences);
- NumDebugInfoErrors += verifyDebugInfoReferences(
- UnitLocalReferences, [&](uint64_t Offset) { return Unit; });
}
hasDIE = DebugInfoData.isValidOffset(Offset);
++UnitIdx;
@@ -386,14 +371,6 @@ unsigned DWARFVerifier::verifyUnitSection(const DWARFSection &S,
}
if (!isHeaderChainValid)
++NumDebugInfoErrors;
- NumDebugInfoErrors += verifyDebugInfoReferences(
- CrossUnitReferences, [&](uint64_t Offset) -> DWARFUnit * {
- if (DWARFUnit *U = TypeUnitVector.getUnitForOffset(Offset))
- return U;
- if (DWARFUnit *U = CompileUnitVector.getUnitForOffset(Offset))
- return U;
- return nullptr;
- });
return NumDebugInfoErrors;
}
@@ -403,13 +380,16 @@ bool DWARFVerifier::handleDebugInfo() {
OS << "Verifying .debug_info Unit Header Chain...\n";
DObj.forEachInfoSections([&](const DWARFSection &S) {
- NumErrors += verifyUnitSection(S, DW_SECT_INFO);
+ NumErrors += verifyUnitSection(S);
});
OS << "Verifying .debug_types Unit Header Chain...\n";
DObj.forEachTypesSections([&](const DWARFSection &S) {
- NumErrors += verifyUnitSection(S, DW_SECT_EXT_TYPES);
+ NumErrors += verifyUnitSection(S);
});
+
+ OS << "Verifying non-dwo Units...\n";
+ NumErrors += verifyUnits(DCtx.getNormalUnitsVector());
return NumErrors == 0;
}