Inline breakpoints

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* inline-frame.c (stopped_by_user_bp_inline_frame): Replace PC
	parameter with a block parameter.  Compare location's block symbol
	with the frame's block instead of addresses.
	(skip_inline_frames): Pass the current block instead of the
	frame's address.  Break out as soon as we determine the frame
	should not be skipped.

gdb/testsuite/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* gdb.opt/inline-break.c (func_callee, func_caller): New.
	(main): Call func_caller.
This commit is contained in:
Pedro Alves
2018-06-14 12:23:56 +01:00
parent 1d39de443a
commit a898ca0e0c
3 changed files with 49 additions and 12 deletions

View File

@ -286,11 +286,10 @@ block_starting_point_at (CORE_ADDR pc, const struct block *block)
}
/* Loop over the stop chain and determine if execution stopped in an
inlined frame because of a user breakpoint. THIS_PC is the current
frame's PC. */
inlined frame because of a user breakpoint set at FRAME_BLOCK. */
static bool
stopped_by_user_bp_inline_frame (CORE_ADDR this_pc, bpstat stop_chain)
stopped_by_user_bp_inline_frame (const block *frame_block, bpstat stop_chain)
{
for (bpstat s = stop_chain; s != NULL; s = s->next)
{
@ -301,9 +300,9 @@ stopped_by_user_bp_inline_frame (CORE_ADDR this_pc, bpstat stop_chain)
bp_location *loc = s->bp_location_at;
enum bp_loc_type t = loc->loc_type;
if (loc->address == this_pc
&& (t == bp_loc_software_breakpoint
|| t == bp_loc_hardware_breakpoint))
if ((t == bp_loc_software_breakpoint
|| t == bp_loc_hardware_breakpoint)
&& frame_block == SYMBOL_BLOCK_VALUE (loc->symbol))
return true;
}
}
@ -340,12 +339,12 @@ skip_inline_frames (ptid_t ptid, bpstat stop_chain)
{
/* Do not skip the inlined frame if execution
stopped in an inlined frame because of a user
breakpoint. */
if (!stopped_by_user_bp_inline_frame (this_pc, stop_chain))
{
skip_count++;
last_sym = BLOCK_FUNCTION (cur_block);
}
breakpoint for this inline function. */
if (stopped_by_user_bp_inline_frame (cur_block, stop_chain))
break;
skip_count++;
last_sym = BLOCK_FUNCTION (cur_block);
}
else
break;