From 2098b3d315b612d12b1425639707552e06131cde Mon Sep 17 00:00:00 2001 From: Josh Stone Date: Wed, 10 Dec 2014 11:14:40 -0800 Subject: [PATCH] addr2line: Always prefer linkage_name over plain names Signed-off-by: Josh Stone --- src/ChangeLog | 7 ++++++ src/addr2line.c | 40 +++++++++++++++++------------------ tests/ChangeLog | 5 +++++ tests/run-addr2line-i-test.sh | 4 +++- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 413a6bf6c..12b7e7f4b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2014-12-10 Josh Stone + + * addr2line.c (get_diename): New, get linkage_name or name. + * addr2line.c (print_dwarf_function): Use get_diename. + * addr2line.c (handle_address): Likewise. + * addr2line.c (print_diesym): Removed. + 2014-12-10 Josh Stone * addr2line.c (handle_address): Find the proper inline parents. diff --git a/src/addr2line.c b/src/addr2line.c index e8ffbc687..de8029410 100644 --- a/src/addr2line.c +++ b/src/addr2line.c @@ -258,6 +258,23 @@ parse_opt (int key, char *arg, struct argp_state *state) } +static const char * +get_diename (Dwarf_Die *die) +{ + Dwarf_Attribute attr; + const char *name; + + name = dwarf_formstring (dwarf_attr_integrate (die, DW_AT_MIPS_linkage_name, + &attr) + ?: dwarf_attr_integrate (die, DW_AT_linkage_name, + &attr)); + + if (name == NULL) + name = dwarf_diename (die) ?: "??"; + + return name; +} + static bool print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr) { @@ -274,7 +291,7 @@ print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr) { case DW_TAG_subprogram: { - const char *name = dwarf_diename (&scopes[i]); + const char *name = get_diename (&scopes[i]); if (name == NULL) return false; puts (name); @@ -283,7 +300,7 @@ print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr) case DW_TAG_inlined_subroutine: { - const char *name = dwarf_diename (&scopes[i]); + const char *name = get_diename (&scopes[i]); if (name == NULL) return false; printf ("%s inlined", name); @@ -395,23 +412,6 @@ print_addrsym (Dwfl_Module *mod, GElf_Addr addr) } } -static void -print_diesym (Dwarf_Die *die) -{ - Dwarf_Attribute attr; - const char *name; - - name = dwarf_formstring (dwarf_attr_integrate (die, DW_AT_MIPS_linkage_name, - &attr) - ?: dwarf_attr_integrate (die, DW_AT_linkage_name, - &attr)); - - if (name == NULL) - name = dwarf_diename (die) ?: "??"; - - puts (name); -} - static int see_one_module (Dwfl_Module *mod, void **userdata __attribute__ ((unused)), @@ -684,7 +684,7 @@ handle_address (const char *string, Dwfl *dwfl) || tag == DW_TAG_entry_point || tag == DW_TAG_subprogram) { - print_diesym (parent); + puts (get_diename (parent)); break; } } diff --git a/tests/ChangeLog b/tests/ChangeLog index c22ed8a11..9d229c9d6 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2014-12-10 Josh Stone + + * run-addr2line-i-test.sh: Test 0x5f0 to make sure linkage_name is + preferred over the plain die name. + 2014-12-02 Petr Machata * dwarf-getmacros.c (mac): Skip over DW_MACINFO_undef, diff --git a/tests/run-addr2line-i-test.sh b/tests/run-addr2line-i-test.sh index e98adda3a..183916c7d 100755 --- a/tests/run-addr2line-i-test.sh +++ b/tests/run-addr2line-i-test.sh @@ -103,7 +103,7 @@ testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000 EOF # All together now (plus function names). -testrun_compare ${abs_top_builddir}/src/addr2line -f -i -e testfile-inlines 0x00000000000005a0 0x00000000000005a1 0x00000000000005b0 0x00000000000005b1 0x00000000000005c0 0x00000000000005d0 0x00000000000005e0 0x00000000000005e1 0x00000000000005f1 0x00000000000005f2 <<\EOF +testrun_compare ${abs_top_builddir}/src/addr2line -f -i -e testfile-inlines 0x00000000000005a0 0x00000000000005a1 0x00000000000005b0 0x00000000000005b1 0x00000000000005c0 0x00000000000005d0 0x00000000000005e0 0x00000000000005e1 0x00000000000005f0 0x00000000000005f1 0x00000000000005f2 <<\EOF foobar /tmp/x.cpp:5 foobar @@ -132,6 +132,8 @@ baz /tmp/x.cpp:20 _Z3foov /tmp/x.cpp:26 +_Z2fuv +/tmp/x.cpp:31 fubar inlined at /tmp/x.cpp:32 in _Z2fuv /tmp/x.cpp:10 _Z2fuv -- 2.47.3