register_offset_hack() vs REGISTER_BYTE()
Andrew Cagney
ac131313@redhat.com
Fri May 2 00:58:00 GMT 2003
> I'm seeing the following internal error:
>
> .../frame.c:591: internal-error: Failed to compute the register number
> corresponding to 0x296
>
> This is happening because the *addrp value in the following loop (which
> is in frame_register() in frame.c)...
>
> for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
> {
> if (*addrp == register_offset_hack (current_gdbarch, regnum))
> {
> *realnump = regnum;
> return;
> }
> }
>
> ...is set using a value obtained from REGISTER_BYTE(). (See
> sentinel_frame_prev_register in sentinel-frame.c.) But the
> value obtained from register_offset_hack() was computed by using the
> register's virtual type.
Er, for a legacy architecture, register_offset_hack(i) (aka
current_regcache->descr->register_offset) should be REGISTER_BYTE(i).
See init_legacy_regcache_descr.
Sounds like the MIPS is sneeking past:
/* If an old style architecture, fill in the remainder of the
register cache descriptor using the register macros. */
if (!gdbarch_pseudo_register_read_p (gdbarch)
&& !gdbarch_pseudo_register_write_p (gdbarch)
&& !gdbarch_register_type_p (gdbarch))
{
descr->legacy_p = 1;
init_legacy_regcache_descr (gdbarch, descr);
return descr;
}
Andrew
More information about the Gdb
mailing list