diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/lib/DebugInfo/DWARFDebugInfoEntry.cpp index 15c04cb949b..583e70055c0 100644 --- a/lib/DebugInfo/DWARFDebugInfoEntry.cpp +++ b/lib/DebugInfo/DWARFDebugInfoEntry.cpp @@ -88,12 +88,27 @@ static void dumpApplePropertyAttribute(raw_ostream &OS, uint64_t Val) { OS << ")"; } +static void dumpRanges(raw_ostream &OS, const DWARFAddressRangesVector& Ranges, + unsigned AddressSize, unsigned Indent) { + if (Ranges.empty()) + return; + + for (const auto &Range: Ranges) { + OS << '\n'; + OS.indent(Indent); + OS << format("[0x%0*" PRIx64 " - 0x%0*" PRIx64 ")", + AddressSize*2, Range.first, + AddressSize*2, Range.second); + } +} + void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS, DWARFUnit *u, uint32_t *offset_ptr, uint16_t attr, uint16_t form, unsigned indent) const { - OS << " "; + const char BaseIndent[] = " "; + OS << BaseIndent; OS.indent(indent+2); const char *attrString = AttributeString(attr); if (attrString) @@ -149,6 +164,9 @@ void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS, } else if (attr == DW_AT_APPLE_property_attribute) { if (Optional OptVal = formValue.getAsUnsignedConstant()) dumpApplePropertyAttribute(OS, *OptVal); + } else if (attr == DW_AT_ranges) { + dumpRanges(OS, getAddressRanges(u), u->getAddressByteSize(), + sizeof(BaseIndent)+indent+4); } OS << ")\n"; diff --git a/test/DebugInfo/Inputs/gmlt.ll b/test/DebugInfo/Inputs/gmlt.ll index 82949d2ad17..8de03decd76 100644 --- a/test/DebugInfo/Inputs/gmlt.ll +++ b/test/DebugInfo/Inputs/gmlt.ll @@ -14,7 +14,7 @@ ; describes those subprograms ; CHECK: DW_TAG_compile_unit -; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000) +; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 ; CHECK-NOT: {{DW_TAG|NULL}} ; Omitting the subprograms without inlined subroutines is not possible diff --git a/test/DebugInfo/X86/fission-ranges.ll b/test/DebugInfo/X86/fission-ranges.ll index 124aa987cd3..f66382a7d2b 100644 --- a/test/DebugInfo/X86/fission-ranges.ll +++ b/test/DebugInfo/X86/fission-ranges.ll @@ -16,7 +16,7 @@ ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[E:0x[0-9a-z]*]]) ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[B:0x[0-9a-z]*]]) ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[D:0x[0-9a-z]*]]) -; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000) +; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 ; CHECK: .debug_loc contents: ; CHECK-NOT: Beginning address offset ; CHECK: .debug_loc.dwo contents: diff --git a/test/DebugInfo/dwarfdump-ranges.test b/test/DebugInfo/dwarfdump-ranges.test index c9e33dcdc97..710aec6098a 100644 --- a/test/DebugInfo/dwarfdump-ranges.test +++ b/test/DebugInfo/dwarfdump-ranges.test @@ -1,5 +1,19 @@ RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test4.elf-x86-64 | FileCheck %s +CHECK: .debug_info contents: +CHECK: DW_TAG_compile_unit +CHECK-NOT: TAG +CHECK: DW_AT_ranges [DW_FORM_data4] (0x00000000 +CHECK-NEXT: [0x000000000000062c - 0x0000000000000637) +CHECK-NEXT: [0x0000000000000637 - 0x000000000000063d)) + +CHECK: DW_TAG_compile_unit +CHECK-NOT: TAG +CHECK: DW_AT_ranges [DW_FORM_data4] (0x00000030 +CHECK-NEXT: [0x0000000000000640 - 0x000000000000064b) +CHECK-NEXT: [0x0000000000000637 - 0x000000000000063d)) + + CHECK: .debug_ranges contents: CHECK-NEXT: 00000000 000000000000062c 0000000000000637 CHECK-NEXT: 00000000 0000000000000637 000000000000063d diff --git a/test/MC/ARM/dwarf-asm-multiple-sections.s b/test/MC/ARM/dwarf-asm-multiple-sections.s index 9e0dca602b8..0eb8bab8162 100644 --- a/test/MC/ARM/dwarf-asm-multiple-sections.s +++ b/test/MC/ARM/dwarf-asm-multiple-sections.s @@ -25,7 +25,7 @@ b: // DWARF: .debug_info contents: // DWARF: 0x{{[0-9a-f]+}}: DW_TAG_compile_unit [1] // CHECK-NOT-DWARF: DW_TAG_ -// DWARF: DW_AT_ranges [DW_FORM_data4] (0x00000000) +// DWARF: DW_AT_ranges [DW_FORM_data4] (0x00000000 // DWARF: 0x{{[0-9a-f]+}}: DW_TAG_label [2] * // DWARF-NEXT: DW_AT_name [DW_FORM_string] ("a")