PATCH ARM initial support for different floating-point models

Andrew Cagney ac131313@cygnus.com
Tue Feb 19 15:12:00 GMT 2002


Hmm, I'm afraid you may have just stepped into the 
write_register_bytes() bear trap :-( Have a look at the comments in 
regcache.c for the history.


> Index: arm-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/arm-tdep.c,v
> retrieving revision 1.47
> diff -p -r1.47 arm-tdep.c
> *** arm-tdep.c	2002/02/19 13:57:35	1.47
> --- arm-tdep.c	2002/02/19 19:14:40
> *************** arm_extract_return_value (struct type *t
> *** 2139,2145 ****
>   			  char *valbuf)
>   {
>     if (TYPE_CODE_FLT == TYPE_CODE (type))
> !     convert_from_extended (&regbuf[REGISTER_BYTE (ARM_F0_REGNUM)], valbuf);
>     else
>       memcpy (valbuf, &regbuf[REGISTER_BYTE (ARM_A1_REGNUM)],
>   	    TYPE_LENGTH (type));

Here, unfortunatly, directly pokeing around the regcache buffer (a 
parameter) is still the only way to do this.


>   	    TYPE_LENGTH (type));
> *************** arm_store_return_value (struct type *typ
> *** 2256,2270 ****
>   {
>     if (TYPE_CODE (type) == TYPE_CODE_FLT)
>       {
>         char buf[MAX_REGISTER_RAW_SIZE];
>   
> !       convert_to_extended (valbuf, buf);
> !       /* XXX Is this correct for soft-float?  */
> !       write_register_bytes (REGISTER_BYTE (ARM_F0_REGNUM), buf,
> ! 			    MAX_REGISTER_RAW_SIZE);

I think your changes to this function can be rewritten to use 
write_register_gen(REGNUM,BUF).

Need to be careful though.  If the code is assuming a floating point 
value should be stored across multiple adjacent registers then the code 
will need to be broken down into separate explicit writes.

enjoy,
Andrew




More information about the Gdb-patches mailing list