2003-06-08 Andrew Cagney <cagney@redhat.com>
* trad-frame.h (struct trad_frame_saved_reg): Rename "struct trad_frame". Update comments. * d10v-tdep.c (struct d10v_unwind_cache): Update. * trad-frame.c (trad_frame_alloc_saved_regs): Update. (trad_frame_register_value, trad_frame_prev_register): Update.
This commit is contained in:
parent
b9362cc7a8
commit
8983bd8343
4 changed files with 52 additions and 32 deletions
|
@ -1,3 +1,11 @@
|
|||
2003-06-08 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* trad-frame.h (struct trad_frame_saved_reg): Rename "struct
|
||||
trad_frame". Update comments.
|
||||
* d10v-tdep.c (struct d10v_unwind_cache): Update.
|
||||
* trad-frame.c (trad_frame_alloc_saved_regs): Update.
|
||||
(trad_frame_register_value, trad_frame_prev_register): Update.
|
||||
|
||||
2003-06-08 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* acinclude.m4 (gcc_AC_CHECK_DECL, (gcc_AC_CHECK_DECL): Stolen
|
||||
|
|
|
@ -577,7 +577,7 @@ struct d10v_unwind_cache
|
|||
LONGEST r11_offset;
|
||||
int uses_frame;
|
||||
/* Table indicating the location of each and every register. */
|
||||
struct trad_frame *saved_regs;
|
||||
struct trad_frame_saved_reg *saved_regs;
|
||||
};
|
||||
|
||||
static int
|
||||
|
|
|
@ -29,41 +29,41 @@
|
|||
non-optimized frames, the technique is reliable (just need to check
|
||||
for all potential instruction sequences). */
|
||||
|
||||
struct trad_frame *
|
||||
struct trad_frame_saved_reg *
|
||||
trad_frame_alloc_saved_regs (struct frame_info *next_frame)
|
||||
{
|
||||
int i;
|
||||
int regnum;
|
||||
struct gdbarch *gdbarch = get_frame_arch (next_frame);
|
||||
int numregs = NUM_REGS + NUM_PSEUDO_REGS;
|
||||
struct trad_frame *this_saved_regs
|
||||
= FRAME_OBSTACK_CALLOC (numregs, struct trad_frame);
|
||||
for (i = 0; i < numregs; i++)
|
||||
this_saved_regs[i].regnum = i;
|
||||
struct trad_frame_saved_reg *this_saved_regs
|
||||
= FRAME_OBSTACK_CALLOC (numregs, struct trad_frame_saved_reg);
|
||||
for (regnum = 0; regnum < numregs; regnum++)
|
||||
this_saved_regs[regnum].realnum = regnum;
|
||||
return this_saved_regs;
|
||||
}
|
||||
|
||||
void
|
||||
trad_frame_register_value (struct trad_frame this_saved_regs[],
|
||||
trad_frame_register_value (struct trad_frame_saved_reg this_saved_regs[],
|
||||
int regnum, LONGEST val)
|
||||
{
|
||||
/* Make the REGNUM invalid, indicating that the ADDR contains the
|
||||
/* Make the REALNUM invalid, indicating that the ADDR contains the
|
||||
register's value. */
|
||||
this_saved_regs[regnum].regnum = -1;
|
||||
this_saved_regs[regnum].realnum = -1;
|
||||
this_saved_regs[regnum].addr = val;
|
||||
}
|
||||
|
||||
void
|
||||
trad_frame_prev_register (struct frame_info *next_frame,
|
||||
struct trad_frame this_saved_regs[],
|
||||
struct trad_frame_saved_reg this_saved_regs[],
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp, CORE_ADDR *addrp,
|
||||
int *realnump, void *bufferp)
|
||||
{
|
||||
struct gdbarch *gdbarch = get_frame_arch (next_frame);
|
||||
if (this_saved_regs[regnum].regnum >= 0
|
||||
if (this_saved_regs[regnum].realnum >= 0
|
||||
&& this_saved_regs[regnum].addr != 0)
|
||||
{
|
||||
/* The register was saved on the stack, fetch it. */
|
||||
/* The register was saved in memory. */
|
||||
*optimizedp = 0;
|
||||
*lvalp = lval_memory;
|
||||
*addrp = this_saved_regs[regnum].addr;
|
||||
|
@ -75,11 +75,11 @@ trad_frame_prev_register (struct frame_info *next_frame,
|
|||
register_size (gdbarch, regnum));
|
||||
}
|
||||
}
|
||||
else if (this_saved_regs[regnum].regnum >= 0
|
||||
else if (this_saved_regs[regnum].realnum >= 0
|
||||
&& this_saved_regs[regnum].addr == 0)
|
||||
{
|
||||
/* As the next frame to return the value of the register. */
|
||||
frame_register_unwind (next_frame, this_saved_regs[regnum].regnum,
|
||||
frame_register_unwind (next_frame, this_saved_regs[regnum].realnum,
|
||||
optimizedp, lvalp, addrp, realnump, bufferp);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -22,33 +22,45 @@
|
|||
#ifndef TRAD_FRAME_H
|
||||
#define TRAD_FRAME_H
|
||||
|
||||
struct trad_frame
|
||||
/* A traditional saved regs table, indexed by REGNUM, encoding where
|
||||
the value of REGNUM for the previous frame can be found in this
|
||||
frame.
|
||||
|
||||
The table is initialized with an identity encoding (ADDR == 0,
|
||||
REALNUM == REGNUM) indicating that the value of REGNUM in the
|
||||
previous frame can be found in register REGNUM (== REALNUM) in this
|
||||
frame.
|
||||
|
||||
The initial encoding can then be changed:
|
||||
|
||||
Modify ADDR (REALNUM >= 0, ADDR != 0) to indicate that the value of
|
||||
register REGNUM in the previous frame can be found in memory at
|
||||
ADDR in this frame.
|
||||
|
||||
Modify REALNUM (REALNUM >= 0, ADDR == 0) to indicate that the value
|
||||
of register REGNUM in the previous frame is found in register
|
||||
REALNUM in this frame.
|
||||
|
||||
Call trad_frame_register_value (REALNUM < 0) to indicate that the
|
||||
value of register REGNUM in the previous frame is found in ADDR. */
|
||||
|
||||
struct trad_frame_saved_reg
|
||||
{
|
||||
/* If non-zero (and regnum >= 0), the stack address at which the
|
||||
register is saved. By default, it is assumed that the register
|
||||
was not saved (addr == 0). Remember, a LONGEST can always fit a
|
||||
CORE_ADDR. */
|
||||
LONGEST addr;
|
||||
/* else, if regnum >=0 (and addr == 0), the REGNUM that contains
|
||||
this registers value. By default, it is assumed that the
|
||||
registers are not moved (the register's value is still in that
|
||||
register and regnum == the index). */
|
||||
int regnum;
|
||||
/* else, if regnum < 0, ADDR is the registers value. */
|
||||
LONGEST addr; /* A CORE_ADDR fits in a longest. */
|
||||
int realnum;
|
||||
};
|
||||
|
||||
/* Convenience function, encode the register's value in the
|
||||
trad-frame. */
|
||||
void trad_frame_register_value (struct trad_frame this_saved_regs[],
|
||||
/* Convenience function, encode REGNUM's location in the trad-frame. */
|
||||
void trad_frame_register_value (struct trad_frame_saved_reg this_saved_regs[],
|
||||
int regnum, LONGEST val);
|
||||
|
||||
/* Return a freshly allocated (and initialized) trad_frame array. */
|
||||
struct trad_frame *trad_frame_alloc_saved_regs (struct frame_info *next_frame);
|
||||
struct trad_frame_saved_reg *trad_frame_alloc_saved_regs (struct frame_info *next_frame);
|
||||
|
||||
/* Given the trad_frame info, return the location of the specified
|
||||
register. */
|
||||
void trad_frame_prev_register (struct frame_info *next_frame,
|
||||
struct trad_frame this_saved_regs[],
|
||||
struct trad_frame_saved_reg this_saved_regs[],
|
||||
int regnum, int *optimizedp,
|
||||
enum lval_type *lvalp, CORE_ADDR *addrp,
|
||||
int *realnump, void *bufferp);
|
||||
|
|
Loading…
Add table
Reference in a new issue