This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] btrace: update tail call heuristic


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2dfdb47abd418aac05380482093a87e763ab0a05

commit 2dfdb47abd418aac05380482093a87e763ab0a05
Author: Markus Metzger <markus.t.metzger@intel.com>
Date:   Tue Jan 12 16:05:15 2016 +0100

    btrace: update tail call heuristic
    
    An unconditional jump to the start of a function typically indicates a tail
    call.
    
    If we can't determine the start of the function at the destination address, we
    used to treat it as a tail call, as well.  This results in lots of tail calls
    for code for which we don't have symbol information.
    
    Restrict the heuristic to only consider jumps as tail calls that switch
    functions in the case where we can't determine the start of a function.  This
    effectively disables tail call detection for code without symbol information.
    
    gdb/
    	* btrace.c (ftrace_update_function): Update tail call heuristic.

Diff:
---
 gdb/ChangeLog |  4 ++++
 gdb/btrace.c  | 11 +++++++++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 350e5a6..98e13ea 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,9 @@
 2016-10-28  Markus Metzger  <markus.t.metzger@intel.com>
 
+	* btrace.c (ftrace_update_function): Update tail call heuristic.
+
+2016-10-28  Markus Metzger  <markus.t.metzger@intel.com>
+
 	* btrace.c (btrace_compute_ftrace_bts, ftrace_add_pt): Allow
 	leading gaps.
 	* record-btrace.c (record_btrace_single_step_forward)
diff --git a/gdb/btrace.c b/gdb/btrace.c
index 648d495..445f0a4 100644
--- a/gdb/btrace.c
+++ b/gdb/btrace.c
@@ -529,10 +529,17 @@ ftrace_update_function (struct btrace_function *bfun, CORE_ADDR pc)
 
 	    start = get_pc_function_start (pc);
 
+	    /* A jump to the start of a function is (typically) a tail call.  */
+	    if (start == pc)
+	      return ftrace_new_tailcall (bfun, mfun, fun);
+
 	    /* If we can't determine the function for PC, we treat a jump at
-	       the end of the block as tail call.  */
-	    if (start == 0 || start == pc)
+	       the end of the block as tail call if we're switching functions
+	       and as an intra-function branch if we don't.  */
+	    if (start == 0 && ftrace_function_switched (bfun, mfun, fun))
 	      return ftrace_new_tailcall (bfun, mfun, fun);
+
+	    break;
 	  }
 	}
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]