diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2022-12-13 22:34:37 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2023-01-20 14:48:57 -0500 |
commit | d015d3206e11c6926c4afce723d8366afc965b97 (patch) | |
tree | 25e3abb4fdbd381696382f27c87c81d699431310 /gdb/frame.c | |
parent | f649a718522b018bbb09eb96beb103a4f5892a45 (diff) | |
download | gdb-d015d3206e11c6926c4afce723d8366afc965b97.zip gdb-d015d3206e11c6926c4afce723d8366afc965b97.tar.gz gdb-d015d3206e11c6926c4afce723d8366afc965b97.tar.bz2 |
gdb: add create_new_frame(frame_id) overload
The subsequent patches will need to call create_new_frame with an
existing frame_id representing a user created frame. They could call
the existing create_new_frame, passing both addresses, but it seems
nicer to have a version of the function that takes a frame_id directly.
Change-Id: If31025314fec0c3e644703e4391a5ef8079e1a32
Reviewed-By: Bruno Larsen <blarsen@redhat.com>
Diffstat (limited to 'gdb/frame.c')
-rw-r--r-- | gdb/frame.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/gdb/frame.c b/gdb/frame.c index 2e6a477..0909109 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1929,22 +1929,23 @@ select_frame (frame_info_ptr fi) /* Create an arbitrary (i.e. address specified by user) or innermost frame. Always returns a non-NULL value. */ -frame_info_ptr -create_new_frame (CORE_ADDR addr, CORE_ADDR pc) +static frame_info_ptr +create_new_frame (frame_id id) { - frame_info *fi; + gdb_assert (id.user_created_p); + gdb_assert (id.stack_status == frame_id_stack_status::FID_STACK_VALID); + gdb_assert (id.code_addr_p); - frame_debug_printf ("addr=%s, pc=%s", hex_string (addr), hex_string (pc)); + frame_debug_printf ("stack_addr=%s, core_addr=%s", + hex_string (id.stack_addr), hex_string (id.code_addr)); /* 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); + frame_info *fi = FRAME_OBSTACK_ZALLOC (struct frame_info); fi->next = create_sentinel_frame (current_program_space, get_current_regcache ()); @@ -1953,7 +1954,7 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc) Do this before looking for this frame's unwinder. A sniffer is very likely to read this, and the corresponding unwinder is entitled to rely that the PC doesn't magically change. */ - fi->next->prev_pc.value = pc; + fi->next->prev_pc.value = id.code_addr; fi->next->prev_pc.status = CC_VALUE; /* We currently assume that frame chain's can't cross spaces. */ @@ -1975,6 +1976,15 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc) return frame_info_ptr (fi); } +frame_info_ptr +create_new_frame (CORE_ADDR stack, CORE_ADDR pc) +{ + frame_id id = frame_id_build (stack, pc); + id.user_created_p = 1; + + return create_new_frame (id); +} + /* Return the frame that THIS_FRAME calls (NULL if THIS_FRAME is the innermost frame). Be careful to not fall off the bottom of the frame chain and onto the sentinel frame. */ |