[PATCH] D71704: [DWARF] Check that all fields of a Unit Header are read.
Igor Kudrin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 19 06:45:28 PST 2019
ikudrin created this revision.
ikudrin added reviewers: aprantl, probinson, dblaikie.
ikudrin added projects: LLVM, debug-info.
Herald added a subscriber: hiraditya.
Tests `dwarfdump-rnglists-dwarf64.s` and `dwarfdump-rnglists.s` were malformed because they had missing required DWO ID fields in split compilation unit headers. The patch fixes the tests and checks the reading of a unit header more thoroughly.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D71704
Files:
llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s
llvm/test/DebugInfo/X86/dwarfdump-rnglists.s
Index: llvm/test/DebugInfo/X86/dwarfdump-rnglists.s
===================================================================
--- llvm/test/DebugInfo/X86/dwarfdump-rnglists.s
+++ llvm/test/DebugInfo/X86/dwarfdump-rnglists.s
@@ -106,6 +106,7 @@
.byte 5 # DWARF Unit Type
.byte 4 # Address Size (in bytes)
.long 0 # Offset Into Abbrev Section
+ .quad 0xdeadbeefbaadf00d # DWO id
# The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges.
.byte 1 # Abbreviation code
.uleb128 1 # DW_AT_ranges
Index: llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s
===================================================================
--- llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s
+++ llvm/test/DebugInfo/X86/dwarfdump-rnglists-dwarf64.s
@@ -109,6 +109,7 @@
.byte 5 # DWARF Unit Type
.byte 4 # Address Size (in bytes)
.quad 0 # Offset Into Abbrev Section
+ .quad 0xdeadbeefbaadf00d # DWO id
# The compile-unit DIE, which has DW_AT_rnglists_base and DW_AT_ranges.
.byte 1 # Abbreviation code
.uleb128 1 # DW_AT_ranges
Index: llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
===================================================================
--- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
+++ llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
@@ -259,23 +259,26 @@
const DWARFUnitIndex *Index,
const DWARFUnitIndex::Entry *Entry) {
Offset = *offset_ptr;
+ Error Err = Error::success();
IndexEntry = Entry;
if (!IndexEntry && Index)
IndexEntry = Index->getFromOffset(*offset_ptr);
- Length = debug_info.getRelocatedValue(4, offset_ptr);
+ Length = debug_info.getRelocatedValue(4, offset_ptr, nullptr, &Err);
FormParams.Format = DWARF32;
if (Length == dwarf::DW_LENGTH_DWARF64) {
- Length = debug_info.getU64(offset_ptr);
+ Length = debug_info.getU64(offset_ptr, &Err);
FormParams.Format = DWARF64;
}
- FormParams.Version = debug_info.getU16(offset_ptr);
+ FormParams.Version = debug_info.getU16(offset_ptr, &Err);
if (FormParams.Version >= 5) {
- UnitType = debug_info.getU8(offset_ptr);
- FormParams.AddrSize = debug_info.getU8(offset_ptr);
- AbbrOffset = debug_info.getRelocatedValue(FormParams.getDwarfOffsetByteSize(), offset_ptr);
+ UnitType = debug_info.getU8(offset_ptr, &Err);
+ FormParams.AddrSize = debug_info.getU8(offset_ptr, &Err);
+ AbbrOffset = debug_info.getRelocatedValue(
+ FormParams.getDwarfOffsetByteSize(), offset_ptr, nullptr, &Err);
} else {
- AbbrOffset = debug_info.getRelocatedValue(FormParams.getDwarfOffsetByteSize(), offset_ptr);
- FormParams.AddrSize = debug_info.getU8(offset_ptr);
+ AbbrOffset = debug_info.getRelocatedValue(
+ FormParams.getDwarfOffsetByteSize(), offset_ptr, nullptr, &Err);
+ FormParams.AddrSize = debug_info.getU8(offset_ptr, &Err);
// Fake a unit type based on the section type. This isn't perfect,
// but distinguishing compile and type units is generally enough.
if (SectionKind == DW_SECT_TYPES)
@@ -295,11 +298,14 @@
AbbrOffset = AbbrEntry->Offset;
}
if (isTypeUnit()) {
- TypeHash = debug_info.getU64(offset_ptr);
- TypeOffset =
- debug_info.getUnsigned(offset_ptr, FormParams.getDwarfOffsetByteSize());
+ TypeHash = debug_info.getU64(offset_ptr, &Err);
+ TypeOffset = debug_info.getUnsigned(
+ offset_ptr, FormParams.getDwarfOffsetByteSize(), &Err);
} else if (UnitType == DW_UT_split_compile || UnitType == DW_UT_skeleton)
- DWOId = debug_info.getU64(offset_ptr);
+ DWOId = debug_info.getU64(offset_ptr, &Err);
+
+ if (errorToBool(std::move(Err)))
+ return false;
// Header fields all parsed, capture the size of this unit header.
assert(*offset_ptr - Offset <= 255 && "unexpected header size");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71704.234712.patch
Type: text/x-patch
Size: 4008 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191219/7d9a348a/attachment.bin>
More information about the llvm-commits
mailing list