[llvm] 164e2c8 - [DWARF] Use getInitialLength in range list parsing

Pavel Labath via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 2 02:20:17 PST 2020


Author: Pavel Labath
Date: 2020-03-02T11:18:12+01:00
New Revision: 164e2c85123044ac4ec3f026282c871b101f95a4

URL: https://github.com/llvm/llvm-project/commit/164e2c85123044ac4ec3f026282c871b101f95a4
DIFF: https://github.com/llvm/llvm-project/commit/164e2c85123044ac4ec3f026282c871b101f95a4.diff

LOG: [DWARF] Use getInitialLength in range list parsing

Summary:
This could be considered obvious, but I am putting it up to illustrate
the usefulness/impact of the getInitialLength change.

Reviewers: dblaikie, jhenderson, ikudrin

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D75117

Added: 
    

Modified: 
    llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp
    llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s
    llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_reserved_length.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp
index 269ea9f79a6e..fd928385ad7b 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFListTable.cpp
@@ -18,25 +18,15 @@ using namespace llvm;
 Error DWARFListTableHeader::extract(DWARFDataExtractor Data,
                                     uint64_t *OffsetPtr) {
   HeaderOffset = *OffsetPtr;
-  // Read and verify the length field.
-  if (!Data.isValidOffsetForDataOfSize(*OffsetPtr, sizeof(uint32_t)))
-    return createStringError(errc::invalid_argument,
-                       "section is not large enough to contain a "
-                       "%s table length at offset 0x%" PRIx64,
-                       SectionName.data(), *OffsetPtr);
-  Format = dwarf::DwarfFormat::DWARF32;
-  uint8_t OffsetByteSize = 4;
-  HeaderData.Length = Data.getRelocatedValue(4, OffsetPtr);
-  if (HeaderData.Length == dwarf::DW_LENGTH_DWARF64) {
-    Format = dwarf::DwarfFormat::DWARF64;
-    OffsetByteSize = 8;
-    HeaderData.Length = Data.getU64(OffsetPtr);
-  } else if (HeaderData.Length >= dwarf::DW_LENGTH_lo_reserved) {
-    return createStringError(errc::invalid_argument,
-        "%s table at offset 0x%" PRIx64
-        " has unsupported reserved unit length of value 0x%8.8" PRIx64,
-        SectionName.data(), HeaderOffset, HeaderData.Length);
-  }
+  Error Err = Error::success();
+
+  std::tie(HeaderData.Length, Format) = Data.getInitialLength(OffsetPtr, &Err);
+  if (Err)
+    return createStringError(
+        errc::invalid_argument, "parsing %s table at offset 0x%" PRIx64 ": %s",
+        SectionName.data(), HeaderOffset, toString(std::move(Err)).c_str());
+
+  uint8_t OffsetByteSize = Format == dwarf::DWARF64 ? 8 : 4;
   uint64_t FullLength =
       HeaderData.Length + dwarf::getUnitLengthFieldByteSize(Format);
   assert(FullLength == length());

diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s
index a7ecbf71bb63..b11a2cc8bfde 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_invalid.s
@@ -2,7 +2,7 @@
 # RUN: llvm-dwarfdump --debug-rnglists - 2>&1 | FileCheck %s --check-prefix=SHORT
 # SHORT-NOT: error:
 # SHORT-NOT: range list header
-# SHORT: error: section is not large enough to contain a .debug_rnglists table length at offset 0
+# SHORT: error: parsing .debug_rnglists table at offset 0x0: unexpected end of data at offset 0x0
 # SHORT-NOT: range list header
 # SHORT-NOT: error:
 

diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_reserved_length.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_reserved_length.s
index 75c903db75d9..7db4aefde761 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_reserved_length.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/debug_rnglists_reserved_length.s
@@ -2,7 +2,7 @@
 # RUN:   llvm-dwarfdump --debug-rnglists - 2>&1 | \
 # RUN:   FileCheck %s --implicit-check-not=error
 
-# CHECK: error: .debug_rnglists table at offset 0x0 has unsupported reserved unit length of value 0xfffffff0
+# CHECK: error: parsing .debug_rnglists table at offset 0x0: unsupported reserved unit length of value 0xfffffff0
 
 .section .debug_rnglists,"", at progbits
 .long 0xfffffff0


        


More information about the llvm-commits mailing list