On Wed, 2014-12-10 at 11:41 -0800, Josh Stone wrote:
The function which contains an inline might not be the immediate
next
die scope. For instance, there may be a lexical scope in between.
Instead, iterate the remaining scopes until an appropriate tag is found.
+2014-12-10 Josh Stone <jistone(a)redhat.com>
+
+ * addr2line.c (handle_address): Find the proper inline parents.
--- a/src/addr2line.c
+++ b/src/addr2line.c
@@ -672,7 +672,22 @@ handle_address (const char *string, Dwfl *dwfl)
continue;
if (show_functions)
- print_diesym (&scopes[i + 1]);
+ {
+ /* Search for the parent inline or function. It
+ might not be directly above this inline -- e.g.
+ there could be a lexical_block in between. */
+ for (int j = i + 1; j < nscopes; j++)
+ {
+ Dwarf_Die *parent = &scopes[j];
+ int tag = dwarf_tag (parent);
+ if (tag == DW_TAG_inlined_subroutine
+ || tag == DW_TAG_subprogram)
I believe technically you also want to match DW_TAG_entry_point. That
would match what eu-stack does. Admittedly GCC doesn't emit
DW_TAG_entry_point (the code is commented out in dwarf2out.c), but other
(fortran) compilers might. DWARF describes subprograms and entry_points
almost identically, both have a name and possibly a linkage_name, which
is what we care about here.
+ {
+ print_diesym (parent);
+ break;
+ }
+ }
+ }
src = NULL;
lineno = 0;
Looks good, but please add DW_TAG_entry_point above before pushing this
commit.
Thanks,
Mark