This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] mips_pop_frame


Pinging andrew...

Michael Snyder wrote:
> 
> Sign extension is bad for FP registers, esp. if their saved size is
> 4 bytes but their raw size is 8 bytes.
> 
>   ------------------------------------------------------------------------
> 2002-08-13  Michael Snyder  <msnyder@redhat.com>
> 
>         * mips-tdep.c (mips_pop_frame): Read saved values of floating
>         point registers without sign extension.
> 
> Index: mips-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mips-tdep.c,v
> retrieving revision 1.99
> diff -p -r1.99 mips-tdep.c
> *** mips-tdep.c 10 Aug 2002 01:09:10 -0000      1.99
> --- mips-tdep.c 13 Aug 2002 21:18:06 -0000
> *************** mips_pop_frame (void)
> *** 3134,3146 ****
>     if (frame->saved_regs == NULL)
>       FRAME_INIT_SAVED_REGS (frame);
>     for (regnum = 0; regnum < NUM_REGS; regnum++)
> !     {
> !       if (regnum != SP_REGNUM && regnum != PC_REGNUM
> !         && frame->saved_regs[regnum])
> !       write_register (regnum,
> !                       read_memory_integer (frame->saved_regs[regnum],
> !                                            MIPS_SAVED_REGSIZE));
> !     }
>     write_register (SP_REGNUM, new_sp);
>     flush_cached_frames ();
> 
> --- 3136,3157 ----
>     if (frame->saved_regs == NULL)
>       FRAME_INIT_SAVED_REGS (frame);
>     for (regnum = 0; regnum < NUM_REGS; regnum++)
> !     if (regnum != SP_REGNUM && regnum != PC_REGNUM
> !       && frame->saved_regs[regnum])
> !       {
> !       /* Floating point registers must not be sign extended,
> !          in case MIPS_SAVED_REGSIZE = 4 but sizeof (FP0_REGNUM) == 8.  */
> !
> !       if (FP0_REGNUM <= regnum && regnum < FP0_REGNUM + 32)
> !         write_register (regnum,
> !                         read_memory_unsigned_integer (frame->saved_regs[regnum],
> !                                                       MIPS_SAVED_REGSIZE));
> !       else
> !         write_register (regnum,
> !                         read_memory_integer (frame->saved_regs[regnum],
> !                                              MIPS_SAVED_REGSIZE));
> !       }
> !
>     write_register (SP_REGNUM, new_sp);
>     flush_cached_frames ();
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]