From 38385630adb072c65882f1a18a4e634dcba9ff46 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Fri, 28 Feb 2020 10:03:00 +0100 Subject: [PATCH] Use DWARFDataExtractor::getInitialLength in DWARFDebugAddr Reviewers: ikudrin, jhenderson, probinson Subscribers: hiraditya, dblaikie, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D75532 --- llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp | 34 +++++----------------- .../X86/debug_addr_reserved_length.s | 2 +- ...ebug_addr_too_small_for_extended_length_field.s | 2 +- .../X86/debug_addr_too_small_for_length_field.s | 2 +- 4 files changed, 10 insertions(+), 30 deletions(-) diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp index 273d316..e0f4a3b 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp @@ -44,34 +44,14 @@ Error DWARFDebugAddrTable::extractV5(const DWARFDataExtractor &Data, uint64_t *OffsetPtr, uint8_t CUAddrSize, std::function WarnCallback) { Offset = *OffsetPtr; - // Check that we can read the unit length field. - if (!Data.isValidOffsetForDataOfSize(Offset, 4)) - return createStringError(errc::invalid_argument, - "section is not large enough to contain an " - "address table length at offset 0x%" PRIx64, - Offset); - Format = dwarf::DwarfFormat::DWARF32; - Length = Data.getU32(OffsetPtr); - if (Length == dwarf::DW_LENGTH_DWARF64) { - // Check that we can read the extended unit length field. - if (!Data.isValidOffsetForDataOfSize(*OffsetPtr, 8)) { - invalidateLength(); - return createStringError( - errc::invalid_argument, - "section is not large enough to contain an extended length field " - "of the address table at offset 0x%" PRIx64, - Offset); - } - Format = dwarf::DwarfFormat::DWARF64; - Length = Data.getU64(OffsetPtr); - } else if (Length >= dwarf::DW_LENGTH_lo_reserved) { - uint64_t DiagnosticLength = Length; + llvm::Error Err = Error::success(); + std::tie(Length, Format) = Data.getInitialLength(OffsetPtr, &Err); + if (Err) { invalidateLength(); - return createStringError( - errc::not_supported, - "address table at offset 0x%" PRIx64 - " has unsupported reserved unit length of value 0x%" PRIx64, - Offset, DiagnosticLength); + return createStringError(errc::invalid_argument, + "parsing address table at offset 0x%" PRIx64 + ": %s", + Offset, toString(std::move(Err)).c_str()); } if (!Data.isValidOffsetForDataOfSize(*OffsetPtr, Length)) { diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_reserved_length.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_reserved_length.s index 5885780..125be83 100644 --- a/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_reserved_length.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_reserved_length.s @@ -2,7 +2,7 @@ # RUN: llvm-dwarfdump --debug-addr - 2>&1 | \ # RUN: FileCheck %s --implicit-check-not=error -# CHECK: error: address table at offset 0x0 has unsupported reserved unit length of value 0xfffffff0 +# CHECK: error: parsing address table at offset 0x0: unsupported reserved unit length of value 0xfffffff0 .section .debug_addr,"",@progbits .long 0xfffffff0 diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_extended_length_field.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_extended_length_field.s index 8c2cc11..8ac3cc5 100644 --- a/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_extended_length_field.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_extended_length_field.s @@ -4,7 +4,7 @@ # CHECK: .debug_addr contents: # CHECK-NOT: {{.}} -# ERR: section is not large enough to contain an extended length field of the address table at offset 0x0 +# ERR: parsing address table at offset 0x0: unexpected end of data at offset 0x4 # ERR-NOT: {{.}} # too small section to contain an extended length field of a DWARF64 address table. diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_length_field.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_length_field.s index dcec7da..1a51541 100644 --- a/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_length_field.s +++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_addr_too_small_for_length_field.s @@ -4,7 +4,7 @@ # CHECK: .debug_addr contents: # CHECK-NOT: {{.}} -# ERR: section is not large enough to contain an address table length at offset 0x0 +# ERR: parsing address table at offset 0x0: unexpected end of data at offset 0x0 # ERR-NOT: {{.}} # too small section to contain length field -- 2.7.4