From c170fb600a47a28398a8dff22587f59fa5d2d37a Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Thu, 16 Jan 2003 16:54:57 +0000 Subject: [PATCH] 2003-01-16 Andrew Cagney * 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. --- gdb/ChangeLog | 10 ++++++++++ gdb/dummy-frame.c | 11 ++++++----- gdb/dummy-frame.h | 6 ++++-- gdb/frame.c | 31 ++++++++++++++++++------------- gdb/frame.h | 5 +++-- 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b16899b3c2..769ca4cab6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2003-01-16 Andrew Cagney + + * 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 * sparc-tdep.c: Delete reference to PRINT_REGISTER_HOOK. diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c index fab10c08e0..99d388df92 100644 --- a/gdb/dummy-frame.c +++ b/gdb/dummy-frame.c @@ -345,16 +345,17 @@ dummy_frame_pc_unwind (struct frame_info *frame, } -struct frame_id -dummy_frame_id_unwind (struct frame_info *frame, - void **cache) +void +dummy_frame_id_unwind (struct frame_info *frame, void **cache, + struct frame_id *id) { struct dummy_frame *dummy = cached_find_dummy_frame (frame, cache); /* Oops! In a dummy-frame but can't find the stack dummy. Pretend that the frame doesn't unwind. Should this function instead return a has-no-caller indication? */ if (dummy == NULL) - return null_frame_id; - return dummy->id; + (*id) = null_frame_id; + else + (*id) = dummy->id; } diff --git a/gdb/dummy-frame.h b/gdb/dummy-frame.h index cfa2709142..746e663ee0 100644 --- a/gdb/dummy-frame.h +++ b/gdb/dummy-frame.h @@ -24,6 +24,7 @@ struct frame_info; struct regcache; +struct frame_id; /* 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 (the frame that the dummy has the saved state of). */ -extern struct frame_id dummy_frame_id_unwind (struct frame_info *frame, - void **unwind_cache); +extern void dummy_frame_id_unwind (struct frame_info *frame, + void **unwind_cache, + struct frame_id *id); /* Does the PC fall in a dummy frame? diff --git a/gdb/frame.c b/gdb/frame.c index 503cfa7b35..78811e4b95 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -138,8 +138,7 @@ frame_id_unwind (struct frame_info *frame) { if (!frame->id_unwind_cache_p) { - frame->id_unwind_cache = - frame->id_unwind (frame, &frame->unwind_cache); + frame->id_unwind (frame, &frame->unwind_cache, &frame->id_unwind_cache); frame->id_unwind_cache_p = 1; } 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); } -static struct frame_id -frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache) +static void +frame_saved_regs_id_unwind (struct frame_info *next_frame, void **cache, + struct frame_id *id) { 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) /* 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 edge condition. Instead the per-architecture code should hande it locally. */ - id.base = get_frame_base (next_frame); + base = get_frame_base (next_frame); else { /* 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 start go curfluy than have an abort called from main not show main. */ - id.base = FRAME_CHAIN (next_frame); + base = FRAME_CHAIN (next_frame); - if (!frame_chain_valid (id.base, next_frame)) - return null_frame_id; + if (!frame_chain_valid (base, next_frame)) + return; } - if (id.base == 0) - return null_frame_id; + if (base == 0) + return; /* FIXME: cagney/2002-06-08: This should probably return the frame's function and not the PC (a.k.a. resume address). */ - id.pc = frame_pc_unwind (next_frame); - return id; + pc = frame_pc_unwind (next_frame); + id->pc = pc; + id->base = base; } /* Function: get_saved_register diff --git a/gdb/frame.h b/gdb/frame.h index 04dee94e68..09df2b8109 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -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 called this one. */ -typedef struct frame_id (frame_id_unwind_ftype) (struct frame_info *frame, - void **unwind_cache); +typedef void (frame_id_unwind_ftype) (struct frame_info *frame, + void **unwind_cache, + struct frame_id *id); /* Describe the saved registers of a frame. */