[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