gdb: remove iterate_over_breakpoints function

Now that we have range functions that let us use ranged for loops, we
can remove iterate_over_breakpoints in favor of those, which are easier
to read and write.  This requires exposing the declaration of
all_breakpoints and all_breakpoints_safe in breakpoint.h, as well as the
supporting types.

Change some users of iterate_over_breakpoints to use all_breakpoints,
when they don't need to delete the breakpoint, and all_breakpoints_safe
otherwise.

gdb/ChangeLog:

	* breakpoint.h (iterate_over_breakpoints): Remove.  Update
	callers to use all_breakpoints or all_breakpoints_safe.
	(breakpoint_range, all_breakpoints, breakpoint_safe_range,
	all_breakpoints_safe): Move here.
	* breakpoint.c (all_breakpoints, all_breakpoints_safe): Make
	non-static.
	(iterate_over_breakpoints): Remove.
	* python/py-finishbreakpoint.c (bpfinishpy_detect_out_scope_cb):
	Return void.
	* python/py-breakpoint.c (build_bp_list): Add comment, reverse
	return value logic.
	* guile/scm-breakpoint.c (bpscm_build_bp_list): Return void.

Change-Id: Idde764a1f577de0423e4f2444a7d5cdb01ba5e48
This commit is contained in:
Simon Marchi
2021-05-27 14:58:37 -04:00
parent e0d9a27040
commit 240edef62f
9 changed files with 65 additions and 77 deletions

View File

@ -1,3 +1,18 @@
2021-05-27 Simon Marchi <simon.marchi@polymtl.ca>
* breakpoint.h (iterate_over_breakpoints): Remove. Update
callers to use all_breakpoints or all_breakpoints_safe.
(breakpoint_range, all_breakpoints, breakpoint_safe_range,
all_breakpoints_safe): Move here.
* breakpoint.c (all_breakpoints, all_breakpoints_safe): Make
non-static.
(iterate_over_breakpoints): Remove.
* python/py-finishbreakpoint.c (bpfinishpy_detect_out_scope_cb):
Return void.
* python/py-breakpoint.c (build_bp_list): Add comment, reverse
return value logic.
* guile/scm-breakpoint.c (bpscm_build_bp_list): Return void.
2021-05-27 Simon Marchi <simon.marchi@polymtl.ca>
* breakpoint.c (get_first_locp_gte_addr): Remove.

View File

@ -493,27 +493,17 @@ bool target_exact_watchpoints = false;
static struct breakpoint *breakpoint_chain;
/* Breakpoint linked list range. */
/* See breakpoint.h. */
using breakpoint_range = next_adapter<breakpoint, breakpoint_iterator>;
/* Return a range to iterate over all breakpoints. */
static breakpoint_range
breakpoint_range
all_breakpoints ()
{
return breakpoint_range (breakpoint_chain);
}
/* Breakpoint linked list range, safe against deletion of the current
breakpoint while iterating. */
/* See breakpoint.h. */
using breakpoint_safe_range = basic_safe_range<breakpoint_range>;
/* Return a range to iterate over all breakpoints. This range is safe against
deletion of the current breakpoint while iterating. */
static breakpoint_safe_range
breakpoint_safe_range
all_breakpoints_safe ()
{
return breakpoint_safe_range (all_breakpoints ());
@ -15191,16 +15181,6 @@ add_catch_command (const char *name, const char *docstring,
set_cmd_completer (command, completer);
}
struct breakpoint *
iterate_over_breakpoints (gdb::function_view<bool (breakpoint *)> callback)
{
for (breakpoint *b : all_breakpoints_safe ())
if (callback (b))
return b;
return NULL;
}
/* Zero if any of the breakpoint's locations could be a location where
functions have been inlined, nonzero otherwise. */

View File

@ -31,6 +31,7 @@
#include "gdbsupport/filtered-iterator.h"
#include "gdbsupport/function-view.h"
#include "gdbsupport/refcounted-object.h"
#include "gdbsupport/safe-iterator.h"
#include "cli/cli-script.h"
struct block;
@ -1711,21 +1712,28 @@ public:
DISABLE_COPY_AND_ASSIGN (scoped_rbreak_breakpoints);
};
/* Breakpoint iterator function.
Calls a callback function once for each breakpoint, so long as the
callback function returns false. If the callback function returns
true, the iteration will end and the current breakpoint will be
returned. This can be useful for implementing a search for a
breakpoint with arbitrary attributes, or for applying an operation
to every breakpoint. */
extern struct breakpoint *iterate_over_breakpoints
(gdb::function_view<bool (breakpoint *)>);
/* Breakpoint linked list iterator. */
using breakpoint_iterator = next_iterator<breakpoint>;
/* Breakpoint linked list range. */
using breakpoint_range = next_adapter<breakpoint, breakpoint_iterator>;
/* Return a range to iterate over all breakpoints. */
breakpoint_range all_breakpoints ();
/* Breakpoint linked list range, safe against deletion of the current
breakpoint while iterating. */
using breakpoint_safe_range = basic_safe_range<breakpoint_range>;
/* Return a range to iterate over all breakpoints. This range is safe against
deletion of the current breakpoint while iterating. */
breakpoint_safe_range all_breakpoints_safe ();
/* Breakpoint filter to only keep tracepoints. */
struct tracepoint_filter

View File

@ -166,10 +166,9 @@ pop_dummy_frame (struct dummy_frame **dummy_ptr)
restore_infcall_suspend_state (dummy->caller_state);
iterate_over_breakpoints ([dummy] (breakpoint* bp)
{
return pop_dummy_frame_bpt (bp, dummy);
});
for (breakpoint *bp : all_breakpoints_safe ())
if (pop_dummy_frame_bpt (bp, dummy))
break;
/* restore_infcall_control_state frees inf_state,
all that remains is to pop *dummy_ptr. */

View File

@ -508,7 +508,7 @@ gdbscm_delete_breakpoint_x (SCM self)
/* iterate_over_breakpoints function for gdbscm_breakpoints. */
static bool
static void
bpscm_build_bp_list (struct breakpoint *bp, SCM *list)
{
breakpoint_smob *bp_smob = bp->scm_bp_object;
@ -535,8 +535,6 @@ bpscm_build_bp_list (struct breakpoint *bp, SCM *list)
if (bp_smob != NULL)
*list = scm_cons (bp_smob->containing_scm, *list);
return false;
}
/* (breakpoints) -> list
@ -547,10 +545,8 @@ gdbscm_breakpoints (void)
{
SCM list = SCM_EOL;
iterate_over_breakpoints ([&] (breakpoint *bp)
{
return bpscm_build_bp_list(bp, &list);
});
for (breakpoint *bp : all_breakpoints ())
bpscm_build_bp_list (bp, &list);
return scm_reverse_x (list, SCM_EOL);
}

View File

@ -898,25 +898,24 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
return 0;
}
/* Append to LIST the breakpoint Python object associated to B.
Return true on success. Return false on failure, with the Python error
indicator set. */
static bool
build_bp_list (struct breakpoint *b, PyObject *list)
{
PyObject *bp = (PyObject *) b->py_bp_object;
int iserr = 0;
/* Not all breakpoints will have a companion Python object.
Only breakpoints that were created via bppy_new, or
breakpoints that were created externally and are tracked by
the Python Scripting API. */
if (bp)
iserr = PyList_Append (list, bp);
if (iserr == -1)
if (bp == nullptr)
return true;
return false;
return PyList_Append (list, bp) == 0;
}
/* Static function to return a tuple holding all breakpoints. */
@ -931,15 +930,11 @@ gdbpy_breakpoints (PyObject *self, PyObject *args)
if (list == NULL)
return NULL;
/* If iterate_over_breakpoints returns non NULL it signals an error
condition. In that case abandon building the list and return
NULL. */
auto callback = [&] (breakpoint *bp)
{
return build_bp_list(bp, list.get ());
};
if (iterate_over_breakpoints (callback) != NULL)
return NULL;
/* If build_bp_list returns false, it signals an error condition. In that
case abandon building the list and return nullptr. */
for (breakpoint *bp : all_breakpoints ())
if (!build_bp_list (bp, list.get ()))
return nullptr;
return PyList_AsTuple (list.get ());
}

View File

@ -342,7 +342,7 @@ bpfinishpy_out_of_scope (struct finish_breakpoint_object *bpfinish_obj)
/* Callback for `bpfinishpy_detect_out_scope'. Triggers Python's
`B->out_of_scope' function if B is a FinishBreakpoint out of its scope. */
static bool
static void
bpfinishpy_detect_out_scope_cb (struct breakpoint *b,
struct breakpoint *bp_stopped)
{
@ -372,8 +372,6 @@ bpfinishpy_detect_out_scope_cb (struct breakpoint *b,
}
}
}
return 0;
}
/* Attached to `stop' notifications, check if the execution has run
@ -384,11 +382,8 @@ bpfinishpy_handle_stop (struct bpstats *bs, int print_frame)
{
gdbpy_enter enter_py (get_current_arch (), current_language);
iterate_over_breakpoints ([&] (breakpoint *bp)
{
return bpfinishpy_detect_out_scope_cb
(bp, bs == NULL ? NULL : bs->breakpoint_at);
});
for (breakpoint *bp : all_breakpoints_safe ())
bpfinishpy_detect_out_scope_cb (bp, bs == NULL ? NULL : bs->breakpoint_at);
}
/* Attached to `exit' notifications, triggers all the necessary out of
@ -399,10 +394,8 @@ bpfinishpy_handle_exit (struct inferior *inf)
{
gdbpy_enter enter_py (target_gdbarch (), current_language);
iterate_over_breakpoints ([&] (breakpoint *bp)
{
return bpfinishpy_detect_out_scope_cb (bp, nullptr);
});
for (breakpoint *bp : all_breakpoints_safe ())
bpfinishpy_detect_out_scope_cb (bp, nullptr);
}
/* Initialize the Python finish breakpoint code. */

View File

@ -2059,7 +2059,8 @@ svr4_update_solib_event_breakpoint (struct breakpoint *b)
static void
svr4_update_solib_event_breakpoints (void)
{
iterate_over_breakpoints (svr4_update_solib_event_breakpoint);
for (breakpoint *bp : all_breakpoints_safe ())
svr4_update_solib_event_breakpoint (bp);
}
/* Create and register solib event breakpoints. PROBES is an array

View File

@ -457,7 +457,7 @@ tui_source_window_base::update_breakpoint_info
do with it. Identify enable/disabled breakpoints as well as
those that we already hit. */
tui_bp_flags mode = 0;
iterate_over_breakpoints ([&] (breakpoint *bp) -> bool
for (breakpoint *bp : all_breakpoints ())
{
if (bp == being_deleted)
return false;
@ -479,7 +479,8 @@ tui_source_window_base::update_breakpoint_info
}
}
return false;
});
}
if (line->break_mode != mode)
{
line->break_mode = mode;