jankratochvil created this revision. jankratochvil added a reviewer: dblaikie. jankratochvil added a project: LLDB. Herald added a subscriber: JDevlieghere. jankratochvil requested review of this revision. Herald added a project: LLVM. Herald added a subscriber: llvm-commits.
In D98289#inline-939112 <https://reviews.llvm.org/D98289#inline-939112> @dblaikie said: > Perhaps this could be more informative about what makes the range list index > of 0 invalid? "index 0 out of range of range list table (with range list base > 0xXXX) with offset entry count of XX (valid indexes 0-(XX-1))" Maybe that's > too verbose/not worth worrying about since this'll only be relevant to DWARF > producers trying to debug their DWARFv5, maybe no one will ever see this > message in practice. Just a thought. If this is OK I will need to submit the LLVM part separately. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D102851 Files: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s llvm/include/llvm/DebugInfo/DWARF/DWARFListTable.h
Index: llvm/include/llvm/DebugInfo/DWARF/DWARFListTable.h =================================================================== --- llvm/include/llvm/DebugInfo/DWARF/DWARFListTable.h +++ llvm/include/llvm/DebugInfo/DWARF/DWARFListTable.h @@ -94,6 +94,7 @@ uint8_t getAddrSize() const { return HeaderData.AddrSize; } uint64_t getLength() const { return HeaderData.Length; } uint16_t getVersion() const { return HeaderData.Version; } + uint32_t getOffsetEntryCount() const { return HeaderData.OffsetEntryCount; } StringRef getSectionName() const { return SectionName; } StringRef getListTypeString() const { return ListTypeString; } dwarf::DwarfFormat getFormat() const { return Format; } @@ -175,6 +176,7 @@ uint64_t getHeaderOffset() const { return Header.getHeaderOffset(); } uint8_t getAddrSize() const { return Header.getAddrSize(); } + uint32_t getOffsetEntryCount() const { return Header.getOffsetEntryCount(); } dwarf::DwarfFormat getFormat() const { return Header.getFormat(); } void dump(DWARFDataExtractor Data, raw_ostream &OS, Index: lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s =================================================================== --- lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s +++ lldb/test/Shell/SymbolFile/DWARF/DW_AT_range-DW_FORM_sec_offset.s @@ -21,7 +21,7 @@ # RUN: -o exit 2>&1 | FileCheck --check-prefix=RNGLISTX %s # RNGLISTX-LABEL: image lookup -v -s lookup_rnglists -# RNGLISTX: error: {{.*}} 00000000: DW_FORM_rnglistx cannot be used without DW_AT_rnglists_base +# RNGLISTX: error: {{.*}} {0x0000003f}: DIE has DW_AT_ranges(0x0) attribute, but range extraction failed (00000000: DW_FORM_rnglistx cannot be used without DW_AT_rnglists_base), please file a bug and attach the file at the start of this error message # RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj \ # RUN: --defsym RNGLISTX=0 --defsym RNGLISTBASE=0 %s > %t-rnglistbase @@ -29,7 +29,7 @@ # RUN: -o exit 2>&1 | FileCheck --check-prefix=RNGLISTBASE %s # RNGLISTBASE-LABEL: image lookup -v -s lookup_rnglists -# RNGLISTBASE: error: {{.*}}-rnglistbase {0x00000043}: DIE has DW_AT_ranges(0x0) attribute, but range extraction failed (invalid range list table index 0), please file a bug and attach the file at the start of this error message +# RNGLISTBASE: error: {{.*}}-rnglistbase {0x00000043}: DIE has DW_AT_ranges(0x0) attribute, but range extraction failed (invalid range list table index 0; OffsetEntryCount is 0, DW_AT_rnglists_base is 12), please file a bug and attach the file at the start of this error message .text rnglists: Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h @@ -235,7 +235,7 @@ /// Return a rangelist's offset based on an index. The index designates /// an entry in the rangelist table's offset array and is supplied by /// DW_FORM_rnglistx. - llvm::Optional<uint64_t> GetRnglistOffset(uint32_t Index); + llvm::Expected<uint64_t> GetRnglistOffset(uint32_t Index); llvm::Optional<uint64_t> GetLoclistOffset(uint32_t Index) { if (!m_loclist_table_header) Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -507,19 +507,23 @@ } // This function is called only for DW_FORM_rnglistx. -llvm::Optional<uint64_t> DWARFUnit::GetRnglistOffset(uint32_t Index) { +llvm::Expected<uint64_t> DWARFUnit::GetRnglistOffset(uint32_t Index) { if (!GetRnglist()) - return llvm::None; - if (!m_ranges_base) { - GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError( + return llvm::createStringError(errc::invalid_argument, + "missing or invalid range list table"); + if (!m_ranges_base) + return llvm::createStringError( + errc::invalid_argument, "%8.8x: DW_FORM_rnglistx cannot be used without DW_AT_rnglists_base", GetOffset()); - return llvm::None; - } if (llvm::Optional<uint64_t> off = GetRnglist()->getOffsetEntry( m_dwarf.GetDWARFContext().getOrLoadRngListsData().GetAsLLVM(), Index)) return *off + m_ranges_base; - return llvm::None; + return llvm::createStringError( + errc::invalid_argument, + "invalid range list table index %u; OffsetEntryCount is %u, " + "DW_AT_rnglists_base is %" PRIu64, + Index, GetRnglist()->getOffsetEntryCount(), m_ranges_base); } void DWARFUnit::SetStrOffsetsBase(dw_offset_t str_offsets_base) { @@ -996,12 +1000,8 @@ llvm::Expected<DWARFRangeList> DWARFUnit::FindRnglistFromIndex(uint32_t index) { - if (llvm::Optional<uint64_t> offset = GetRnglistOffset(index)) - return FindRnglistFromOffset(*offset); - if (GetRnglist()) - return llvm::createStringError(errc::invalid_argument, - "invalid range list table index %d", index); - - return llvm::createStringError(errc::invalid_argument, - "missing or invalid range list table"); + llvm::Expected<uint64_t> maybe_offset = GetRnglistOffset(index); + if (!maybe_offset) + return maybe_offset.takeError(); + return FindRnglistFromOffset(*maybe_offset); }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits