llvm-dwarfdump: Don't try to parse a debug_loclist contribution if this CU has no...
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 14 Apr 2020 22:17:24 +0000 (15:17 -0700)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 14 Apr 2020 22:54:13 +0000 (15:54 -0700)
llvm-dwarfdump was trying to parse debug_loclists even in the absence of
a loclists_base if there was a loclists section at all.

llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_nouse.s [new file with mode: 0644]

index 31c5cc8..30eb017 100644 (file)
@@ -527,14 +527,20 @@ Error DWARFUnit::tryExtractDIEsIfNeeded(bool CUDieOnly) {
 
     // In a split dwarf unit, there is no DW_AT_loclists_base attribute.
     // Setting LocSectionBase to point past the table header.
-    if (IsDWO)
-      setLocSection(&Context.getDWARFObj().getLoclistsDWOSection(),
+    if (IsDWO) {
+      auto &DWOSection = Context.getDWARFObj().getLoclistsDWOSection();
+      if (DWOSection.Data.empty())
+        return Error::success();
+      setLocSection(&DWOSection,
                     DWARFListTableHeader::getHeaderSize(Header.getFormat()));
-    else
+    } else if (auto X = UnitDie.find(DW_AT_loclists_base)) {
       setLocSection(&Context.getDWARFObj().getLoclistsSection(),
-                    toSectionOffset(UnitDie.find(DW_AT_loclists_base), 0));
+                    toSectionOffset(X, 0));
+    } else {
+      return Error::success();
+    }
 
-    if (LocSection->Data.size()) {
+    if (LocSection) {
       if (IsDWO)
         LoclistTableHeader.emplace(".debug_loclists.dwo", "locations");
       else
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_nouse.s b/llvm/test/tools/llvm-dwarfdump/X86/debug_loclists_nouse.s
new file mode 100644 (file)
index 0000000..0b9a087
--- /dev/null
@@ -0,0 +1,25 @@
+# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o %t.o
+# RUN: llvm-dwarfdump %t.o | FileCheck %s
+
+# CHECK: 0x00000000: Compile Unit: length = 0x00000009 version = 0x0005 unit_type = DW_UT_compile abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x0000000d)
+# CHECK: 0x0000000c: DW_TAG_compile_unit
+
+       .section        .debug_abbrev,"",@progbits
+       .byte   1                       # Abbreviation Code
+       .byte   17                      # DW_TAG_compile_unit
+       .byte   0                       # DW_CHILDREN_no
+       .byte   0                       # EOM(1)
+       .byte   0                       # EOM(2)
+       .byte   0                       # EOM(3)
+       .section        .debug_info,"",@progbits
+.Lcu_begin0:
+       .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+       .short  5                       # DWARF version number
+       .byte   1                       # DWARF Unit Type
+       .byte   8                       # Address Size (in bytes)
+       .long   .debug_abbrev           # Offset Into Abbrev. Section
+       .byte   1                       # Abbrev [1] 0xc:0x22 DW_TAG_compile_unit
+.Ldebug_info_end0:
+       .section        .debug_loclists,"",@progbits
+       .byte   0