aboutsummaryrefslogtreecommitdiff
path: root/gdb/btrace.c
diff options
context:
space:
mode:
authorMarkus Metzger <markus.t.metzger@intel.com>2016-01-12 16:05:15 +0100
committerMarkus Metzger <markus.t.metzger@intel.com>2016-10-28 10:57:16 +0200
commit2dfdb47abd418aac05380482093a87e763ab0a05 (patch)
treee5e8b718ce7ea35d2e27223eb66166f91bbce433 /gdb/btrace.c
parentb61ce85cc54bf4acc86714cacd10d6f9f7e89d1b (diff)
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.
Diffstat (limited to 'gdb/btrace.c')
-rw-r--r--gdb/btrace.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gdb/btrace.c b/gdb/btrace.c
index 648d49532b..445f0a4c16 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;
}
}
}