]> granicus.if.org Git - llvm/commitdiff
[DWARF] Fix DWARFUnit::getDebugInfoSize() for 64-bit DWARF.
authorIgor Kudrin <ikudrin@accesssoftek.com>
Tue, 20 Aug 2019 09:50:44 +0000 (09:50 +0000)
committerIgor Kudrin <ikudrin@accesssoftek.com>
Tue, 20 Aug 2019 09:50:44 +0000 (09:50 +0000)
The calculation there was correct only for DWARF32.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369356 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/BinaryFormat/Dwarf.h
include/llvm/DebugInfo/DWARF/DWARFUnit.h
test/tools/llvm-dwarfdump/X86/debug_info_min_dwarf64.s [new file with mode: 0644]

index 45428f4cd6d399104d1c5c934cf8fc4de74e8b89..72f36c46a4a8f784f19e118cde3c906a8bf26305 100644 (file)
@@ -513,6 +513,17 @@ struct FormParams {
   explicit operator bool() const { return Version && AddrSize; }
 };
 
+/// Get the byte size of the unit length field depending on the DWARF format.
+inline uint8_t getUnitLengthFieldByteSize(DwarfFormat Format) {
+  switch (Format) {
+  case DwarfFormat::DWARF32:
+    return 4;
+  case DwarfFormat::DWARF64:
+    return 12;
+  }
+  llvm_unreachable("Invalid Format value");
+}
+
 /// Get the fixed byte size for a given form.
 ///
 /// If the form has a fixed byte size, then an Optional with a value will be
index bd7e3e967c3f8001ff7aa7e557bc558b6470e991..4762fd02e067bfbbbde74008d24b945366759f7f 100644 (file)
@@ -97,10 +97,11 @@ public:
     return UnitType == dwarf::DW_UT_type || UnitType == dwarf::DW_UT_split_type;
   }
   uint8_t getSize() const { return Size; }
+  uint8_t getUnitLengthFieldByteSize() const {
+    return dwarf::getUnitLengthFieldByteSize(FormParams.Format);
+  }
   uint64_t getNextUnitOffset() const {
-    return Offset + Length +
-           (FormParams.Format == llvm::dwarf::DwarfFormat::DWARF64 ? 4 : 0) +
-           FormParams.getDwarfOffsetByteSize();
+    return Offset + Length + getUnitLengthFieldByteSize();
   }
 };
 
@@ -501,7 +502,8 @@ public:
 private:
   /// Size in bytes of the .debug_info data associated with this compile unit.
   size_t getDebugInfoSize() const {
-    return Header.getLength() + 4 - getHeaderSize();
+    return Header.getLength() + Header.getUnitLengthFieldByteSize() -
+           getHeaderSize();
   }
 
   /// extractDIEsIfNeeded - Parses a compile unit and indexes its DIEs if it
diff --git a/test/tools/llvm-dwarfdump/X86/debug_info_min_dwarf64.s b/test/tools/llvm-dwarfdump/X86/debug_info_min_dwarf64.s
new file mode 100644 (file)
index 0000000..9a9c9b3
--- /dev/null
@@ -0,0 +1,37 @@
+# RUN: llvm-mc %s -filetype obj -triple x86_64-unknown-elf -o - | \
+# RUN:   llvm-dwarfdump -debug-info - | \
+# RUN:   FileCheck %s
+
+        .section .debug_abbrev,"",@progbits
+        .byte 0x01  # Abbrev code
+        .byte 0x11  # DW_TAG_compile_unit
+        .byte 0x00  # DW_CHILDREN_no
+        .byte 0x13  # DW_AT_language
+        .byte 0x05  # DW_FORM_data2
+        .byte 0x00  # EOM(1)
+        .byte 0x00  # EOM(2)
+        .byte 0x00  # EOM(3)
+        
+        .section .debug_info,"",@progbits
+# CHECK: .debug_info contents:
+# CHECK-NEXT: 0x00000000: Compile Unit:
+DI_4_64_start:
+        .long 0xffffffff       # DWARF64 mark
+        .quad DI_4_64_end - DI_4_64_version # Length of Unit
+# CHECK-SAME: length = 0x0000000f
+DI_4_64_version:
+        .short 4               # DWARF version number
+# CHECK-SAME: version = 0x0004
+        .quad .debug_abbrev    # Offset Into Abbrev. Section
+# CHECK-SAME: abbr_offset = 0x0000
+        .byte 8                # Address Size (in bytes)
+# CHECK-SAME: addr_size = 0x08
+# CHECK-SAME: (next unit at 0x0000001b)
+
+        .byte 1                # Abbreviation code
+# CHECK: 0x00000017: DW_TAG_compile_unit
+        .short 4               # DW_LANG_C_plus_plus
+# CHECK-NEXT: DW_AT_language (DW_LANG_C_plus_plus)
+        .byte 0                # NULL
+DI_4_64_end:
+