mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-03-03 06:58:15 +00:00
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.
This commit is contained in:
parent
b61ce85cc5
commit
2dfdb47abd
@ -1,3 +1,7 @@
|
||||
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
|
||||
|
13
gdb/btrace.c
13
gdb/btrace.c
@ -529,10 +529,17 @@ ftrace_update_function (struct btrace_function *bfun, CORE_ADDR pc)
|
||||
|
||||
start = get_pc_function_start (pc);
|
||||
|
||||
/* 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)
|
||||
/* 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 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user