* i387-tdep.h (i387_print_float_info): New prototype.
authorMark Kettenis <kettenis@gnu.org>
Thu, 15 Aug 2002 17:36:57 +0000 (17:36 +0000)
committerMark Kettenis <kettenis@gnu.org>
Thu, 15 Aug 2002 17:36:57 +0000 (17:36 +0000)
* 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.

gdb/ChangeLog
gdb/config/i386/tm-i386.h
gdb/i386-tdep.c
gdb/i387-tdep.c
gdb/i387-tdep.h

index b92f9f85bc1d14163c5b21c29642b2ccceb68014..65d90d5cfacb3a96735b18340bcddf698ef4649b 100644 (file)
@@ -1,3 +1,17 @@
+2002-08-15  Mark Kettenis  <kettenis@elgar.kettenis.dyndns.org>
+
+       * 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  <msnyder@redhat.com>
 
        * mips-tdep.c (mips_push_arguments): Rename to
index d6bc5741eba0c307d5bae560c5bf8c4ae78952e0..47a4a46d9c83ae5fdeea770934066b3d2417c49e 100644 (file)
 
 #include "regcache.h"
 
-/* Print out the i387 floating point state.  */
-extern void i387_float_info (void);
-#define FLOAT_INFO { i387_float_info (); }
-\f
-
 /* 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);
index a0fb4480d59ee9757cd1f2bd98f5fae4da7bb842..39d3bddda3419f2da9418d13824d6683c8a07493 100644 (file)
@@ -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);
index 59b60d77a9d1cb9cd3a4f61a709113c01e408bf1..6ace98b8abc1e78a14f15369d8e17684220ef2ca 100644 (file)
@@ -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" : "  ");
-
-  puts_filtered ("\n");
-
-  printf_filtered ("                       TOP: %d\n", ((status >> 11) & 7));
+  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" : "  ");
+
+  fputs_filtered ("\n", file);
+
+  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
index 5bfd06eb7102cdbd97c8074ee817b5ee21a70124..451bb988deb92ddd17af41c4d413f8787e153ddb 100644 (file)
 #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.  */