+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_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)
+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.
-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
"-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"
[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" ] \