[lld] r317305 - [ELF] - Teach LLD to use information from .debug_str for error reporting.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 3 01:04:27 PDT 2017


Author: grimar
Date: Fri Nov  3 01:04:27 2017
New Revision: 317305

URL: http://llvm.org/viewvc/llvm-project?rev=317305&view=rev
Log:
[ELF] - Teach LLD to use information from .debug_str for error reporting.

Recently we teached LLD to report line numbers for duplicate variables
definitions, though currently LLD is unable to do that for case when
strings are not built in .debug_info, but stored in .debug_str instead.
That is because out LLDDwarfObj does not handle .debug_str yet. 
Patch fixes that.

Differential revision: https://reviews.llvm.org/D39542

Added:
    lld/trunk/test/ELF/conflict-debug-variable2.s
Modified:
    lld/trunk/ELF/GdbIndex.cpp
    lld/trunk/ELF/GdbIndex.h

Modified: lld/trunk/ELF/GdbIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/GdbIndex.cpp?rev=317305&r1=317304&r2=317305&view=diff
==============================================================================
--- lld/trunk/ELF/GdbIndex.cpp (original)
+++ lld/trunk/ELF/GdbIndex.cpp Fri Nov  3 01:04:27 2017
@@ -44,6 +44,8 @@ template <class ELFT> LLDDwarfObj<ELFT>:
       GnuPubNamesSection = toStringRef(Sec->Data);
     else if (Sec->Name == ".debug_gnu_pubtypes")
       GnuPubTypesSection = toStringRef(Sec->Data);
+    else if (Sec->Name == ".debug_str")
+      StrSection = toStringRef(Sec->Data);
   }
 }
 

Modified: lld/trunk/ELF/GdbIndex.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/GdbIndex.h?rev=317305&r1=317304&r2=317305&view=diff
==============================================================================
--- lld/trunk/ELF/GdbIndex.h (original)
+++ lld/trunk/ELF/GdbIndex.h Fri Nov  3 01:04:27 2017
@@ -30,6 +30,7 @@ template <class ELFT> class LLDDwarfObj
   StringRef AbbrevSection;
   StringRef GnuPubNamesSection;
   StringRef GnuPubTypesSection;
+  StringRef StrSection;
 
   template <class RelTy>
   llvm::Optional<llvm::RelocAddrEntry> findAux(const InputSectionBase &Sec,
@@ -49,7 +50,7 @@ public:
   }
   StringRef getCUIndexSection() const override { return ""; }
   StringRef getAbbrevSection() const override { return AbbrevSection; }
-  StringRef getStringSection() const override { return ""; }
+  StringRef getStringSection() const override { return StrSection; }
   StringRef getGnuPubNamesSection() const override {
     return GnuPubNamesSection;
   }

Added: lld/trunk/test/ELF/conflict-debug-variable2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/conflict-debug-variable2.s?rev=317305&view=auto
==============================================================================
--- lld/trunk/test/ELF/conflict-debug-variable2.s (added)
+++ lld/trunk/test/ELF/conflict-debug-variable2.s Fri Nov  3 01:04:27 2017
@@ -0,0 +1,160 @@
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+
+# RUN: llvm-dwarfdump -v %t.o | FileCheck -check-prefix=INPUT %s
+# INPUT:     .debug_info contents:
+# INPUT:       DW_TAG_variable
+# INPUT-NEXT:    DW_AT_name [DW_FORM_strp]       ( .debug_str[0x00000027] = "foo")
+# INPUT-NEXT:    DW_AT_type [DW_FORM_ref4]       (cu + 0x0033 => {0x00000033} "int")
+# INPUT-NEXT:    DW_AT_external [DW_FORM_flag_present]   (true)
+# INPUT-NEXT:    DW_AT_decl_file [DW_FORM_data1] ("/home/path/test.c")
+# INPUT-NEXT:    DW_AT_decl_line [DW_FORM_data1] (1)
+# INPUT-NEXT:    DW_AT_location [DW_FORM_exprloc]        (DW_OP_addr 0x0)
+# INPUT:       DW_TAG_variable
+# INPUT-NEXT:    DW_AT_name [DW_FORM_strp]       ( .debug_str[0x0000002f] = "bar")
+# INPUT-NEXT:    DW_AT_type [DW_FORM_ref4]       (cu + 0x0033 => {0x00000033} "int")
+# INPUT-NEXT:    DW_AT_external [DW_FORM_flag_present]   (true)
+# INPUT-NEXT:    DW_AT_decl_file [DW_FORM_data1] ("/home/path/test.c")
+# INPUT-NEXT:    DW_AT_decl_line [DW_FORM_data1] (2)
+# INPUT-NEXT:    DW_AT_location [DW_FORM_exprloc]        (DW_OP_addr 0x0)
+
+## Check we use information from .debug_info in messages.
+# RUN: not ld.lld %t.o %t.o -o %t 2>&1 | FileCheck %s
+# CHECK:      duplicate symbol: bar
+# CHECK-NEXT: >>> defined at test.c:2
+# CHECK-NEXT: >>>            {{.*}}:(bar)
+# CHECK-NEXT: >>> defined at test.c:2
+# CHECK-NEXT: >>>            {{.*}}:(.data+0x0)
+# CHECK:      duplicate symbol: foo
+# CHECK-NEXT: >>> defined at test.c:1
+# CHECK-NEXT: >>>            {{.*}}:(foo)
+# CHECK-NEXT: >>> defined at test.c:1
+# CHECK-NEXT: >>>            {{.*}}:(.bss+0x0)
+
+# Used reduced output from following code and clang
+# version 6.0.0 (trunk 316661) to produce this input file:
+# Source (test.c):
+#  int foo = 0;
+#  int bar = 1;
+# Invocation: clang -g -S test.c
+
+.text
+.file  "test.c"
+.file  1 "test.c"
+
+.type  foo, at object
+.bss
+.globl  foo
+.p2align  2
+foo:
+ .long  0
+ .size  foo, 4
+
+.type  bar, at object
+.data
+.globl  bar
+.p2align  2
+bar:
+ .long  1
+ .size  bar, 4
+
+.section  .debug_str,"MS", at progbits,1
+.Linfo_string0:
+  .asciz  "clang version 6.0.0"
+.Linfo_string1:
+  .asciz  "test.c"
+.Linfo_string2:
+  .asciz  "/home/path/"
+.Linfo_string3:
+  .asciz  "foo"
+.Linfo_string4:
+  .asciz  "int"
+.Linfo_string5:
+  .asciz  "bar"
+  
+.section  .debug_abbrev,"", at progbits
+  .byte  1                       # Abbreviation Code
+  .byte  17                      # DW_TAG_compile_unit
+  .byte  1                       # DW_CHILDREN_yes
+  .byte  37                      # DW_AT_producer
+  .byte  14                      # DW_FORM_strp
+  .byte  19                      # DW_AT_language
+  .byte  5                       # DW_FORM_data2
+  .byte  3                       # DW_AT_name
+  .byte  14                      # DW_FORM_strp
+  .byte  16                      # DW_AT_stmt_list
+  .byte  23                      # DW_FORM_sec_offset
+  .byte  27                      # DW_AT_comp_dir
+  .byte  14                      # DW_FORM_strp
+  .ascii  "\264B"                # DW_AT_GNU_pubnames
+  .byte  25                      # DW_FORM_flag_present
+  .byte  0                       # EOM(1)
+  .byte  0                       # EOM(2)
+
+  .byte  2                       # Abbreviation Code
+  .byte  52                      # DW_TAG_variable
+  .byte  0                       # DW_CHILDREN_no
+  .byte  3                       # DW_AT_name
+  .byte  14                      # DW_FORM_strp
+  .byte  73                      # DW_AT_type
+  .byte  19                      # DW_FORM_ref4
+  .byte  63                      # DW_AT_external
+  .byte  25                      # DW_FORM_flag_present
+  .byte  58                      # DW_AT_decl_file
+  .byte  11                      # DW_FORM_data1
+  .byte  59                      # DW_AT_decl_line
+  .byte  11                      # DW_FORM_data1
+  .byte  2                       # DW_AT_location
+  .byte  24                      # DW_FORM_exprloc
+  .byte  0                       # EOM(1)
+  .byte  0                       # EOM(2)
+
+  .byte  3                       # Abbreviation Code
+  .byte  36                      # DW_TAG_base_type
+  .byte  0                       # DW_CHILDREN_no
+  .byte  3                       # DW_AT_name
+  .byte  14                      # DW_FORM_strp
+  .byte  62                      # DW_AT_encoding
+  .byte  11                      # DW_FORM_data1
+  .byte  11                      # DW_AT_byte_size
+  .byte  11                      # DW_FORM_data1
+  .byte  0                       # EOM(1)
+  .byte  0                       # EOM(2)
+  .byte  0                       # EOM(3)
+
+.section  .debug_info,"", at progbits
+.Lcu_begin0:
+  .long  76                      # Length of Unit
+  .short  4                      # DWARF version number
+  .long  .debug_abbrev           # Offset Into Abbrev. Section
+  .byte  8                       # Address Size (in bytes)
+
+  .byte  1                       # Abbrev [1] 0xb:0x45 DW_TAG_compile_unit
+  .long  .Linfo_string0          # DW_AT_producer
+  .short  12                     # DW_AT_language
+  .long  .Linfo_string1          # DW_AT_name
+  .long  0                       # DW_AT_stmt_list
+  .long  .Linfo_string2          # DW_AT_comp_dir
+
+  .byte  2                       # Abbrev [2] 0x1e:0x15 DW_TAG_variable
+  .long  .Linfo_string3          # DW_AT_name
+  .long  51                      # DW_AT_type
+  .byte  1                       # DW_AT_decl_file
+  .byte  1                       # DW_AT_decl_line
+  .byte  9                       # DW_AT_location
+  .byte  3
+  .quad  foo
+
+  .byte  3                       # Abbrev [3] 0x33:0x7 DW_TAG_base_type
+  .long  .Linfo_string4          # DW_AT_name
+  .byte  5                       # DW_AT_encoding
+  .byte  4                       # DW_AT_byte_size
+
+  .byte  2                       # Abbrev [2] 0x3a:0x15 DW_TAG_variable
+  .long  .Linfo_string5          # DW_AT_name
+  .long  51                      # DW_AT_type
+  .byte  1                       # DW_AT_decl_file
+  .byte  2                       # DW_AT_decl_line
+  .byte  9                       # DW_AT_location
+  .byte  3
+  .quad  bar
+  .byte  0                       # End Of Children Mark




More information about the llvm-commits mailing list