2002-11-24 Andrew Cagney <ac131313@redhat.com>

* dummy-frame.c (pc_in_dummy_frame): New function.
	(generic_pc_in_call_dummy): Call pc_in_dummy_frame.
	(find_dummy_frame): Update comment.
	(generic_pop_current_frame): Use get_frame_type.
	* dummy-frame.h (pc_in_dummy_frame): Declare.
	* frame.c (set_unwind_by_pc): Use pc_in_dummy_frame.
	(create_new_frame): Use pc_in_dummy_frame.
	(get_prev_frame): Use pc_in_dummy_frame.
	(frame_saved_regs_register_unwind): Use get_prev_frame.
	(deprecated_generic_get_saved_register): Use get_prev_frame.
This commit is contained in:
Andrew Cagney 2002-11-24 15:06:08 +00:00
parent 7d8547c960
commit 5e0f933e90
4 changed files with 65 additions and 8 deletions

View File

@ -1,3 +1,16 @@
2002-11-24 Andrew Cagney <ac131313@redhat.com>
* dummy-frame.c (pc_in_dummy_frame): New function.
(generic_pc_in_call_dummy): Call pc_in_dummy_frame.
(find_dummy_frame): Update comment.
(generic_pop_current_frame): Use get_frame_type.
* dummy-frame.h (pc_in_dummy_frame): Declare.
* frame.c (set_unwind_by_pc): Use pc_in_dummy_frame.
(create_new_frame): Use pc_in_dummy_frame.
(get_prev_frame): Use pc_in_dummy_frame.
(frame_saved_regs_register_unwind): Use get_prev_frame.
(deprecated_generic_get_saved_register): Use get_prev_frame.
2002-11-23 Andrew Cagney <ac131313@redhat.com>
* blockframe.c (find_frame_addr_in_frame_chain): Move function

View File

@ -56,7 +56,7 @@ static struct dummy_frame *dummy_frame_stack = NULL;
/* Function: find_dummy_frame(pc, fp, sp)
Search the stack of dummy frames for one matching the given PC and
FP/SP. Unlike PC_IN_CALL_DUMMY, this function doesn't need to
FP/SP. Unlike pc_in_dummy_frame(), this function doesn't need to
adjust for DECR_PC_AFTER_BREAK. This is because it is only legal
to call this function after the PC has been adjusted. */
@ -138,6 +138,24 @@ deprecated_generic_find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
int
generic_pc_in_call_dummy (CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR fp)
{
return pc_in_dummy_frame (pc);
}
/* Return non-zero if the PC falls in a dummy frame.
The code below which allows DECR_PC_AFTER_BREAK is for infrun.c,
which may give the function a PC without that subtracted out.
FIXME: cagney/2002-11-23: This is silly. Surely "infrun.c" can
figure out what the real PC (as in the resume address) is BEFORE
calling this function (Oh, and I'm not even sure that this function
is called with an decremented PC, the call to pc_in_call_dummy() in
that file is conditional on !CALL_DUMMY_BREAKPOINT_OFFSET_P yet
generic dummy targets set CALL_DUMMY_BREAKPOINT_OFFSET. True?). */
int
pc_in_dummy_frame (CORE_ADDR pc)
{
struct dummy_frame *dummyframe;
for (dummyframe = dummy_frame_stack;
@ -241,8 +259,9 @@ void
generic_pop_current_frame (void (*popper) (struct frame_info * frame))
{
struct frame_info *frame = get_current_frame ();
if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
if (get_frame_type (frame) == DUMMY_FRAME)
/* NOTE: cagney/2002-22-23: Does this ever occure? Surely a dummy
frame will have already been poped by the "infrun.c" code. */
generic_pop_dummy_frame ();
else
(*popper) (frame);

View File

@ -60,6 +60,31 @@ extern void dummy_frame_register_unwind (struct frame_info *frame,
extern CORE_ADDR dummy_frame_pc_unwind (struct frame_info *frame,
void **unwind_cache);
/* Does the PC fall in a dummy frame?
This function is used by "frame.c" when creating a new `struct
frame_info'.
Note that there is also very similar code in breakpoint.c (where
the bpstat stop reason is computed). It is looking for a PC
falling on a dummy_frame breakpoint. Perhaphs this, and that code
should be combined?
Architecture dependant code, that has access to a frame, should not
use this function. Instead (get_frame_type() == DUMMY_FRAME)
should be used.
Hmm, but what about threads? When the dummy-frame code tries to
relocate a dummy frame's saved registers it definitly needs to
differentiate between threads (otherwize it will do things like
clean-up the wrong threads frames). However, when just trying to
identify a dummy-frame that shouldn't matter. The wost that can
happen is that a thread is marked as sitting in a dummy frame when,
in reality, its corrupted its stack, to the point that a PC is
pointing into a dummy frame. */
extern int pc_in_dummy_frame (CORE_ADDR pc);
/* Return the regcache that belongs to the dummy-frame identifed by PC
and FP, or NULL if no such frame exists. */
/* FIXME: cagney/2002-11-08: The function only exists because of

View File

@ -457,7 +457,7 @@ frame_saved_regs_register_unwind (struct frame_info *frame, void **cache,
dummy. (generic_call_dummy_register_unwind ought to have been called
instead.) */
gdb_assert (!(USE_GENERIC_DUMMY_FRAMES
&& PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame)));
&& (get_frame_type (frame) == DUMMY_FRAME)));
/* Load the saved_regs register cache. */
if (frame->saved_regs == NULL)
@ -588,7 +588,7 @@ deprecated_generic_get_saved_register (char *raw_buffer, int *optimized,
while (frame && ((frame = frame->next) != NULL))
{
if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
if (get_frame_type (frame) == DUMMY_FRAME)
{
if (lval) /* found it in a CALL_DUMMY frame */
*lval = not_lval;
@ -656,7 +656,7 @@ set_unwind_by_pc (CORE_ADDR pc, CORE_ADDR fp,
*unwind_register = frame_saved_regs_register_unwind;
*unwind_pc = frame_saved_regs_pc_unwind;
}
else if (PC_IN_CALL_DUMMY (pc, fp, fp))
else if (pc_in_dummy_frame (pc))
{
*unwind_register = dummy_frame_register_unwind;
*unwind_pc = dummy_frame_pc_unwind;
@ -694,7 +694,7 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc)
has previously set it. This is really somewhat bogus. The
initialization, as seen in create_new_frame(), should occur
before the INIT function has been called. */
if (USE_GENERIC_DUMMY_FRAMES && PC_IN_CALL_DUMMY (fi->pc, 0, 0))
if (USE_GENERIC_DUMMY_FRAMES && pc_in_dummy_frame (pc))
/* NOTE: cagney/2002-11-11: Does this even occure? */
type = DUMMY_FRAME;
else
@ -976,7 +976,7 @@ get_prev_frame (struct frame_info *next_frame)
initialization, as seen in create_new_frame(), should occur
before the INIT function has been called. */
if (USE_GENERIC_DUMMY_FRAMES
&& PC_IN_CALL_DUMMY (prev->pc, 0, 0))
&& pc_in_dummy_frame (prev->pc))
prev->type = DUMMY_FRAME;
else
{