diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h index ae1afeb668be4..24714ac3d101f 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h @@ -189,6 +189,11 @@ class DWARFContext : public DIContext { DWOUnits.begin() + DWOUnits.getNumInfoUnits()); } + const DWARFUnitVector &getDWOUnitsVector() { + parseDWOUnits(); + return DWOUnits; + } + /// Get units from .debug_types.dwo in the DWO context. unit_iterator_range dwo_types_section_units() { parseDWOUnits(); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 1e49798ab4260..67862200d7a90 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -390,6 +390,9 @@ bool DWARFVerifier::handleDebugInfo() { OS << "Verifying non-dwo Units...\n"; NumErrors += verifyUnits(DCtx.getNormalUnitsVector()); + + OS << "Verifying dwo Units...\n"; + NumErrors += verifyUnits(DCtx.getDWOUnitsVector()); return NumErrors == 0; } diff --git a/llvm/test/DebugInfo/X86/skeleton-unit-verify.s b/llvm/test/DebugInfo/X86/skeleton-unit-verify.s index 6441aa31d808f..8c3a223fdbf42 100644 --- a/llvm/test/DebugInfo/X86/skeleton-unit-verify.s +++ b/llvm/test/DebugInfo/X86/skeleton-unit-verify.s @@ -8,6 +8,7 @@ # CHECK-NEXT: warning: DW_TAG_skeleton_unit has DW_CHILDREN_yes but DIE has no children # CHECK-NEXT: DW_TAG_skeleton_unit # CHECK-NEXT: error: Skeleton compilation unit has children. +# CHECK-NEXT: Verifying dwo Units... # CHECK-NEXT: Errors detected. .section .debug_abbrev,"",@progbits diff --git a/llvm/test/tools/llvm-dwarfdump/X86/verify_split_cu.s b/llvm/test/tools/llvm-dwarfdump/X86/verify_split_cu.s new file mode 100644 index 0000000000000..14c8da2fcf803 --- /dev/null +++ b/llvm/test/tools/llvm-dwarfdump/X86/verify_split_cu.s @@ -0,0 +1,18 @@ +# RUN: llvm-mc %s -filetype obj -triple x86_64-linux-gnu -o - \ +# RUN: | not llvm-dwarfdump -v -verify - \ +# RUN: | FileCheck %s --implicit-check-not=error --implicit-check-not=warning + +# CHECK: Verifying dwo Units... +# CHECK: error: Compilation unit root DIE is not a unit DIE: DW_TAG_null. +# CHECK: error: Compilation unit type (DW_UT_split_compile) and root DIE (DW_TAG_null) do not match. +# CHECK: Errors detected + .section .debug_info.dwo,"e",@progbits + .long .Ldebug_info_dwo_end1-.Ldebug_info_dwo_start1 # Length of Unit +.Ldebug_info_dwo_start1: + .short 5 # DWARF version number + .byte 5 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long 0 # Offset Into Abbrev. Section + .quad 5527374834836270265 + .byte 0 # End Of Children Mark +.Ldebug_info_dwo_end1: