Skip to content

Commit

Permalink
Use DWARFDataExtractor::getInitialLength in DWARFDebugAddr
Browse files Browse the repository at this point in the history
Reviewers: ikudrin, jhenderson, probinson

Subscribers: hiraditya, dblaikie, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D75532
  • Loading branch information
labath committed Mar 4, 2020
1 parent f5502c7 commit 3838563
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 30 deletions.
34 changes: 7 additions & 27 deletions llvm/lib/DebugInfo/DWARF/DWARFDebugAddr.cpp
Expand Up @@ -44,34 +44,14 @@ Error DWARFDebugAddrTable::extractV5(const DWARFDataExtractor &Data,
uint64_t *OffsetPtr, uint8_t CUAddrSize,
std::function<void(Error)> 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)) {
Expand Down
Expand Up @@ -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
Expand Up @@ -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.
Expand Down
Expand Up @@ -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
Expand Down

0 comments on commit 3838563

Please sign in to comment.