2002-11-08 Andrew Cagney <ac131313@redhat.com>
* frame.c (set_unwind_by_pc): Use dummy_frame_register_unwind. * dummy-frame.c (find_dummy_frame): Rename generic_find_dummy_frame, make static. Return the dummy frame instead of the regcache. (generic_find_dummy_frame): Re-implement using find_dummy_frame, (cached_find_dummy_frame): New function. Use find_dummy_frame. (dummy_frame_register_unwind): Rename generic_call_dummy_register_unwind. Use cached_find_dummy_frame. * dummy-frame.h (dummy_frame_register_unwind): Rename generic_call_dummy_register_unwind.
This commit is contained in:
parent
34f5246900
commit
8779790c2e
4 changed files with 51 additions and 37 deletions
|
@ -1,3 +1,16 @@
|
||||||
|
2002-11-08 Andrew Cagney <ac131313@redhat.com>
|
||||||
|
|
||||||
|
* frame.c (set_unwind_by_pc): Use dummy_frame_register_unwind.
|
||||||
|
* dummy-frame.c (find_dummy_frame): Rename
|
||||||
|
generic_find_dummy_frame, make static. Return the dummy frame
|
||||||
|
instead of the regcache.
|
||||||
|
(generic_find_dummy_frame): Re-implement using find_dummy_frame,
|
||||||
|
(cached_find_dummy_frame): New function. Use find_dummy_frame.
|
||||||
|
(dummy_frame_register_unwind): Rename
|
||||||
|
generic_call_dummy_register_unwind. Use cached_find_dummy_frame.
|
||||||
|
* dummy-frame.h (dummy_frame_register_unwind): Rename
|
||||||
|
generic_call_dummy_register_unwind.
|
||||||
|
|
||||||
2002-11-08 Mark Kettenis <kettenis@gnu.org>
|
2002-11-08 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
* config/i386/tm-i386v42mp.h: Remove file. Move its contents,
|
* config/i386/tm-i386v42mp.h: Remove file. Move its contents,
|
||||||
|
|
|
@ -58,8 +58,8 @@ static struct dummy_frame *dummy_frame_stack = NULL;
|
||||||
adjust for DECR_PC_AFTER_BREAK. This is because it is only legal
|
adjust for DECR_PC_AFTER_BREAK. This is because it is only legal
|
||||||
to call this function after the PC has been adjusted. */
|
to call this function after the PC has been adjusted. */
|
||||||
|
|
||||||
struct regcache *
|
static struct dummy_frame *
|
||||||
generic_find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
|
find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
|
||||||
{
|
{
|
||||||
struct dummy_frame *dummyframe;
|
struct dummy_frame *dummyframe;
|
||||||
|
|
||||||
|
@ -94,10 +94,28 @@ generic_find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* The FP matches this dummy frame. */
|
/* The FP matches this dummy frame. */
|
||||||
return dummyframe->regcache;
|
return dummyframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dummy_frame *
|
||||||
|
cached_find_dummy_frame (struct frame_info *frame, void **cache)
|
||||||
|
{
|
||||||
|
if ((*cache) == NULL)
|
||||||
|
(*cache) = find_dummy_frame (frame->pc, frame->frame);
|
||||||
|
return (*cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct regcache *
|
||||||
|
generic_find_dummy_frame (CORE_ADDR pc, CORE_ADDR fp)
|
||||||
|
{
|
||||||
|
struct dummy_frame *dummy = find_dummy_frame (pc, fp);
|
||||||
|
if (dummy != NULL)
|
||||||
|
return dummy->regcache;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
|
@ -264,13 +282,13 @@ generic_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
|
||||||
register value is taken from the local copy of the register buffer. */
|
register value is taken from the local copy of the register buffer. */
|
||||||
|
|
||||||
void
|
void
|
||||||
generic_call_dummy_register_unwind (struct frame_info *frame, void **cache,
|
dummy_frame_register_unwind (struct frame_info *frame, void **cache,
|
||||||
int regnum, int *optimized,
|
int regnum, int *optimized,
|
||||||
enum lval_type *lvalp, CORE_ADDR *addrp,
|
enum lval_type *lvalp, CORE_ADDR *addrp,
|
||||||
int *realnum, void *bufferp)
|
int *realnum, void *bufferp)
|
||||||
{
|
{
|
||||||
gdb_assert (frame != NULL);
|
struct dummy_frame *dummy = cached_find_dummy_frame (frame, cache);
|
||||||
gdb_assert (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame));
|
gdb_assert (dummy != NULL);
|
||||||
|
|
||||||
/* Describe the register's location. Generic dummy frames always
|
/* Describe the register's location. Generic dummy frames always
|
||||||
have the register value in an ``expression''. */
|
have the register value in an ``expression''. */
|
||||||
|
@ -282,27 +300,11 @@ generic_call_dummy_register_unwind (struct frame_info *frame, void **cache,
|
||||||
/* If needed, find and return the value of the register. */
|
/* If needed, find and return the value of the register. */
|
||||||
if (bufferp != NULL)
|
if (bufferp != NULL)
|
||||||
{
|
{
|
||||||
struct regcache *registers;
|
|
||||||
#if 1
|
|
||||||
/* Get the address of the register buffer that contains all the
|
|
||||||
saved registers for this dummy frame. Cache that address. */
|
|
||||||
registers = (*cache);
|
|
||||||
if (registers == NULL)
|
|
||||||
{
|
|
||||||
registers = generic_find_dummy_frame (frame->pc, frame->frame);
|
|
||||||
(*cache) = registers;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* Get the address of the register buffer that contains the
|
|
||||||
saved registers and then extract the value from that. */
|
|
||||||
registers = generic_find_dummy_frame (frame->pc, frame->frame);
|
|
||||||
#endif
|
|
||||||
gdb_assert (registers != NULL);
|
|
||||||
/* Return the actual value. */
|
/* Return the actual value. */
|
||||||
/* Use the regcache_cooked_read() method so that it, on the fly,
|
/* Use the regcache_cooked_read() method so that it, on the fly,
|
||||||
constructs either a raw or pseudo register from the raw
|
constructs either a raw or pseudo register from the raw
|
||||||
register cache. */
|
register cache. */
|
||||||
regcache_cooked_read (registers, regnum, bufferp);
|
regcache_cooked_read (dummy->regcache, regnum, bufferp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,14 +45,14 @@ struct regcache;
|
||||||
/* Assuming that FRAME is a dummy, return a register value for the
|
/* Assuming that FRAME is a dummy, return a register value for the
|
||||||
previous frame. */
|
previous frame. */
|
||||||
|
|
||||||
extern void generic_call_dummy_register_unwind (struct frame_info *frame,
|
extern void dummy_frame_register_unwind (struct frame_info *frame,
|
||||||
void **unwind_cache,
|
void **unwind_cache,
|
||||||
int regnum,
|
int regnum,
|
||||||
int *optimized,
|
int *optimized,
|
||||||
enum lval_type *lvalp,
|
enum lval_type *lvalp,
|
||||||
CORE_ADDR *addrp,
|
CORE_ADDR *addrp,
|
||||||
int *realnump,
|
int *realnump,
|
||||||
void *valuep);
|
void *valuep);
|
||||||
|
|
||||||
/* Return the regcache that belongs to the dummy-frame identifed by PC
|
/* Return the regcache that belongs to the dummy-frame identifed by PC
|
||||||
and FP, or NULL if no such frame exists. */
|
and FP, or NULL if no such frame exists. */
|
||||||
|
@ -62,5 +62,4 @@ extern void generic_call_dummy_register_unwind (struct frame_info *frame,
|
||||||
|
|
||||||
extern struct regcache *generic_find_dummy_frame (CORE_ADDR pc,
|
extern struct regcache *generic_find_dummy_frame (CORE_ADDR pc,
|
||||||
CORE_ADDR fp);
|
CORE_ADDR fp);
|
||||||
|
|
||||||
#endif /* !defined (DUMMY_FRAME_H) */
|
#endif /* !defined (DUMMY_FRAME_H) */
|
||||||
|
|
|
@ -636,7 +636,7 @@ set_unwind_by_pc (CORE_ADDR pc, CORE_ADDR fp,
|
||||||
return vaguely correct values.. */
|
return vaguely correct values.. */
|
||||||
*unwind = frame_saved_regs_register_unwind;
|
*unwind = frame_saved_regs_register_unwind;
|
||||||
else if (PC_IN_CALL_DUMMY (pc, fp, fp))
|
else if (PC_IN_CALL_DUMMY (pc, fp, fp))
|
||||||
*unwind = generic_call_dummy_register_unwind;
|
*unwind = dummy_frame_register_unwind;
|
||||||
else
|
else
|
||||||
*unwind = frame_saved_regs_register_unwind;
|
*unwind = frame_saved_regs_register_unwind;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue