* m32c-tdep.c (m32c_banked_register): New function.

(m32c_banked_read): Use m32c_banked_register function to evaluate
	real register number.
	(m32c_banked_write): Ditto.
	(m32c_virtual_frame_pointer): New function.
	(m32c_gdbarch_init): Add set_gdbarch_virtual_frame_pointer call.
This commit is contained in:
Corinna Vinschen 2006-07-13 12:01:21 +00:00
parent 5bf2ff2f3e
commit 7830cb4f50
2 changed files with 55 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2006-07-13 Corinna Vinschen <vinschen@redhat.com>
* m32c-tdep.c (m32c_banked_register): New function.
(m32c_banked_read): Use m32c_banked_register function to evaluate
real register number.
(m32c_banked_write): Ditto.
(m32c_virtual_frame_pointer): New function.
(m32c_gdbarch_init): Add set_gdbarch_virtual_frame_pointer call.
2006-07-13 Nathan Sidwell <nathan@codesourcery.com> 2006-07-13 Nathan Sidwell <nathan@codesourcery.com>
* m68k-tdep.c (m68k_frame_align): New. * m68k-tdep.c (m68k_frame_align): New.

View File

@ -340,6 +340,14 @@ m32c_read_flg (struct regcache *cache)
} }
/* Evaluate the real register number of a banked register. */
static struct m32c_reg *
m32c_banked_register (struct m32c_reg *reg, struct regcache *cache)
{
return ((m32c_read_flg (cache) & reg->n) ? reg->ry : reg->rx);
}
/* Move the value of a banked register from CACHE to BUF. /* Move the value of a banked register from CACHE to BUF.
If the value of the 'flg' register in CACHE has any of the bits If the value of the 'flg' register in CACHE has any of the bits
masked in REG->n set, then read REG->ry. Otherwise, read masked in REG->n set, then read REG->ry. Otherwise, read
@ -347,8 +355,7 @@ m32c_read_flg (struct regcache *cache)
static void static void
m32c_banked_read (struct m32c_reg *reg, struct regcache *cache, void *buf) m32c_banked_read (struct m32c_reg *reg, struct regcache *cache, void *buf)
{ {
struct m32c_reg *bank_reg struct m32c_reg *bank_reg = m32c_banked_register (reg, cache);
= ((m32c_read_flg (cache) & reg->n) ? reg->ry : reg->rx);
regcache_raw_read (cache, bank_reg->num, buf); regcache_raw_read (cache, bank_reg->num, buf);
} }
@ -360,8 +367,7 @@ m32c_banked_read (struct m32c_reg *reg, struct regcache *cache, void *buf)
static void static void
m32c_banked_write (struct m32c_reg *reg, struct regcache *cache, void *buf) m32c_banked_write (struct m32c_reg *reg, struct regcache *cache, void *buf)
{ {
struct m32c_reg *bank_reg struct m32c_reg *bank_reg = m32c_banked_register (reg, cache);
= ((m32c_read_flg (cache) & reg->n) ? reg->ry : reg->rx);
regcache_raw_write (cache, bank_reg->num, (const void *) buf); regcache_raw_write (cache, bank_reg->num, (const void *) buf);
} }
@ -2475,6 +2481,40 @@ m32c_m16c_pointer_to_address (struct type *type, const gdb_byte *buf)
return ptr; return ptr;
} }
void
m32c_virtual_frame_pointer (CORE_ADDR pc,
int *frame_regnum,
LONGEST *frame_offset)
{
char *name;
CORE_ADDR func_addr, func_end, sal_end;
struct m32c_prologue p;
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
if (!find_pc_partial_function (pc, &name, &func_addr, &func_end))
internal_error (__FILE__, __LINE__, _("No virtual frame pointer available"));
m32c_analyze_prologue (current_gdbarch, func_addr, pc, &p);
switch (p.kind)
{
case prologue_with_frame_ptr:
*frame_regnum = m32c_banked_register (tdep->fb, current_regcache)->num;
*frame_offset = p.frame_ptr_offset;
break;
case prologue_sans_frame_ptr:
*frame_regnum = m32c_banked_register (tdep->sp, current_regcache)->num;
*frame_offset = p.frame_size;
break;
default:
*frame_regnum = m32c_banked_register (tdep->sp, current_regcache)->num;
*frame_offset = 0;
break;
}
/* Sanity check */
if (*frame_regnum > NUM_REGS)
internal_error (__FILE__, __LINE__, _("No virtual frame pointer available"));
}
/* Initialization. */ /* Initialization. */
@ -2539,6 +2579,8 @@ m32c_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Trampolines. */ /* Trampolines. */
set_gdbarch_skip_trampoline_code (arch, m32c_skip_trampoline_code); set_gdbarch_skip_trampoline_code (arch, m32c_skip_trampoline_code);
set_gdbarch_virtual_frame_pointer (arch, m32c_virtual_frame_pointer);
return arch; return arch;
} }