diff options
author | Pedro Alves <palves@redhat.com> | 2018-06-14 12:23:56 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2018-06-14 12:24:39 +0100 |
commit | a898ca0e0c5893c58b60a7f76225d104df240549 (patch) | |
tree | fc1b5a6e74aaf89d9b8b0fa500db62f215f4ccc8 /gdb/inline-frame.c | |
parent | 1d39de443a38448226ffc408290c17c54c598c39 (diff) | |
download | gdb-a898ca0e0c5893c58b60a7f76225d104df240549.zip gdb-a898ca0e0c5893c58b60a7f76225d104df240549.tar.gz gdb-a898ca0e0c5893c58b60a7f76225d104df240549.tar.bz2 |
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.
Diffstat (limited to 'gdb/inline-frame.c')
-rw-r--r-- | gdb/inline-frame.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c index 1ac5835..3edd5b2 100644 --- a/gdb/inline-frame.c +++ b/gdb/inline-frame.c @@ -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; |