From: Pavel Labath Date: Wed, 4 Dec 2019 13:03:18 +0000 (+0100) Subject: [llvm/DWARF] Return section offset from DWARFUnit::get{Loc,Rng}listOffset X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4ee76a922aad743818d56f58630cf8da25602251;p=platform%2Fupstream%2Fllvm.git [llvm/DWARF] Return section offset from DWARFUnit::get{Loc,Rng}listOffset Summary: Currently these function return the raw content of the appropriate table header, which means they are relative to the DW_AT_{loc,rng}list_base, and one has to relocate them in order to do anything. This changes the functions to perform the relocation themselves, which seems more clearer, particularly as they are sitting right next to the find{Rng,Loc}listFromOffset functions, but one *cannot* simply take the result of these functions and take pass them there. The only effect of this patch is to change what value is dumped for the DW_AT_ranges attribute, which I think is for the better, as previously the values appeared to point into thin air. (The main reason I am looking at this is because I was trying to implement equivalent functionality in lldb's DWARFUnit, and was stumped by this behavior. Reviewers: dblaikie, JDevlieghere, aprantl Subscribers: hiraditya, llvm-commits, SouraVX Tags: #llvm Differential Revision: https://reviews.llvm.org/D71006 --- diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h index 98d7a7e..36fdd51 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -427,14 +427,18 @@ public: /// an entry in the rangelist table's offset array and is supplied by /// DW_FORM_rnglistx. Optional getRnglistOffset(uint32_t Index) { - if (RngListTable) - return RngListTable->getOffsetEntry(Index); + if (!RngListTable) + return None; + if (Optional Off = RngListTable->getOffsetEntry(Index)) + return *Off + RangeSectionBase; return None; } Optional getLoclistOffset(uint32_t Index) { - if (LoclistTableHeader) - return LoclistTableHeader->getOffsetEntry(Index); + if (!LoclistTableHeader) + return None; + if (Optional Off = LoclistTableHeader->getOffsetEntry(Index)) + return *Off + getLocSectionBase(); return None; } Expected collectAddressRanges(); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index 404bc13..4b86359 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -91,7 +91,7 @@ static void dumpLocation(raw_ostream &OS, DWARFFormValue &FormValue, FormValue.dump(OS, DumpOpts); if (auto LoclistOffset = U->getLoclistOffset(Offset)) - Offset = *LoclistOffset + U->getLocSectionBase(); + Offset = *LoclistOffset; else return; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index b662e88..4ccda62 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -629,7 +629,7 @@ DWARFUnit::findRnglistFromOffset(uint64_t Offset) { Expected DWARFUnit::findRnglistFromIndex(uint32_t Index) { if (auto Offset = getRnglistOffset(Index)) - return findRnglistFromOffset(*Offset + RangeSectionBase); + return findRnglistFromOffset(*Offset); if (RngListTable) return createStringError(errc::invalid_argument, diff --git a/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s b/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s index f839581..19bbd77 100644 --- a/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s @@ -196,14 +196,14 @@ Range1_end: # CHECK-NOT: Compile Unit: # CHECK: DW_TAG_compile_unit # CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x00000014) -# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000020 +# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000034 # CHECK-NEXT: [0x0000002a, 0x00000034) ".text") # CHECK: .debug_info.dwo contents: # CHECK: Compile Unit: # CHECK-NOT: contents: # CHECK: DW_TAG_compile_unit -# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000011 +# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000025 # CHECK-NEXT: [0x0000002a, 0x00000034)) #ERR: error: parsing a range list table: did not detect a valid list table with base = 0x8 diff --git a/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s b/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s index 7886374..0d6898d 100644 --- a/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-rnglists.s @@ -192,14 +192,14 @@ Range1_end: # CHECK-NOT: Compile Unit: # CHECK: DW_TAG_compile_unit # CHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000c) -# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000018 +# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000024 # CHECK-NEXT: [0x0000002a, 0x00000034) ".text") # CHECK: .debug_info.dwo contents: # CHECK: Compile Unit: # CHECK-NOT: contents: # CHECK: DW_TAG_compile_unit -# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000009 +# CHECK-NEXT: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x1) rangelist = 0x00000015 # CHECK-NEXT: [0x0000002a, 0x00000034)) #ERR: error: parsing a range list table: did not detect a valid list table with base = 0x8 diff --git a/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll b/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll index 74e9464..1761c4a 100644 --- a/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll +++ b/llvm/test/DebugInfo/X86/split-dwarf-v5-ranges.ll @@ -3,7 +3,7 @@ ; CHECK: .debug_info contents: ; CHECK: .debug_info.dwo contents: -; CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000004 +; CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000010 ; CHECK: [0x0000000000000001, 0x000000000000000c) ".text" ; CHECK: [0x000000000000000e, 0x0000000000000013) ".text") diff --git a/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s b/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s index ce1ae23..bf66067 100644 --- a/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/no_debug_addr.s @@ -4,7 +4,7 @@ ## Ensure bogus empty section names are not printed when dumping ## rnglists that reference debug_addr when it is not present (such as in .dwo files) -# CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000004 +# CHECK: DW_AT_ranges [DW_FORM_rnglistx] (indexed (0x0) rangelist = 0x00000010 # CHECK-NEXT: [0x0000000000000000, 0x0000000000000001) # CHECK-NEXT: [0x0000000000000000, 0x0000000000000002))