diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b92f9f85bc1..65d90d5cfac 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2002-08-15 Mark Kettenis + + * i387-tdep.h (i387_print_float_info): New prototype. + * i387-tdep.c (print_i387_value, print_i387_ext, + print_i387_status_word, print_i387_control_word): Add `struct + ui_file *' argument and use it for output. + (i387_print_float_info): Renamed from i387_float_info. Add + `struct gdbarch *' and `struct ui_file *' arguments and use the + latter for output. + * i386-tdep.c: Include "i387-tdep.h". + (i386_gdbarch_init): Set print_float_info. + * config/i386/tm-i386.h (i387_float_info): Remove prototype. + (FLOAT_INFO): Remove define. + 2002-08-13 Michael Snyder * mips-tdep.c (mips_push_arguments): Rename to diff --git a/gdb/config/i386/tm-i386.h b/gdb/config/i386/tm-i386.h index d6bc5741eba..47a4a46d9c8 100644 --- a/gdb/config/i386/tm-i386.h +++ b/gdb/config/i386/tm-i386.h @@ -26,11 +26,6 @@ #include "regcache.h" -/* Print out the i387 floating point state. */ -extern void i387_float_info (void); -#define FLOAT_INFO { i387_float_info (); } - - /* FIXME: kettenis/2000-06-12: These do not belong here. */ extern void print_387_control_word (unsigned int); extern void print_387_status_word (unsigned int); diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index a0fb4480d59..39d3bddda34 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -38,6 +38,7 @@ #include "gdb_assert.h" #include "i386-tdep.h" +#include "i387-tdep.h" /* Names of the registers. The first 10 registers match the register numbering scheme used by GCC for stabs and DWARF. */ @@ -1488,6 +1489,8 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_max_register_virtual_size (gdbarch, I386_MAX_REGISTER_SIZE); set_gdbarch_register_virtual_type (gdbarch, i386_register_virtual_type); + set_gdbarch_print_float_info (gdbarch, i387_print_float_info); + set_gdbarch_get_longjmp_target (gdbarch, i386_get_longjmp_target); set_gdbarch_use_generic_dummy_frames (gdbarch, 1); diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c index 59b60d77a9d..6ace98b8abc 100644 --- a/gdb/i387-tdep.c +++ b/gdb/i387-tdep.c @@ -160,7 +160,7 @@ print_387_status_word (unsigned int status) /* Print the floating point number specified by RAW. */ static void -print_i387_value (char *raw) +print_i387_value (char *raw, struct ui_file *file) { DOUBLEST value; @@ -175,15 +175,15 @@ print_i387_value (char *raw) to print the value, 1 position for the sign, 1 for the decimal point, 19 for the digits and 6 for the exponent adds up to 27. */ #ifdef PRINTF_HAS_LONG_DOUBLE - printf_filtered (" %-+27.19Lg", (long double) value); + fprintf_filtered (file, " %-+27.19Lg", (long double) value); #else - printf_filtered (" %-+27.19g", (double) value); + fprintf_filtered (file, " %-+27.19g", (double) value); #endif } /* Print the classification for the register contents RAW. */ static void -print_i387_ext (unsigned char *raw) +print_i387_ext (unsigned char *raw, struct ui_file *file) { int sign; int integer; @@ -201,119 +201,121 @@ print_i387_ext (unsigned char *raw) { if (fraction[0] == 0x00000000 && fraction[1] == 0x00000000) /* Infinity. */ - printf_filtered (" %cInf", (sign ? '-' : '+')); + fprintf_filtered (file, " %cInf", (sign ? '-' : '+')); else if (sign && fraction[0] == 0x00000000 && fraction[1] == 0x40000000) /* Real Indefinite (QNaN). */ - puts_unfiltered (" Real Indefinite (QNaN)"); + fputs_unfiltered (" Real Indefinite (QNaN)", file); else if (fraction[1] & 0x40000000) /* QNaN. */ - puts_filtered (" QNaN"); + fputs_filtered (" QNaN", file); else /* SNaN. */ - puts_filtered (" SNaN"); + fputs_filtered (" SNaN", file); } else if (exponent < 0x7fff && exponent > 0x0000 && integer) /* Normal. */ - print_i387_value (raw); + print_i387_value (raw, file); else if (exponent == 0x0000) { /* Denormal or zero. */ - print_i387_value (raw); + print_i387_value (raw, file); if (integer) /* Pseudo-denormal. */ - puts_filtered (" Pseudo-denormal"); + fputs_filtered (" Pseudo-denormal", file); else if (fraction[0] || fraction[1]) /* Denormal. */ - puts_filtered (" Denormal"); + fputs_filtered (" Denormal", file); } else /* Unsupported. */ - puts_filtered (" Unsupported"); + fputs_filtered (" Unsupported", file); } /* Print the status word STATUS. */ static void -print_i387_status_word (unsigned int status) +print_i387_status_word (unsigned int status, struct ui_file *file) { - printf_filtered ("Status Word: %s", + fprintf_filtered (file, "Status Word: %s", local_hex_string_custom (status, "04")); - puts_filtered (" "); - printf_filtered (" %s", (status & 0x0001) ? "IE" : " "); - printf_filtered (" %s", (status & 0x0002) ? "DE" : " "); - printf_filtered (" %s", (status & 0x0004) ? "ZE" : " "); - printf_filtered (" %s", (status & 0x0008) ? "OE" : " "); - printf_filtered (" %s", (status & 0x0010) ? "UE" : " "); - printf_filtered (" %s", (status & 0x0020) ? "PE" : " "); - puts_filtered (" "); - printf_filtered (" %s", (status & 0x0080) ? "ES" : " "); - puts_filtered (" "); - printf_filtered (" %s", (status & 0x0040) ? "SF" : " "); - puts_filtered (" "); - printf_filtered (" %s", (status & 0x0100) ? "C0" : " "); - printf_filtered (" %s", (status & 0x0200) ? "C1" : " "); - printf_filtered (" %s", (status & 0x0400) ? "C2" : " "); - printf_filtered (" %s", (status & 0x4000) ? "C3" : " "); + fputs_filtered (" ", file); + fprintf_filtered (file, " %s", (status & 0x0001) ? "IE" : " "); + fprintf_filtered (file, " %s", (status & 0x0002) ? "DE" : " "); + fprintf_filtered (file, " %s", (status & 0x0004) ? "ZE" : " "); + fprintf_filtered (file, " %s", (status & 0x0008) ? "OE" : " "); + fprintf_filtered (file, " %s", (status & 0x0010) ? "UE" : " "); + fprintf_filtered (file, " %s", (status & 0x0020) ? "PE" : " "); + fputs_filtered (" ", file); + fprintf_filtered (file, " %s", (status & 0x0080) ? "ES" : " "); + fputs_filtered (" ", file); + fprintf_filtered (file, " %s", (status & 0x0040) ? "SF" : " "); + fputs_filtered (" ", file); + fprintf_filtered (file, " %s", (status & 0x0100) ? "C0" : " "); + fprintf_filtered (file, " %s", (status & 0x0200) ? "C1" : " "); + fprintf_filtered (file, " %s", (status & 0x0400) ? "C2" : " "); + fprintf_filtered (file, " %s", (status & 0x4000) ? "C3" : " "); - puts_filtered ("\n"); + fputs_filtered ("\n", file); - printf_filtered (" TOP: %d\n", ((status >> 11) & 7)); + fprintf_filtered (file, + " TOP: %d\n", ((status >> 11) & 7)); } /* Print the control word CONTROL. */ static void -print_i387_control_word (unsigned int control) +print_i387_control_word (unsigned int control, struct ui_file *file) { - printf_filtered ("Control Word: %s", + fprintf_filtered (file, "Control Word: %s", local_hex_string_custom (control, "04")); - puts_filtered (" "); - printf_filtered (" %s", (control & 0x0001) ? "IM" : " "); - printf_filtered (" %s", (control & 0x0002) ? "DM" : " "); - printf_filtered (" %s", (control & 0x0004) ? "ZM" : " "); - printf_filtered (" %s", (control & 0x0008) ? "OM" : " "); - printf_filtered (" %s", (control & 0x0010) ? "UM" : " "); - printf_filtered (" %s", (control & 0x0020) ? "PM" : " "); + fputs_filtered (" ", file); + fprintf_filtered (file, " %s", (control & 0x0001) ? "IM" : " "); + fprintf_filtered (file, " %s", (control & 0x0002) ? "DM" : " "); + fprintf_filtered (file, " %s", (control & 0x0004) ? "ZM" : " "); + fprintf_filtered (file, " %s", (control & 0x0008) ? "OM" : " "); + fprintf_filtered (file, " %s", (control & 0x0010) ? "UM" : " "); + fprintf_filtered (file, " %s", (control & 0x0020) ? "PM" : " "); - puts_filtered ("\n"); + fputs_filtered ("\n", file); - puts_filtered (" PC: "); + fputs_filtered (" PC: ", file); switch ((control >> 8) & 3) { case 0: - puts_filtered ("Single Precision (24-bits)\n"); + fputs_filtered ("Single Precision (24-bits)\n", file); break; case 1: - puts_filtered ("Reserved\n"); + fputs_filtered ("Reserved\n", file); break; case 2: - puts_filtered ("Double Precision (53-bits)\n"); + fputs_filtered ("Double Precision (53-bits)\n", file); break; case 3: - puts_filtered ("Extended Precision (64-bits)\n"); + fputs_filtered ("Extended Precision (64-bits)\n", file); break; } - puts_filtered (" RC: "); + fputs_filtered (" RC: ", file); switch ((control >> 10) & 3) { case 0: - puts_filtered ("Round to nearest\n"); + fputs_filtered ("Round to nearest\n", file); break; case 1: - puts_filtered ("Round down\n"); + fputs_filtered ("Round down\n", file); break; case 2: - puts_filtered ("Round up\n"); + fputs_filtered ("Round up\n", file); break; case 3: - puts_filtered ("Round toward zero\n"); + fputs_filtered ("Round toward zero\n", file); break; } } /* Print out the i387 floating poin state. */ void -i387_float_info (void) +i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file, + struct frame_info *frame) { unsigned int fctrl; unsigned int fstat; @@ -343,50 +345,50 @@ i387_float_info (void) int tag = (ftag >> (fpreg * 2)) & 3; int i; - printf_filtered ("%sR%d: ", fpreg == top ? "=>" : " ", fpreg); + fprintf_filtered (file, "%sR%d: ", fpreg == top ? "=>" : " ", fpreg); switch (tag) { case 0: - puts_filtered ("Valid "); + fputs_filtered ("Valid ", file); break; case 1: - puts_filtered ("Zero "); + fputs_filtered ("Zero ", file); break; case 2: - puts_filtered ("Special "); + fputs_filtered ("Special ", file); break; case 3: - puts_filtered ("Empty "); + fputs_filtered ("Empty ", file); break; } read_register_gen ((fpreg + 8 - top) % 8 + FP0_REGNUM, raw); - puts_filtered ("0x"); + fputs_filtered ("0x", file); for (i = 9; i >= 0; i--) - printf_filtered ("%02x", raw[i]); + fprintf_filtered (file, "%02x", raw[i]); if (tag != 3) - print_i387_ext (raw); + print_i387_ext (raw, file); - puts_filtered ("\n"); + fputs_filtered ("\n", file); } puts_filtered ("\n"); - print_i387_status_word (fstat); - print_i387_control_word (fctrl); - printf_filtered ("Tag Word: %s\n", - local_hex_string_custom (ftag, "04")); - printf_filtered ("Instruction Pointer: %s:", - local_hex_string_custom (fiseg, "02")); - printf_filtered ("%s\n", local_hex_string_custom (fioff, "08")); - printf_filtered ("Operand Pointer: %s:", - local_hex_string_custom (foseg, "02")); - printf_filtered ("%s\n", local_hex_string_custom (fooff, "08")); - printf_filtered ("Opcode: %s\n", - local_hex_string_custom (fop ? (fop | 0xd800) : 0, "04")); + print_i387_status_word (fstat, file); + print_i387_control_word (fctrl, file); + fprintf_filtered (file, "Tag Word: %s\n", + local_hex_string_custom (ftag, "04")); + fprintf_filtered (file, "Instruction Pointer: %s:", + local_hex_string_custom (fiseg, "02")); + fprintf_filtered (file, "%s\n", local_hex_string_custom (fioff, "08")); + fprintf_filtered (file, "Operand Pointer: %s:", + local_hex_string_custom (foseg, "02")); + fprintf_filtered (file, "%s\n", local_hex_string_custom (fooff, "08")); + fprintf_filtered (file, "Opcode: %s\n", + local_hex_string_custom (fop ? (fop | 0xd800) : 0, "04")); } /* FIXME: kettenis/2000-05-21: Right now more than a few i386 targets diff --git a/gdb/i387-tdep.h b/gdb/i387-tdep.h index 5bfd06eb710..451bb988deb 100644 --- a/gdb/i387-tdep.h +++ b/gdb/i387-tdep.h @@ -21,6 +21,12 @@ #ifndef I387_TDEP_H #define I387_TDEP_H +/* Print out the i387 floating point state. */ + +extern void i387_print_float_info (struct gdbarch *gdbarch, + struct ui_file *file, + struct frame_info *frame); + /* Fill register REGNUM in GDB's register array with the appropriate value from *FSAVE. This function masks off any of the reserved bits in *FSAVE. */