2003-03-30 Andrew Cagney <cagney@redhat.com>
* frame.c (get_frame_base): Force ID initialization. (get_prev_frame): Move computation of the frame ID from here ... (get_frame_id): ... to here. (legacy_get_prev_frame): Mark the frame ID as valid. * frame.h (struct frame_info): Add field "id_p".
This commit is contained in:
parent
97a1a11c19
commit
06c77151a5
3 changed files with 30 additions and 29 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2003-03-30 Andrew Cagney <cagney@redhat.com>
|
||||||
|
|
||||||
|
* frame.c (get_frame_base): Force ID initialization.
|
||||||
|
(get_prev_frame): Move computation of the frame ID from here ...
|
||||||
|
(get_frame_id): ... to here.
|
||||||
|
(legacy_get_prev_frame): Mark the frame ID as valid.
|
||||||
|
* frame.h (struct frame_info): Add field "id_p".
|
||||||
|
|
||||||
2003-03-30 Mark Kettenis <kettenis@gnu.org>
|
2003-03-30 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
* i386-tdep.c (i386_store_struct_return): Removed.
|
* i386-tdep.c (i386_store_struct_return): Removed.
|
||||||
|
|
50
gdb/frame.c
50
gdb/frame.c
|
@ -57,13 +57,19 @@ get_frame_id (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
return null_frame_id;
|
return null_frame_id;
|
||||||
}
|
}
|
||||||
else
|
if (!fi->id_p)
|
||||||
{
|
{
|
||||||
struct frame_id id;
|
gdb_assert (!legacy_frame_p (current_gdbarch));
|
||||||
id.base = fi->frame;
|
/* Find THIS frame's ID. */
|
||||||
id.pc = fi->pc;
|
fi->unwind->this_id (fi->next, &fi->prologue_cache, &fi->id);
|
||||||
return id;
|
fi->id_p = 1;
|
||||||
|
/* FIXME: cagney/2002-12-18: Instead of this hack, should only
|
||||||
|
store the frame ID in PREV_FRAME. Unfortunatly, some
|
||||||
|
architectures (HP/UX) still reply on EXTRA_FRAME_INFO and,
|
||||||
|
hence, still poke at the "struct frame_info" object directly. */
|
||||||
|
fi->frame = fi->id.base;
|
||||||
}
|
}
|
||||||
|
return frame_id_build (fi->frame, fi->pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct frame_id null_frame_id; /* All zeros. */
|
const struct frame_id null_frame_id; /* All zeros. */
|
||||||
|
@ -1038,6 +1044,9 @@ legacy_get_prev_frame (struct frame_info *this_frame)
|
||||||
problem. */
|
problem. */
|
||||||
prev->type = NORMAL_FRAME;
|
prev->type = NORMAL_FRAME;
|
||||||
|
|
||||||
|
/* A legacy frame's ID is always computed here. Mark it as valid. */
|
||||||
|
prev->id_p = 1;
|
||||||
|
|
||||||
/* Handle sentinel frame unwind as a special case. */
|
/* Handle sentinel frame unwind as a special case. */
|
||||||
if (this_frame->level < 0)
|
if (this_frame->level < 0)
|
||||||
{
|
{
|
||||||
|
@ -1546,24 +1555,7 @@ get_prev_frame (struct frame_info *this_frame)
|
||||||
prev_frame->unwind = frame_unwind_find_by_pc (current_gdbarch,
|
prev_frame->unwind = frame_unwind_find_by_pc (current_gdbarch,
|
||||||
prev_frame->pc);
|
prev_frame->pc);
|
||||||
|
|
||||||
/* Find the prev's frame's ID. */
|
/* The prev's frame's ID is computed by demand in get_frame_id(). */
|
||||||
|
|
||||||
/* The callee expects to be invoked with:
|
|
||||||
|
|
||||||
this->unwind->this_id (this->next, &this->cache, &this->id);
|
|
||||||
|
|
||||||
The below is carefully shifted one frame `to the left' so that
|
|
||||||
both the unwind->this_id and unwind->prev_register methods are
|
|
||||||
consistently invoked with NEXT_FRAME and THIS_PROLOGUE_CACHE.
|
|
||||||
|
|
||||||
Also note that, while the PC for this new previous frame was
|
|
||||||
unwound first (see above), the below is the first call that
|
|
||||||
[potentially] requires analysis of the new previous frame's
|
|
||||||
prologue. Consequently, it is this call, that typically ends up
|
|
||||||
initializing the previous frame's prologue cache. */
|
|
||||||
prev_frame->unwind->this_id (this_frame,
|
|
||||||
&prev_frame->prologue_cache,
|
|
||||||
&prev_frame->id);
|
|
||||||
|
|
||||||
/* The unwound frame ID is validate at the start of this function,
|
/* The unwound frame ID is validate at the start of this function,
|
||||||
as part of the logic to decide if that frame should be further
|
as part of the logic to decide if that frame should be further
|
||||||
|
@ -1577,12 +1569,6 @@ get_prev_frame (struct frame_info *this_frame)
|
||||||
return 0 (indicating we don't know the address of the arglist) if
|
return 0 (indicating we don't know the address of the arglist) if
|
||||||
we don't know what frame this frame calls. */
|
we don't know what frame this frame calls. */
|
||||||
|
|
||||||
/* FIXME: cagney/2002-12-18: Instead of this hack, should only store
|
|
||||||
the frame ID in PREV_FRAME. Unfortunatly, some architectures
|
|
||||||
(HP/UX) still reply on EXTRA_FRAME_INFO and, hence, still poke at
|
|
||||||
the "struct frame_info" object directly. */
|
|
||||||
prev_frame->frame = prev_frame->id.base;
|
|
||||||
|
|
||||||
/* Link it in. */
|
/* Link it in. */
|
||||||
this_frame->prev = prev_frame;
|
this_frame->prev = prev_frame;
|
||||||
prev_frame->next = this_frame;
|
prev_frame->next = this_frame;
|
||||||
|
@ -1624,6 +1610,12 @@ find_frame_sal (struct frame_info *frame, struct symtab_and_line *sal)
|
||||||
CORE_ADDR
|
CORE_ADDR
|
||||||
get_frame_base (struct frame_info *fi)
|
get_frame_base (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
|
if (!fi->id_p)
|
||||||
|
{
|
||||||
|
/* HACK: Force the ID code to (indirectly) initialize the
|
||||||
|
->frame pointer. */
|
||||||
|
get_frame_id (fi);
|
||||||
|
}
|
||||||
return fi->frame;
|
return fi->frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -411,6 +411,7 @@ struct frame_info
|
||||||
|
|
||||||
/* This frame's ID. Note that the frame's ID, base and PC contain
|
/* This frame's ID. Note that the frame's ID, base and PC contain
|
||||||
redundant information. */
|
redundant information. */
|
||||||
|
int id_p;
|
||||||
struct frame_id id;
|
struct frame_id id;
|
||||||
|
|
||||||
/* Pointers to the next (down, inner, younger) and previous (up,
|
/* Pointers to the next (down, inner, younger) and previous (up,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue