aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/btrace.c11
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;
}
}
}