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:
Andrew Cagney 2003-06-08 22:10:12 +00:00
parent b9362cc7a8
commit 8983bd8343
4 changed files with 52 additions and 32 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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);