From d626bb872333b901ee6147522a48bfa2be994a7d Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Wed, 23 Sep 2020 22:00:57 -0700 Subject: [PATCH 1/2] [dwarfdump] Warn for tags with DW_CHILDREN_yes but no children. Flag DIEs that have DW_CHILDREN_yes set in their abbreviation but don't actually have any children. rdar://59809554 Differential revision: https://reviews.llvm.org/D88048 (cherry picked from commit e1ef7183c6f008fa13cbe273500b020c4fad1252) --- llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 9 ++++++++ .../test/DebugInfo/X86/skeleton-unit-verify.s | 4 +++- .../tools/llvm-dwarfdump/X86/no-children.yaml | 23 +++++++++++++++++++ .../llvm-dwarfdump/X86/verify_die_ranges.s | 3 ++- 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 3a83317a73a3b..895dd7d2a575d 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -172,6 +172,15 @@ unsigned DWARFVerifier::verifyUnitContents(DWARFUnit &Unit) { NumUnitErrors += verifyDebugInfoForm(Die, AttrValue); } + if (Die.hasChildren()) { + if (Die.getFirstChild().isValid() && + Die.getFirstChild().getTag() == DW_TAG_null) { + warn() << dwarf::TagString(Die.getTag()) + << " has DW_CHILDREN_yes but DIE has no children: "; + Die.dump(OS); + } + } + NumUnitErrors += verifyDebugInfoCallSite(Die); } diff --git a/llvm/test/DebugInfo/X86/skeleton-unit-verify.s b/llvm/test/DebugInfo/X86/skeleton-unit-verify.s index d990d918cef6f..95fbd113942a4 100644 --- a/llvm/test/DebugInfo/X86/skeleton-unit-verify.s +++ b/llvm/test/DebugInfo/X86/skeleton-unit-verify.s @@ -3,6 +3,8 @@ # CHECK: Verifying .debug_abbrev... # CHECK-NEXT: Verifying .debug_info Unit Header Chain... +# 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 .debug_info references... # CHECK-NEXT: Verifying .debug_types Unit Header Chain... @@ -30,7 +32,7 @@ .byte 8 # Address Size (in bytes) .long .debug_abbrev # Offset Into Abbrev. Section .quad -6573227469967412476 - .byte 1 # Abbrev [1] + .byte 1 # Abbrev [1] .byte 0 .Lcu_end0: .long .Lcu_end1-.Lcu_start1 # Length of Unit diff --git a/llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml b/llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml new file mode 100644 index 0000000000000..1417ab2bdc3f0 --- /dev/null +++ b/llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml @@ -0,0 +1,23 @@ +# RUN: yaml2obj %s | llvm-dwarfdump -verify - | FileCheck %s +# CHECK: warning: DW_TAG_compile_unit has DW_CHILDREN_yes but DIE has no children + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC +DWARF: + debug_abbrev: + - Table: + - Tag: DW_TAG_compile_unit + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_low_pc + Form: DW_FORM_data4 + debug_info: + - Version: 4 + Entries: + - AbbrCode: 1 + Values: + - Value: 0x1234 + - AbbrCode: 0 ## Terminator for the current DIE. diff --git a/llvm/test/tools/llvm-dwarfdump/X86/verify_die_ranges.s b/llvm/test/tools/llvm-dwarfdump/X86/verify_die_ranges.s index ea357b728897e..ea461b27e3e7d 100644 --- a/llvm/test/tools/llvm-dwarfdump/X86/verify_die_ranges.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/verify_die_ranges.s @@ -3,7 +3,8 @@ # RUN: | FileCheck %s # CHECK: Verifying .debug_info Unit Header Chain... -# CHECK-NEXT: error: Invalid address range [0x0000000000000007, 0x0000000000000006) +# CHECK: warning: DW_TAG_compile_unit has DW_CHILDREN_yes but DIE has no children: +# CHECK: error: Invalid address range [0x0000000000000007, 0x0000000000000006) .section __TEXT,__text,regular,pure_instructions .macosx_version_min 10, 12 From c6c82ad21ddb2064e28b51b71402639a6aa6f90b Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Tue, 6 Oct 2020 16:27:26 -0700 Subject: [PATCH 2/2] [llvm] Remove no-children.yaml test This test relies on functionality in obj2yaml that's not present on the stable branch. I made an attempt at backporting all the necessary changes but quickly realized it was too much churn for this change. --- .../tools/llvm-dwarfdump/X86/no-children.yaml | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml diff --git a/llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml b/llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml deleted file mode 100644 index 1417ab2bdc3f0..0000000000000 --- a/llvm/test/tools/llvm-dwarfdump/X86/no-children.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# RUN: yaml2obj %s | llvm-dwarfdump -verify - | FileCheck %s -# CHECK: warning: DW_TAG_compile_unit has DW_CHILDREN_yes but DIE has no children - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_EXEC -DWARF: - debug_abbrev: - - Table: - - Tag: DW_TAG_compile_unit - Children: DW_CHILDREN_yes - Attributes: - - Attribute: DW_AT_low_pc - Form: DW_FORM_data4 - debug_info: - - Version: 4 - Entries: - - AbbrCode: 1 - Values: - - Value: 0x1234 - - AbbrCode: 0 ## Terminator for the current DIE.