GDB broken on MIPS targets with unmarked binaries

Daniel Jacobowitz drow@mvista.com
Wed Jun 5 14:03:00 GMT 2002


On Wed, Jun 05, 2002 at 04:44:21PM -0400, Andrew Cagney wrote:
> >There's an interesting crash on startup in a mips-elf GDB nowadays... the
> >code reads:
> >
> >    default:
> >      tdep->mips_abi_string = "default";
> >      tdep->mips_default_saved_regsize = MIPS_REGSIZE;
> >      tdep->mips_default_stack_argsize = MIPS_REGSIZE;
> >      tdep->mips_fp_register_double = (REGISTER_VIRTUAL_SIZE (FP0_REGNUM) 
> >      == 8);
> >      tdep->mips_last_arg_regnum = A0_REGNUM + 8 - 1;
> >      tdep->mips_last_fp_arg_regnum = FPA0_REGNUM + 8 - 1;
> >      tdep->mips_regs_have_home_p = 1;
> >      tdep->gdb_target_is_mips64 = 0;
> >      tdep->default_mask_address_p = 0;
> >      set_gdbarch_long_bit (gdbarch, 32);
> >      set_gdbarch_ptr_bit (gdbarch, 32);
> >      set_gdbarch_long_long_bit (gdbarch, 64);
> >      break;
> >
> >Something brought in recently, probably by the OS ABI changes if I had to
> >guess, is causing the check of REGISTER_VIRTUAL_SIZE to fail.  I've no idea
> >why.  Compiling a mips-elf (not mips-linux, which sets MIPS_DEFAULT_ABI) 
> >and
> >running gdb on an unmarked ELF binary reproduces this.
> 
> I'd suspect this:
> 
> 2002-05-08  Andrew Cagney  <ac131313@redhat.com>
> 
>         * gdbarch.sh (init_gdbarch_swap): Do not clear the swap section.
>         (clear_gdbarch_swap): New function.
>         (initialize_non_multiarch): Call.
>         (gdbarch_update_p): Before calling init(), swap out and clear the
>         existing architecture.
>         * gdbarch.c: Regenerate.
> 
> The comment from arm-tdep.c should help explain why the above code is 
> broken:
> 
>   /* We can't use NUM_REGS nor NUM_PSEUDO_REGS here, since that still
>      references the old architecture vector, not the one we are
>      building here.  */
>   prologue_cache.saved_regs = (CORE_ADDR *)
>     xcalloc (1, (sizeof (CORE_ADDR)
>                  * (gdbarch_num_regs (gdbarch)
>                     + gdbarch_num_pseudo_regs (gdbarch))));
> 
> As far as I can tell though, REGISTER_VIRTUAL_SIZE expands to 
> REGISTER_VIRTUAL_TYPE which is still a macro?

The expansion appears to be:
tdep->mips_fp_register_double = (((((38) >= 38 && (38) < 38 +32) ?
	builtin_type_float : ((38) == 32 ) ?
        builtin_type_uint32 : ((38) >= 70 && (38) <= 89) ?
	builtin_type_uint32 :
        builtin_type_int))->main_type->length == 8);

I can't see any reason for it to crash; I haven't reproduced this
locally yet, although I'm working on it.  The above expansion came from
the second person to mention this to me.

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer



More information about the Gdb mailing list