]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
addr2line: Always prefer linkage_name over plain names
authorJosh Stone <jistone@redhat.com>
Wed, 10 Dec 2014 19:14:40 +0000 (11:14 -0800)
committerJosh Stone <jistone@redhat.com>
Thu, 11 Dec 2014 18:48:15 +0000 (10:48 -0800)
Signed-off-by: Josh Stone <jistone@redhat.com>
src/ChangeLog
src/addr2line.c
tests/ChangeLog
tests/run-addr2line-i-test.sh

index 413a6bf6c9a33d58105963b18af01b4d759e5df1..12b7e7f4b5ed1848fb554d59a0b2f93b7878e8a4 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-10  Josh Stone  <jistone@redhat.com>
+
+       * 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  <jistone@redhat.com>
 
        * addr2line.c (handle_address): Find the proper inline parents.
index e8ffbc68749501e7be1fee9756e1f99398741245..de802941092079e0326ca03727ce22b11eb14555 100644 (file)
@@ -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;
                                }
                            }
index c22ed8a1106daa4c7a87c05e9850576f7fee7203..9d229c9d639c5b2972958311cc772850fa9a82d5 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-10  Josh Stone  <jistone@redhat.com>
+
+       * run-addr2line-i-test.sh: Test 0x5f0 to make sure linkage_name is
+       preferred over the plain die name.
+
 2014-12-02  Petr Machata  <pmachata@redhat.com>
 
        * dwarf-getmacros.c (mac): Skip over DW_MACINFO_undef,
index e98adda3a49643e68ff016eb6dfbb7736d95063e..183916c7dd30d0e8f64b1eeb0a492c88d1ecb195 100755 (executable)
@@ -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