aboutsummaryrefslogtreecommitdiff
path: root/gdb/infrun.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2024-02-19 13:07:47 -0500
committerSimon Marchi <simon.marchi@efficios.com>2024-02-20 10:42:25 -0500
commit8480a37e146c40e82a93c0ecf6144571516c95c5 (patch)
treebfa5d1e14e5212821ee29ae5099be72399137036 /gdb/infrun.c
parent1b2c120daf9e2d935453f9051bbeafbac7f9f14d (diff)
downloadbinutils-8480a37e146c40e82a93c0ecf6144571516c95c5.zip
binutils-8480a37e146c40e82a93c0ecf6144571516c95c5.tar.gz
binutils-8480a37e146c40e82a93c0ecf6144571516c95c5.tar.bz2
gdb: pass frames as `const frame_info_ptr &`
We currently pass frames to function by value, as `frame_info_ptr`. This is somewhat expensive: - the size of `frame_info_ptr` is 64 bytes, which is a bit big to pass by value - the constructors and destructor link/unlink the object in the global `frame_info_ptr::frame_list` list. This is an `intrusive_list`, so it's not so bad: it's just assigning a few points, there's no memory allocation as if it was `std::list`, but still it's useless to do that over and over. As suggested by Tom Tromey, change many function signatures to accept `const frame_info_ptr &` instead of `frame_info_ptr`. Some functions reassign their `frame_info_ptr` parameter, like: void the_func (frame_info_ptr frame) { for (; frame != nullptr; frame = get_prev_frame (frame)) { ... } } I wondered what to do about them, do I leave them as-is or change them (and need to introduce a separate local variable that can be re-assigned). I opted for the later for consistency. It might not be clear why some functions take `const frame_info_ptr &` while others take `frame_info_ptr`. Also, if a function took a `frame_info_ptr` because it did re-assign its parameter, I doubt that we would think to change it to `const frame_info_ptr &` should the implementation change such that it doesn't need to take `frame_info_ptr` anymore. It seems better to have a simple rule and apply it everywhere. Change-Id: I59d10addef687d157f82ccf4d54f5dde9a963fd0 Approved-By: Andrew Burgess <aburgess@redhat.com>
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r--gdb/infrun.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c
index fa68ab8..bbb98f6 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -88,9 +88,9 @@ static void follow_inferior_reset_breakpoints (void);
static bool currently_stepping (struct thread_info *tp);
-static void insert_hp_step_resume_breakpoint_at_frame (frame_info_ptr);
+static void insert_hp_step_resume_breakpoint_at_frame (const frame_info_ptr &);
-static void insert_step_resume_breakpoint_at_caller (frame_info_ptr);
+static void insert_step_resume_breakpoint_at_caller (const frame_info_ptr &);
static void insert_longjmp_resume_breakpoint (struct gdbarch *, CORE_ADDR);
@@ -3838,7 +3838,7 @@ static void handle_step_into_function_backward (struct gdbarch *gdbarch,
struct execution_control_state *ecs);
static void handle_signal_stop (struct execution_control_state *ecs);
static void check_exception_resume (struct execution_control_state *,
- frame_info_ptr);
+ const frame_info_ptr &);
static void end_stepping_range (struct execution_control_state *ecs);
static void stop_waiting (struct execution_control_state *ecs);
@@ -4771,7 +4771,7 @@ fetch_inferior_event ()
/* See infrun.h. */
void
-set_step_info (thread_info *tp, frame_info_ptr frame,
+set_step_info (thread_info *tp, const frame_info_ptr &frame,
struct symtab_and_line sal)
{
/* This can be removed once this function no longer implicitly relies on the
@@ -5003,8 +5003,10 @@ adjust_pc_after_break (struct thread_info *thread,
}
static bool
-stepped_in_from (frame_info_ptr frame, struct frame_id step_frame_id)
+stepped_in_from (const frame_info_ptr &initial_frame, frame_id step_frame_id)
{
+ frame_info_ptr frame = initial_frame;
+
for (frame = get_prev_frame (frame);
frame != nullptr;
frame = get_prev_frame (frame))
@@ -8742,7 +8744,7 @@ insert_step_resume_breakpoint_at_sal (struct gdbarch *gdbarch,
RETURN_FRAME.pc. */
static void
-insert_hp_step_resume_breakpoint_at_frame (frame_info_ptr return_frame)
+insert_hp_step_resume_breakpoint_at_frame (const frame_info_ptr &return_frame)
{
gdb_assert (return_frame != nullptr);
@@ -8773,7 +8775,7 @@ insert_hp_step_resume_breakpoint_at_frame (frame_info_ptr return_frame)
of frame_unwind_caller_id for an example). */
static void
-insert_step_resume_breakpoint_at_caller (frame_info_ptr next_frame)
+insert_step_resume_breakpoint_at_caller (const frame_info_ptr &next_frame)
{
/* We shouldn't have gotten here if we don't know where the call site
is. */
@@ -8820,7 +8822,7 @@ insert_longjmp_resume_breakpoint (struct gdbarch *gdbarch, CORE_ADDR pc)
static void
insert_exception_resume_breakpoint (struct thread_info *tp,
const struct block *b,
- frame_info_ptr frame,
+ const frame_info_ptr &frame,
struct symbol *sym)
{
try
@@ -8863,7 +8865,7 @@ insert_exception_resume_breakpoint (struct thread_info *tp,
static void
insert_exception_resume_from_probe (struct thread_info *tp,
const struct bound_probe *probe,
- frame_info_ptr frame)
+ const frame_info_ptr &frame)
{
struct value *arg_value;
CORE_ADDR handler;
@@ -8892,7 +8894,7 @@ insert_exception_resume_from_probe (struct thread_info *tp,
static void
check_exception_resume (struct execution_control_state *ecs,
- frame_info_ptr frame)
+ const frame_info_ptr &frame)
{
struct bound_probe probe;
struct symbol *func;