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:
Markus Metzger 2016-01-12 16:05:15 +01:00
parent b61ce85cc5
commit 2dfdb47abd
2 changed files with 14 additions and 3 deletions

View File

@ -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

View File

@ -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;
}
}
}