This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] bfd: Improve lookup of file / line information for errors


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=3239a4231ff79bf8b67b8faaf414b1667486167c

commit 3239a4231ff79bf8b67b8faaf414b1667486167c
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Mon Dec 19 15:27:59 2016 +0000

    bfd: Improve lookup of file / line information for errors
    
    When looking up file and line information (used from the linker to
    report error messages) if no symbol is passed in, then use the symbol
    list to look for a matching symbol.
    
    If a matching symbol is found then use this to look up the file / line
    information.
    
    This should improve errors when looking up file / line information for
    data sections.  Hopefully we should find a matching data symbol, which
    should, in turn (we hope) match a DW_TAG_variable in the DWARF, this
    should allow us to give accurate file / line errors for data symbols.
    
    As the hope is to find a matching DW_TAG_variable in the DWARF then we
    ignore section symbols, and prefer global symbols to locals.
    
    bfd/ChangeLog:
    
    	* dwarf2.c (_bfd_dwarf2_find_nearest_line): Perform symbol lookup
    	before trying to fine matching file and line information.
    
    ld/ChangeLog:
    
    	* testsuite/ld-elf/shared.exp: Update expected results.
    	* testsuite/ld-elf/dwarf2.err: Likewise

Diff:
---
 bfd/ChangeLog                  |  5 +++++
 bfd/dwarf2.c                   | 32 ++++++++++++++++++++++++++++++++
 ld/ChangeLog                   |  5 +++++
 ld/testsuite/ld-elf/dwarf2.err |  9 +++++----
 ld/testsuite/ld-elf/shared.exp |  4 ++--
 5 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 01314bd..40edca7 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
 2017-02-16  Andrew Burgess  <andrew.burgess@embecosm.com>
 
+	* dwarf2.c (_bfd_dwarf2_find_nearest_line): Perform symbol lookup
+	before trying to fine matching file and line information.
+
+2017-02-16  Andrew Burgess  <andrew.burgess@embecosm.com>
+
 	* dwarf2.c (struct dwarf2_debug): Add orig_bfd member.
 	(_bfd_dwarf2_slurp_debug_info): If stashed debug information does
 	not match current bfd, then reload debug information.  Record bfd
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index 03447a9..9bb8126 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -4155,6 +4155,38 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
     {
       BFD_ASSERT (section != NULL && functionname_ptr != NULL);
       addr = offset;
+
+      /* If we have no SYMBOL but the section we're looking at is not a
+         code section, then take a look through the list of symbols to see
+         if we have a symbol at the address we're looking for.  If we do
+         then use this to look up line information.  This will allow us to
+         give file and line results for data symbols.  We exclude code
+         symbols here, if we look up a function symbol and then look up the
+         line information we'll actually return the line number for the
+         opening '{' rather than the function definition line.  This is
+         because looking up by symbol uses the line table, in which the
+         first line for a function is usually the opening '{', while
+         looking up the function by section + offset uses the
+         DW_AT_decl_line from the function DW_TAG_subprogram for the line,
+         which will be the line of the function name.  */
+      if ((section->flags & SEC_CODE) == 0)
+	{
+	  asymbol **tmp;
+
+	  for (tmp = symbols; (*tmp) != NULL; ++tmp)
+	    if ((*tmp)->the_bfd == abfd
+		&& (*tmp)->section == section
+		&& (*tmp)->value == offset
+		&& ((*tmp)->flags & BSF_SECTION_SYM) == 0)
+	      {
+		symbol = *tmp;
+		do_line = TRUE;
+                /* For local symbols, keep going in the hope we find a
+                   global.  */
+                if ((symbol->flags & BSF_GLOBAL) != 0)
+                  break;
+	      }
+	}
     }
 
   if (section->output_section)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 696e08af..7d47397 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,10 @@
 2017-02-16  Andrew Burgess  <andrew.burgess@embecosm.com>
 
+	* testsuite/ld-elf/shared.exp: Update expected results.
+	* testsuite/ld-elf/dwarf2.err: Likewise
+
+2017-02-16  Andrew Burgess  <andrew.burgess@embecosm.com>
+
 	* testsuite/ld-elf/dwarf.exp (build_tests): Add new tests.
 	* testsuite/ld-elf/dwarf2.err: New file.
 	* testsuite/ld-elf/dwarf2a.c: New file.
diff --git a/ld/testsuite/ld-elf/dwarf2.err b/ld/testsuite/ld-elf/dwarf2.err
index 872d282..b4ea67f 100644
--- a/ld/testsuite/ld-elf/dwarf2.err
+++ b/ld/testsuite/ld-elf/dwarf2.err
@@ -1,4 +1,5 @@
-tmpdir/dwarf2b\.o:\(\.data\+0x0\): multiple definition of `global_var'
-tmpdir/dwarf2a\.o:\(\.data\+0x0\): first defined here
-tmpdir/dwarf2b\.o:\(\.data\+0x4\): multiple definition of `other_var'
-tmpdir/dwarf2a\.o:\(\.data\+0x4\): first defined here
+tmpdir/dwarf2b\.o:.*dwarf2b\.c:1: multiple definition of `global_var'
+tmpdir/dwarf2a\.o:.*dwarf2a\.c:1: first defined here
+tmpdir/dwarf2b\.o:.*dwarf2b\.c:2: multiple definition of `other_var'
+tmpdir/dwarf2a\.o:.*dwarf2a\.c:2: first defined here
+#...
\ No newline at end of file
diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
index 9d5a9d9..3b8ab18 100644
--- a/ld/testsuite/ld-elf/shared.exp
+++ b/ld/testsuite/ld-elf/shared.exp
@@ -105,7 +105,7 @@ set build_tests {
    "-shared" "-fPIC"
   {beginwarn.c end.c}
   {{readelf {-S --wide} libbarw.rd}
-   {warning "^.*\\): warning: function foo is deprecated$"}}
+   {warning "^.*beginwarn.c:7: warning: function foo is deprecated$"}}
   "libbarw.so" "c"}
   {"Build hidden libbar.so"
    "-shared" "-fPIC"
@@ -350,7 +350,7 @@ set run_tests [list \
     [list "Run warn with versioned libfoo.so" \
      "-Wl,--no-as-needed tmpdir/beginwarn.o tmpdir/libfoov.so" "" \
      {main.c} "warn" "warn.out" \
-     "" "c" {^.*\): warning: function foo is deprecated$} ] \
+     "" "c" {^.*beginwarn.c:7: warning: function foo is deprecated$} ] \
     [list "Run protected with versioned libfoo.so" \
      "-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoov.so tmpdir/endprotected.o" "" \
      {main.c} "protected" "normal.out" ] \


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]