diff options
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | 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; } } } |