Skip to content

Commit

Permalink
gdb: add user-created frames to stash
Browse files Browse the repository at this point in the history
A subsequent patch makes it possible for frame_info_ptr to reinflate
user-created frames.  If two frame_info_ptr objects wrapping the same
user-created frame_info need to do reinflation, we want them to end up
pointing to the same frame_info instance, and not create two separate
frame_infos.  Otherwise, GDB gets confused down the line, as the state
kept in one frame_info object starts differing from the other
frame_info.

Achieve this by making create_new_frame place the user-created frames in
the frame stash.  This way, when the second frame_info_ptr does
reinflation, it will find the existing frame_info object, created by the
other frame_info_ptr, in the frame stash.

To make the frame stash differentiate between regular and user-created
frame infos which would otherwise be equal, change frame_addr_hash and
frame_id::operator== to account for frame_id::user_created_p.

I made create_new_frame look up existing frames in the stash, and only
create one if it doesn't find one.  The goal is to avoid the
"select-frame view"/"info frame view"/"frame view" commands from
overriding existing entries into the stash, should the user specify the
same frame more than once.  This will also help in the subsequent patch
that makes frame_info_ptr capable of reinflating user-created frames.
It will be able to just call create_new_frame and it will do the right
thing.

Change-Id: I14ba5799012056c007b4992ecb5c7adafd0c2404
Reviewed-By: Bruno Larsen <[email protected]>
  • Loading branch information
simark committed Jan 20, 2023
1 parent 848ab2a commit f649a71
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions gdb/frame.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,9 @@ frame_addr_hash (const void *ap)
hash = iterative_hash (&f_id.special_addr,
sizeof (f_id.special_addr), hash);

char user_created_p = f_id.user_created_p;
hash = iterative_hash (&user_created_p, sizeof (user_created_p), hash);

return hash;
}

Expand Down Expand Up @@ -775,6 +778,8 @@ frame_id::operator== (const frame_id &r) const
else if (artificial_depth != r.artificial_depth)
/* If artificial depths are different, the frames must be different. */
eq = false;
else if (user_created_p != r.user_created_p)
eq = false;
else
/* Frames are equal. */
eq = true;
Expand Down Expand Up @@ -1931,6 +1936,14 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc)

frame_debug_printf ("addr=%s, pc=%s", hex_string (addr), hex_string (pc));

/* Avoid creating duplicate frames, search for an existing frame with that id
in the stash. */
frame_id id = frame_id_build (addr, pc);
id.user_created_p = 1;
frame_info_ptr frame = frame_stash_find (id);
if (frame != nullptr)
return frame;

fi = FRAME_OBSTACK_ZALLOC (struct frame_info);

fi->next = create_sentinel_frame (current_program_space,
Expand All @@ -1952,8 +1965,10 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc)
frame_unwind_find_by_frame (frame_info_ptr (fi), &fi->prologue_cache);

fi->this_id.p = frame_id_status::COMPUTED;
fi->this_id.value = frame_id_build (addr, pc);
fi->this_id.value.user_created_p = 1;
fi->this_id.value = id;

bool added = frame_stash_add (fi);
gdb_assert (added);

frame_debug_printf (" -> %s", fi->to_string ().c_str ());

Expand Down

0 comments on commit f649a71

Please sign in to comment.