[PATCH] D79061: [ELF] --gdb-index: support .debug_loclists

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 28 19:59:06 PDT 2020


MaskRay created this revision.
MaskRay added reviewers: dblaikie, grimar.
Herald added subscribers: llvm-commits, arphaman, arichardson, aprantl, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.

--gdb-index currently crashes when reading a translation unit with
DWARF v5 .debug_loclists . Call stack:

  lld/ELF/DWARF.cpp LLDDwarfObj<ELFT>::find (sec.sec is nullptr)
  DWARFDataExtractor.cpp DWARFDataExtractor::getRelocatedValue
  ...
  SyntheticSections.cpp readAddressAreas

This patch adds support for .debug_loclists


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79061

Files:
  lld/ELF/DWARF.cpp
  lld/ELF/DWARF.h
  lld/test/ELF/gdb-index-loclists.s


Index: lld/test/ELF/gdb-index-loclists.s
===================================================================
--- /dev/null
+++ lld/test/ELF/gdb-index-loclists.s
@@ -0,0 +1,37 @@
+# REQUIRES: x86
+## Test that we support DWARF v5 .debug_loclists
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+# RUN: ld.lld --gdb-index %t.o -o /dev/null
+
+.section .debug_abbrev,"", at progbits
+  .byte 1            # Abbreviation Code
+  .byte 17           # DW_TAG_compile_unit
+  .byte 0            # DW_CHILDREN_no
+  .ascii "\214\001"  # DW_AT_loclists_base
+  .byte 23           # DW_FORM_sec_offset
+  .byte 0            # EOM(1)
+  .byte 0            # EOM(2)
+  .byte 0
+
+.section .debug_info,"", at progbits
+.Lcu_begin0:
+  .long .Lcu_end0-.Lcu_begin0-4  # Length of Unit
+  .short 5                       # DWARF version number
+  .byte  1                       # DWARF Unit Type
+  .byte  8                       # Address Size
+  .long  0                       # Offset Into Abbrev. Section
+  .byte  1                       # Abbrev [1] DW_TAG_compile_unit
+  .long  .Lloclists_table_base0  # DW_AT_loclists_base
+.Lcu_end0:
+
+.section .debug_loclists,"", at progbits
+  .long .Ldebug_loclist_table_end0-.Ldebug_loclist_table_start0 # Length
+.Ldebug_loclist_table_start0:
+  .short 5                # Version
+  .byte  8                # Address size
+  .byte  0                # Segment selector size
+  .long  0                # Offset entry count
+.Lloclists_table_base0:
+  .byte  0                # DW_LLE_end_of_list
+.Ldebug_loclist_table_end0:
Index: lld/ELF/DWARF.h
===================================================================
--- lld/ELF/DWARF.h
+++ lld/ELF/DWARF.h
@@ -32,6 +32,10 @@
     f(infoSection);
   }
 
+  const llvm::DWARFSection &getLoclistsSection() const override {
+    return loclistsSection;
+  }
+
   const llvm::DWARFSection &getRangesSection() const override {
     return rangesSection;
   }
@@ -81,6 +85,7 @@
   LLDDWARFSection gnuPubnamesSection;
   LLDDWARFSection gnuPubtypesSection;
   LLDDWARFSection infoSection;
+  LLDDWARFSection loclistsSection;
   LLDDWARFSection rangesSection;
   LLDDWARFSection rnglistsSection;
   LLDDWARFSection strOffsetsSection;
Index: lld/ELF/DWARF.cpp
===================================================================
--- lld/ELF/DWARF.cpp
+++ lld/ELF/DWARF.cpp
@@ -36,6 +36,7 @@
                 .Case(".debug_gnu_pubnames", &gnuPubnamesSection)
                 .Case(".debug_gnu_pubtypes", &gnuPubtypesSection)
                 .Case(".debug_info", &infoSection)
+                .Case(".debug_loclists", &loclistsSection)
                 .Case(".debug_ranges", &rangesSection)
                 .Case(".debug_rnglists", &rnglistsSection)
                 .Case(".debug_str_offsets", &strOffsetsSection)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79061.260822.patch
Type: text/x-patch
Size: 2789 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200429/5d49e357/attachment.bin>


More information about the llvm-commits mailing list