2003-01-16 Andrew Cagney <ac131313@redhat.com>
* frame.h (frame_id_unwind_ftype): Change type so that the frame's ID back using a parameter. * frame.c (frame_id_unwind): Update call. (frame_saved_regs_id_unwind): Update. * dummy-frame.c (dummy_frame_id_unwind): Update function. * dummy-frame.h (struct frame_id): Add opaque declaration. (dummy_frame_id_unwind): Update declaration.
This commit is contained in:
parent
e01f337c00
commit
c170fb600a
5 changed files with 41 additions and 22 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
2003-01-16 Andrew Cagney <ac131313@redhat.com>
|
||||||
|
|
||||||
|
* frame.h (frame_id_unwind_ftype): Change type so that the frame's
|
||||||
|
ID back using a parameter.
|
||||||
|
* frame.c (frame_id_unwind): Update call.
|
||||||
|
(frame_saved_regs_id_unwind): Update.
|
||||||
|
* dummy-frame.c (dummy_frame_id_unwind): Update function.
|
||||||
|
* dummy-frame.h (struct frame_id): Add opaque declaration.
|
||||||
|
(dummy_frame_id_unwind): Update declaration.
|
||||||
|
|
||||||
2003-01-15 Andrew Cagney <ac131313@redhat.com>
|
2003-01-15 Andrew Cagney <ac131313@redhat.com>
|
||||||
|
|
||||||
* sparc-tdep.c: Delete reference to PRINT_REGISTER_HOOK.
|
* sparc-tdep.c: Delete reference to PRINT_REGISTER_HOOK.
|
||||||
|
|
|
@ -345,16 +345,17 @@ dummy_frame_pc_unwind (struct frame_info *frame,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct frame_id
|
void
|
||||||
dummy_frame_id_unwind (struct frame_info *frame,
|
dummy_frame_id_unwind (struct frame_info *frame, void **cache,
|
||||||
void **cache)
|
struct frame_id *id)
|
||||||
{
|
{
|
||||||
struct dummy_frame *dummy = cached_find_dummy_frame (frame, cache);
|
struct dummy_frame *dummy = cached_find_dummy_frame (frame, cache);
|
||||||
/* Oops! In a dummy-frame but can't find the stack dummy. Pretend
|
/* Oops! In a dummy-frame but can't find the stack dummy. Pretend
|
||||||
that the frame doesn't unwind. Should this function instead
|
that the frame doesn't unwind. Should this function instead
|
||||||
return a has-no-caller indication? */
|
return a has-no-caller indication? */
|
||||||
if (dummy == NULL)
|
if (dummy == NULL)
|
||||||
return null_frame_id;
|
(*id) = null_frame_id;
|
||||||
return dummy->id;
|
else
|
||||||
|
(*id) = dummy->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
struct frame_info;
|
struct frame_info;
|
||||||
struct regcache;
|
struct regcache;
|
||||||
|
struct frame_id;
|
||||||
|
|
||||||
/* GENERIC DUMMY FRAMES
|
/* GENERIC DUMMY FRAMES
|
||||||
|
|
||||||
|
@ -63,8 +64,9 @@ extern CORE_ADDR dummy_frame_pc_unwind (struct frame_info *frame,
|
||||||
/* Assuming that FRAME is a dummy, return the ID of the calling frame
|
/* Assuming that FRAME is a dummy, return the ID of the calling frame
|
||||||
(the frame that the dummy has the saved state of). */
|
(the frame that the dummy has the saved state of). */
|
||||||
|
|
||||||
extern struct frame_id dummy_frame_id_unwind (struct frame_info *frame,
|
extern void dummy_frame_id_unwind (struct frame_info *frame,
|
||||||
void **unwind_cache);
|
void **unwind_cache,
|
||||||
|
struct frame_id *id);
|
||||||
|
|
||||||
/* Does the PC fall in a dummy frame?
|
/* Does the PC fall in a dummy frame?
|
||||||
|
|
||||||
|
|
31
gdb/frame.c
31
gdb/frame.c
|
@ -138,8 +138,7 @@ frame_id_unwind (struct frame_info *frame)
|
||||||
{
|
{
|
||||||
if (!frame->id_unwind_cache_p)
|
if (!frame->id_unwind_cache_p)
|
||||||
{
|
{
|
||||||
frame->id_unwind_cache =
|
frame->id_unwind (frame, &frame->unwind_cache, &frame->id_unwind_cache);
|
||||||
frame->id_unwind (frame, &frame->unwind_cache);
|
|
||||||
frame->id_unwind_cache_p = 1;
|
frame->id_unwind_cache_p = 1;
|
||||||
}
|
}
|
||||||
return frame->id_unwind_cache;
|
return frame->id_unwind_cache;
|
||||||
|
@ -655,11 +654,16 @@ frame_saved_regs_pc_unwind (struct frame_info *frame, void **cache)
|
||||||
return FRAME_SAVED_PC (frame);
|
return FRAME_SAVED_PC (frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct frame_id
|
static void
|
||||||
frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache)
|
frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache,
|
||||||
|
struct frame_id *id)
|
||||||
{
|
{
|
||||||
int fromleaf;
|
int fromleaf;
|
||||||
struct frame_id id;
|
CORE_ADDR base;
|
||||||
|
CORE_ADDR pc;
|
||||||
|
|
||||||
|
/* Start out by assuming it's NULL. */
|
||||||
|
(*id) = null_frame_id;
|
||||||
|
|
||||||
if (next_frame->next == NULL)
|
if (next_frame->next == NULL)
|
||||||
/* FIXME: 2002-11-09: Frameless functions can occure anywhere in
|
/* FIXME: 2002-11-09: Frameless functions can occure anywhere in
|
||||||
|
@ -677,7 +681,7 @@ frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache)
|
||||||
/* FIXME: 2002-11-09: There isn't any reason to special case this
|
/* FIXME: 2002-11-09: There isn't any reason to special case this
|
||||||
edge condition. Instead the per-architecture code should hande
|
edge condition. Instead the per-architecture code should hande
|
||||||
it locally. */
|
it locally. */
|
||||||
id.base = get_frame_base (next_frame);
|
base = get_frame_base (next_frame);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Two macros defined in tm.h specify the machine-dependent
|
/* Two macros defined in tm.h specify the machine-dependent
|
||||||
|
@ -695,18 +699,19 @@ frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache)
|
||||||
this to after the ffi test; I'd rather have backtraces from
|
this to after the ffi test; I'd rather have backtraces from
|
||||||
start go curfluy than have an abort called from main not show
|
start go curfluy than have an abort called from main not show
|
||||||
main. */
|
main. */
|
||||||
id.base = FRAME_CHAIN (next_frame);
|
base = FRAME_CHAIN (next_frame);
|
||||||
|
|
||||||
if (!frame_chain_valid (id.base, next_frame))
|
if (!frame_chain_valid (base, next_frame))
|
||||||
return null_frame_id;
|
return;
|
||||||
}
|
}
|
||||||
if (id.base == 0)
|
if (base == 0)
|
||||||
return null_frame_id;
|
return;
|
||||||
|
|
||||||
/* FIXME: cagney/2002-06-08: This should probably return the frame's
|
/* FIXME: cagney/2002-06-08: This should probably return the frame's
|
||||||
function and not the PC (a.k.a. resume address). */
|
function and not the PC (a.k.a. resume address). */
|
||||||
id.pc = frame_pc_unwind (next_frame);
|
pc = frame_pc_unwind (next_frame);
|
||||||
return id;
|
id->pc = pc;
|
||||||
|
id->base = base;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function: get_saved_register
|
/* Function: get_saved_register
|
||||||
|
|
|
@ -335,8 +335,9 @@ typedef CORE_ADDR (frame_pc_unwind_ftype) (struct frame_info *frame,
|
||||||
/* Same as for registers above, but return the ID of the frame that
|
/* Same as for registers above, but return the ID of the frame that
|
||||||
called this one. */
|
called this one. */
|
||||||
|
|
||||||
typedef struct frame_id (frame_id_unwind_ftype) (struct frame_info *frame,
|
typedef void (frame_id_unwind_ftype) (struct frame_info *frame,
|
||||||
void **unwind_cache);
|
void **unwind_cache,
|
||||||
|
struct frame_id *id);
|
||||||
|
|
||||||
/* Describe the saved registers of a frame. */
|
/* Describe the saved registers of a frame. */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue