[PATCH] Fix i386 FPU register conversion code
Michael Snyder
msnyder@redhat.com
Sat Jul 28 12:49:00 GMT 2001
Mark Kettenis wrote:
>
> Fixing the debug register number mapping scheme uncovered a bug in
> i386-tdep.c:i386_register_convert_to_virtual(). Fixed with the
> attached patch.
>
> Mark
Isn't "gdb_assert" rather strong for this use?
Seems like simply returning without doing anything
would be sufficient in case we were called with an
integer register or what-not. Calling gdb_assert
will result in the user being asked if he would like
GDB to abort and dump core (I think...)
>
> Index: ChangeLog
> from Mark Kettenis <kettenis@gnu.org>
>
> * i386-tdep.c: Include "gdb_assert.h"
> (i386_register_convert_to_virtual): Fix such that it can handle
> conversion to any floating-point type. Assert that we are dealing
> with a floating-point first.
> (i386_register_convert_to_raw): Assert that TYPE is a
> floating-point type with length 12.
>
> Index: i386-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/i386-tdep.c,v
> retrieving revision 1.34
> diff -u -p -r1.34 i386-tdep.c
> --- i386-tdep.c 2001/07/15 20:10:02 1.34
> +++ i386-tdep.c 2001/07/28 16:45:41
> @@ -33,6 +33,8 @@
> #include "arch-utils.h"
> #include "regcache.h"
>
> +#include "gdb_assert.h"
> +
> /* i386_register_byte[i] is the offset into the register file of the
> start of register number i. We initialize this from
> i386_register_raw_size. */
> @@ -972,27 +974,39 @@ i386_register_convertible (int regnum)
> }
>
> /* Convert data from raw format for register REGNUM in buffer FROM to
> - virtual format with type TYPE in buffer TO. In principle both
> - formats are identical except that the virtual format has two extra
> - bytes appended that aren't used. We set these to zero. */
> + virtual format with type TYPE in buffer TO. */
>
> void
> i386_register_convert_to_virtual (int regnum, struct type *type,
> char *from, char *to)
> {
> - /* Copy straight over, but take care of the padding. */
> - memcpy (to, from, FPU_REG_RAW_SIZE);
> - memset (to + FPU_REG_RAW_SIZE, 0, TYPE_LENGTH (type) - FPU_REG_RAW_SIZE);
> + char buf[12];
> + DOUBLEST d;
> +
> + /* We only support floating-point values. */
> + gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
> +
> + /* First add the necessary padding. */
> + memcpy (buf, from, FPU_REG_RAW_SIZE);
> + memset (buf + FPU_REG_RAW_SIZE, 0, sizeof buf - FPU_REG_RAW_SIZE);
> +
> + /* Convert to TYPE. This should be a no-op, if TYPE is equivalent
> + to the extended floating-point format used by the FPU. */
> + d = extract_floating (buf, sizeof buf);
> + store_floating (to, TYPE_LENGTH (type), d);
> }
>
> /* Convert data from virtual format with type TYPE in buffer FROM to
> - raw format for register REGNUM in buffer TO. Simply omit the two
> - unused bytes. */
> + raw format for register REGNUM in buffer TO. */
>
> void
> i386_register_convert_to_raw (struct type *type, int regnum,
> char *from, char *to)
> {
> + gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT
> + && TYPE_LENGTH (type) == 12);
> +
> + /* Simply omit the two unused bytes. */
> memcpy (to, from, FPU_REG_RAW_SIZE);
> }
>
More information about the Gdb-patches
mailing list