2003-06-16 Andrew Cagney <cagney@redhat.com>

* frame.h (deprecated_get_next_frame_hack): Declare.
	* frame.c (legacy_saved_regs_prev_register): Only require
	DEPRECATED_FRAME_INIT_SAVED_REGS when it is needed.  Assert that
	there are always saved regs.
	(deprecated_generic_get_saved_register): Do not require
	DEPRECATED_FRAME_INIT_SAVED_REGS.
	(legacy_get_prev_frame): Do not require DEPRECATED_FRAME_CHAIN,
	use frame ID unwind instead.
	(deprecated_get_next_frame_hack): New function.
This commit is contained in:
Andrew Cagney 2003-06-16 20:05:56 +00:00
parent 63d47a7dcc
commit 870b3035a4
3 changed files with 68 additions and 14 deletions

View file

@ -1,3 +1,15 @@
2003-06-16 Andrew Cagney <cagney@redhat.com>
* frame.h (deprecated_get_next_frame_hack): Declare.
* frame.c (legacy_saved_regs_prev_register): Only require
DEPRECATED_FRAME_INIT_SAVED_REGS when it is needed. Assert that
there are always saved regs.
(deprecated_generic_get_saved_register): Do not require
DEPRECATED_FRAME_INIT_SAVED_REGS.
(legacy_get_prev_frame): Do not require DEPRECATED_FRAME_CHAIN,
use frame ID unwind instead.
(deprecated_get_next_frame_hack): New function.
2003-06-16 Corinna Vinschen <vinschen@redhat.com>
* h8300-tdep.c (h8300_push_arguments): Remove. Substitute by...

View file

@ -993,14 +993,13 @@ legacy_saved_regs_prev_register (struct frame_info *next_frame,
struct frame_info *frame = next_frame->prev;
gdb_assert (frame != NULL);
/* Only (older) architectures that implement the
DEPRECATED_FRAME_INIT_SAVED_REGS method should be using this
function. */
gdb_assert (DEPRECATED_FRAME_INIT_SAVED_REGS_P ());
/* Load the saved_regs register cache. */
if (get_frame_saved_regs (frame) == NULL)
DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
{
/* If nothing's initialized the saved regs, do it now. */
gdb_assert (DEPRECATED_FRAME_INIT_SAVED_REGS_P ());
DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
gdb_assert (get_frame_saved_regs (frame) != NULL);
}
if (get_frame_saved_regs (frame) != NULL
&& get_frame_saved_regs (frame)[regnum] != 0)
@ -1112,8 +1111,6 @@ deprecated_generic_get_saved_register (char *raw_buffer, int *optimized,
if (!target_has_registers)
error ("No registers.");
gdb_assert (DEPRECATED_FRAME_INIT_SAVED_REGS_P ());
/* Normal systems don't optimize out things with register numbers. */
if (optimized != NULL)
*optimized = 0;
@ -1267,6 +1264,12 @@ get_next_frame (struct frame_info *this_frame)
return NULL;
}
struct frame_info *
deprecated_get_next_frame_hack (struct frame_info *this_frame)
{
return this_frame->next;
}
/* Flush the entire frame cache. */
void
@ -1501,6 +1504,12 @@ legacy_get_prev_frame (struct frame_info *this_frame)
/* FIXME: 2002-11-09: There isn't any reason to special case this
edge condition. Instead the per-architecture code should hande
it locally. */
/* FIXME: cagney/2003-06-16: This returns the inner most stack
address for the previous frame, that, however, is wrong. It
should be the inner most stack address for the previous to
previous frame. This is because it is the previous to previous
frame's innermost stack address that is constant through out
the lifetime of the previous frame (trust me :-). */
address = get_frame_base (this_frame);
else
{
@ -1519,8 +1528,29 @@ legacy_get_prev_frame (struct frame_info *this_frame)
this to after the ffi test; I'd rather have backtraces from
start go curfluy than have an abort called from main not show
main. */
gdb_assert (DEPRECATED_FRAME_CHAIN_P ());
address = DEPRECATED_FRAME_CHAIN (this_frame);
if (DEPRECATED_FRAME_CHAIN_P ())
address = DEPRECATED_FRAME_CHAIN (this_frame);
else
{
/* Someone is part way through coverting an old architecture
to the new frame code. Implement FRAME_CHAIN the way the
new frame will. */
/* Find PREV frame's unwinder. */
prev->unwind = frame_unwind_find_by_pc (current_gdbarch,
frame_pc_unwind (this_frame));
/* FIXME: cagney/2003-04-02: Rather than storing the frame's
type in the frame, the unwinder's type should be returned
directly. Unfortunatly, legacy code, called by
legacy_get_prev_frame, explicitly set the frames type
using the method deprecated_set_frame_type(). */
prev->type = prev->unwind->type;
/* Find PREV frame's ID. */
prev->unwind->this_id (this_frame,
&prev->prologue_cache,
&prev->this_id.value);
prev->this_id.p = 1;
address = prev->this_id.value.stack_addr;
}
if (!legacy_frame_chain_valid (address, this_frame))
{
@ -1663,9 +1693,13 @@ legacy_get_prev_frame (struct frame_info *this_frame)
/* Initialize the code used to unwind the frame PREV based on the PC
(and probably other architectural information). The PC lets you
check things like the debug info at that point (dwarf2cfi?) and
use that to decide how the frame should be unwound. */
prev->unwind = frame_unwind_find_by_pc (current_gdbarch,
get_frame_pc (prev));
use that to decide how the frame should be unwound.
If there isn't a FRAME_CHAIN, the code above will have already
done this. */
if (prev->unwind == NULL)
prev->unwind = frame_unwind_find_by_pc (current_gdbarch,
get_frame_pc (prev));
/* If the unwinder provides a frame type, use it. Otherwize
continue on to that heuristic mess. */
@ -1673,6 +1707,7 @@ legacy_get_prev_frame (struct frame_info *this_frame)
{
prev->type = prev->unwind->type;
if (prev->type == NORMAL_FRAME)
/* FIXME: cagney/2003-06-16: would get_frame_pc() be better? */
prev->this_id.value.code_addr
= get_pc_function_start (prev->this_id.value.code_addr);
if (frame_debug)

View file

@ -154,6 +154,13 @@ extern void select_frame (struct frame_info *);
extern struct frame_info *get_prev_frame (struct frame_info *);
extern struct frame_info *get_next_frame (struct frame_info *);
/* Given a FRAME, return the true next (more inner, younger) frame.
This one exposes the sentinel frame and, hence, never returns NULL.
It is here strictly to help old targets in their migration path to
the new frame code - the new code requires the NEXT, and not THIS
frame. */
extern struct frame_info *deprecated_get_next_frame_hack (struct frame_info *);
/* Given a frame's ID, relocate the frame. Returns NULL if the frame
is not found. */
extern struct frame_info *frame_find_by_id (struct frame_id id);