/* Code dealing with dummy stack frames, for GDB, the GNU debugger.
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software
- Foundation, Inc.
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
+ Software Foundation, Inc.
This file is part of GDB.
void **this_prologue_cache,
struct frame_id *this_id);
+static int pc_in_dummy_frame (CORE_ADDR pc);
+
/* Dummy frame. This saves the processor state just prior to setting
up the inferior function call. Older targets save the registers
on the target stack (but that really slows down function calls). */
FP against the saved SP and FP. NOTE: If you're trying
to fix a problem with GDB not correctly finding a dummy
frame, check the comments that go with FRAME_ALIGN() and
- SAVE_DUMMY_FRAME_TOS(). */
+ UNWIND_DUMMY_ID(). */
if (fp != dummyframe->fp && fp != dummyframe->sp)
continue;
}
return NULL;
}
-struct regcache *
+static struct regcache *
deprecated_find_dummy_frame_regcache (CORE_ADDR pc, CORE_ADDR fp)
{
struct dummy_frame *dummy = find_dummy_frame (pc, fp);
return deprecated_grub_regcache_for_registers (regcache);
}
-/* Function: pc_in_call_dummy (pc, sp, fp)
+/* Function: pc_in_call_dummy (pc)
Return true if the PC falls in a dummy frame created by gdb for an
inferior call. The code below which allows DECR_PC_AFTER_BREAK is
subtracted out. */
int
-generic_pc_in_call_dummy (CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR fp)
+deprecated_pc_in_call_dummy (CORE_ADDR pc)
{
return pc_in_dummy_frame (pc);
}
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
- !DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET_P yet generic dummy
- targets set DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET. True?). */
+ calling this function. */
-int
+static int
pc_in_dummy_frame (CORE_ADDR pc)
{
struct dummy_frame *dummyframe;
dummy_frame_stack->call_hi = hi;
}
-/* Restore the machine state from either the saved dummy stack or a
- real stack frame. */
-
-void
-generic_pop_current_frame (void (*popper) (struct frame_info * frame))
-{
- struct frame_info *frame = get_current_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);
-}
-
/* Discard the innermost dummy frame from the dummy frame stack
(passed in as a parameter). */
}
void
-generic_pop_dummy_frame (void)
+deprecated_pop_dummy_frame (void)
{
struct dummy_frame *dummy_frame = dummy_frame_stack;
determine the dummy frame's ID. */
(*this_id) = gdbarch_unwind_dummy_id (current_gdbarch, next_frame);
}
- else if (frame_relative_level (next_frame) < 0)
+ else if (get_frame_type (next_frame) == SENTINEL_FRAME)
{
/* We're unwinding a sentinel frame, the PC of which is pointing
at a stack dummy. Fake up the dummy frame's ID using the
}
else
{
- /* Outch! We're not trying to find the innermost frame's ID yet
+ /* Ouch! We're not trying to find the innermost frame's ID yet
we're trying to unwind to a dummy. The architecture must
provide the unwind_dummy_id() method. Abandon the unwind
process but only after first warning the user. */
};
const struct frame_unwind *
-dummy_frame_p (CORE_ADDR pc)
+dummy_frame_sniffer (struct frame_info *next_frame)
{
- if (DEPRECATED_PC_IN_CALL_DUMMY_P ()
- ? DEPRECATED_PC_IN_CALL_DUMMY (pc, 0, 0)
- : pc_in_dummy_frame (pc))
+ CORE_ADDR pc = frame_pc_unwind (next_frame);
+ if (pc_in_dummy_frame (pc))
return &dummy_frame_unwind;
else
return NULL;