btrace: work around _dl_runtime_resolve returning to resolved function
authorMarkus Metzger <markus.t.metzger@intel.com>
Fri, 23 Jan 2015 12:32:12 +0000 (13:32 +0100)
committerMarkus Metzger <markus.t.metzger@intel.com>
Tue, 3 Mar 2015 08:52:27 +0000 (09:52 +0100)
On some systems, _dl_runtime_resolve returns to the resolved function
instead of jumping to it.  Since btrace will not find the function in
the current stack back trace, it will start a new back trace on the
same level.  It will look the same to the user via the backtrace
command but the frames will have different id's which confuses stepping.

This fixes a test fail with 32-bit inferior reported by Jan Kratochvil.

gdb/
* btrace.c (ftrace_update_function): Treat return as tailcall for
"_dl_runtime_resolve".

gdb/ChangeLog
gdb/btrace.c

index 09a675fd83a3fd1a4e6a7a0bc8d81a26d518b401..3e9fa55e9573863baae57bc21b1206d752d81be4 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-03  Markus Metzger  <markus.t.metzger@intel.com>
+
+       * btrace.c (ftrace_update_function): Treat return as tailcall for
+       "_dl_runtime_resolve".
+
 2015-03-03  Markus Metzger  <markus.t.metzger@intel.com>
 
        * btrace.h (btrace_function) <lbegin, lend>: Remove.
index c5d3ee19fc07a301eddac1e90ef14fa14a731750..5436ee9e8fbb29fcb3d2c0782a13146a774d2c9a 100644 (file)
@@ -478,7 +478,24 @@ ftrace_update_function (struct btrace_function *bfun, CORE_ADDR pc)
       switch (last->iclass)
        {
        case BTRACE_INSN_RETURN:
-         return ftrace_new_return (bfun, mfun, fun);
+         {
+           const char *fname;
+
+           /* On some systems, _dl_runtime_resolve returns to the resolved
+              function instead of jumping to it.  From our perspective,
+              however, this is a tailcall.
+              If we treated it as return, we wouldn't be able to find the
+              resolved function in our stack back trace.  Hence, we would
+              lose the current stack back trace and start anew with an empty
+              back trace.  When the resolved function returns, we would then
+              create a stack back trace with the same function names but
+              different frame id's.  This will confuse stepping.  */
+           fname = ftrace_print_function_name (bfun);
+           if (strcmp (fname, "_dl_runtime_resolve") == 0)
+             return ftrace_new_tailcall (bfun, mfun, fun);
+
+           return ftrace_new_return (bfun, mfun, fun);
+         }
 
        case BTRACE_INSN_CALL:
          /* Ignore calls to the next instruction.  They are used for PIC.  */