* findvar.c (extract_signed_integer): Cast printf argument
[deliverable/binutils-gdb.git] / gdb / valprint.c
index 2a80b9c7c0ab33e735f31c4391088f458329d33f..39cf04c7173d62eb299314c578ba34aec359e2a0 100644 (file)
@@ -32,6 +32,8 @@
 #include "language.h"
 #include "annotate.h"
 #include "valprint.h"
+#include "floatformat.h"
+#include "doublest.h"
 
 #include <errno.h>
 
@@ -140,7 +142,7 @@ val_print (struct type *type, char *valaddr, int embedded_offset,
      only a stub and we can't find and substitute its complete type, then
      print appropriate string and return.  */
 
-  if (TYPE_FLAGS (real_type) & TYPE_FLAG_STUB)
+  if (TYPE_STUB (real_type))
     {
       fprintf_filtered (stream, "<incomplete type>");
       gdb_flush (stream);
@@ -157,7 +159,7 @@ val_print (struct type *type, char *valaddr, int embedded_offset,
    the number of string bytes printed.  */
 
 int
-value_print (value_ptr val, struct ui_file *stream, int format,
+value_print (struct value *val, struct ui_file *stream, int format,
             enum val_prettyprint pretty)
 {
   if (val == 0)
@@ -333,7 +335,7 @@ print_longest (struct ui_file *stream, int format, int use_local,
                        val_long);
       break;
     case 'u':
-      fprintf_filtered (stream, "%llu", val_long);
+      fprintf_filtered (stream, "%llu", (long long) val_long);
       break;
     case 'x':
       fprintf_filtered (stream,
@@ -538,94 +540,41 @@ longest_to_int (LONGEST arg)
   return (rtnval);
 }
 
-
-/* Print a floating point value of type TYPE, pointed to in GDB by VALADDR,
-   on STREAM.  */
+/* Print a floating point value of type TYPE (not always a
+   TYPE_CODE_FLT), pointed to in GDB by VALADDR, on STREAM.  */
 
 void
 print_floating (char *valaddr, struct type *type, struct ui_file *stream)
 {
   DOUBLEST doub;
   int inv;
+  const struct floatformat *fmt = NULL;
   unsigned len = TYPE_LENGTH (type);
 
-  /* Check for NaN's.  Note that this code does not depend on us being
-     on an IEEE conforming system.  It only depends on the target
-     machine using IEEE representation.  This means (a)
-     cross-debugging works right, and (2) IEEE_FLOAT can (and should)
-     be non-zero for systems like the 68881, which uses IEEE
-     representation, but is not IEEE conforming.  */
-  if (IEEE_FLOAT)
+  /* If it is a floating-point, check for obvious problems.  */
+  if (TYPE_CODE (type) == TYPE_CODE_FLT)
+    fmt = floatformat_from_type (type);
+  if (fmt != NULL && floatformat_is_nan (fmt, valaddr))
     {
-      unsigned long low, high;
-      /* Is the sign bit 0?  */
-      int nonnegative;
-      /* Is it is a NaN (i.e. the exponent is all ones and
-        the fraction is nonzero)?  */
-      int is_nan;
-
-      /* For lint, initialize these two variables to suppress warning: */
-      low = high = nonnegative = 0;
-      if (len == 4)
-       {
-         /* It's single precision.  */
-         /* Assume that floating point byte order is the same as
-            integer byte order.  */
-         low = extract_unsigned_integer (valaddr, 4);
-         nonnegative = ((low & 0x80000000) == 0);
-         is_nan = ((((low >> 23) & 0xFF) == 0xFF)
-                   && 0 != (low & 0x7FFFFF));
-         low &= 0x7fffff;
-         high = 0;
-       }
-      else if (len == 8)
-       {
-         /* It's double precision.  Get the high and low words.  */
-
-         /* Assume that floating point byte order is the same as
-            integer byte order.  */
-         if (TARGET_BYTE_ORDER == BIG_ENDIAN)
-           {
-             low = extract_unsigned_integer (valaddr + 4, 4);
-             high = extract_unsigned_integer (valaddr, 4);
-           }
-         else
-           {
-             low = extract_unsigned_integer (valaddr, 4);
-             high = extract_unsigned_integer (valaddr + 4, 4);
-           }
-         nonnegative = ((high & 0x80000000) == 0);
-         is_nan = (((high >> 20) & 0x7ff) == 0x7ff
-                   && !((((high & 0xfffff) == 0)) && (low == 0)));
-         high &= 0xfffff;
-       }
-      else
-       {
-#ifdef TARGET_ANALYZE_FLOATING
-         TARGET_ANALYZE_FLOATING;
-#else
-         /* Extended.  We can't detect extended NaNs for this target.
-            Also note that currently extendeds get nuked to double in
-            REGISTER_CONVERTIBLE.  */
-         is_nan = 0;
-#endif 
-       }
-
-      if (is_nan)
-       {
-         /* The meaning of the sign and fraction is not defined by IEEE.
-            But the user might know what they mean.  For example, they
-            (in an implementation-defined manner) distinguish between
-            signaling and quiet NaN's.  */
-         if (high)
-           fprintf_filtered (stream, "-NaN(0x%lx%.8lx)" + !!nonnegative,
-                             high, low);
-         else
-           fprintf_filtered (stream, "-NaN(0x%lx)" + nonnegative, low);
-         return;
-       }
+      if (floatformat_is_negative (fmt, valaddr))
+       fprintf_filtered (stream, "-");
+      fprintf_filtered (stream, "nan(");
+      fprintf_filtered (stream, local_hex_format_prefix ());
+      fprintf_filtered (stream, floatformat_mantissa (fmt, valaddr));
+      fprintf_filtered (stream, local_hex_format_suffix ());
+      fprintf_filtered (stream, ")");
+      return;
     }
 
+  /* NOTE: cagney/2002-01-15: The TYPE passed into print_floating()
+     isn't necessarily a TYPE_CODE_FLT.  Consequently, unpack_double
+     needs to be used as that takes care of any necessary type
+     conversions.  Such conversions are of course direct to DOUBLEST
+     and disregard any possible target floating point limitations.
+     For instance, a u64 would be converted and displayed exactly on a
+     host with 80 bit DOUBLEST but with loss of information on a host
+     with 64 bit DOUBLEST.  */
+
   doub = unpack_double (type, valaddr, &inv);
   if (inv)
     {
@@ -633,6 +582,14 @@ print_floating (char *valaddr, struct type *type, struct ui_file *stream)
       return;
     }
 
+  /* FIXME: kettenis/2001-01-20: The following code makes too much
+     assumptions about the host and target floating point format.  */
+
+  /* NOTE: cagney/2002-02-03: Since the TYPE of what was passed in may
+     not necessarially be a TYPE_CODE_FLT, the below ignores that and
+     instead uses the type's length to determine the precision of the
+     floating-point value being printed.  */
+
   if (len < sizeof (double))
       fprintf_filtered (stream, "%.9g", (double) doub);
   else if (len == sizeof (double))
@@ -641,7 +598,8 @@ print_floating (char *valaddr, struct type *type, struct ui_file *stream)
 #ifdef PRINTF_HAS_LONG_DOUBLE
     fprintf_filtered (stream, "%.35Lg", doub);
 #else
-    /* This at least wins with values that are representable as doubles */
+    /* This at least wins with values that are representable as
+       doubles.  */
     fprintf_filtered (stream, "%.17g", (double) doub);
 #endif
 }
@@ -665,7 +623,7 @@ print_binary_chars (struct ui_file *stream, unsigned char *valaddr,
   /* FIXME: We should be not printing leading zeroes in most cases.  */
 
   fprintf_filtered (stream, local_binary_format_prefix ());
-  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -752,7 +710,7 @@ print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
   carry = 0;
 
   fprintf_filtered (stream, local_octal_format_prefix ());
-  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -866,11 +824,11 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
 #define CARRY_LEFT( x ) ((x) % TEN)
 #define SHIFT( x )      ((x) << 4)
 #define START_P \
-        ((TARGET_BYTE_ORDER == BIG_ENDIAN) ? valaddr : valaddr + len - 1)
+        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? valaddr : valaddr + len - 1)
 #define NOT_END_P \
-        ((TARGET_BYTE_ORDER == BIG_ENDIAN) ? (p < valaddr + len) : (p >= valaddr))
+        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? (p < valaddr + len) : (p >= valaddr))
 #define NEXT_P \
-        ((TARGET_BYTE_ORDER == BIG_ENDIAN) ? p++ : p-- )
+        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? p++ : p-- )
 #define LOW_NIBBLE(  x ) ( (x) & 0x00F)
 #define HIGH_NIBBLE( x ) (((x) & 0x0F0) >> 4)
 
@@ -886,9 +844,7 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
    * as the base 16 number, which is 2 digits per byte.
    */
   decimal_len = len * 2 * 2;
-  digits = (unsigned char *) malloc (decimal_len);
-  if (digits == NULL)
-    error ("Can't allocate memory for conversion to decimal.");
+  digits = xmalloc (decimal_len);
 
   for (i = 0; i < decimal_len; i++)
     {
@@ -1005,7 +961,7 @@ print_hex_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
   /* FIXME: We should be not printing leading zeroes in most cases.  */
 
   fprintf_filtered (stream, local_hex_format_prefix ());
-  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -1338,7 +1294,7 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
 static void
 set_input_radix (char *args, int from_tty, struct cmd_list_element *c)
 {
-  set_input_radix_1 (from_tty, *(unsigned *) c->var);
+  set_input_radix_1 (from_tty, input_radix);
 }
 
 /* ARGSUSED */
@@ -1354,6 +1310,8 @@ set_input_radix_1 (int from_tty, unsigned radix)
 
   if (radix < 2)
     {
+      /* FIXME: cagney/2002-03-17: This needs to revert the bad radix
+         value.  */
       error ("Nonsense input radix ``decimal %u''; input radix unchanged.",
             radix);
     }
@@ -1369,7 +1327,7 @@ set_input_radix_1 (int from_tty, unsigned radix)
 static void
 set_output_radix (char *args, int from_tty, struct cmd_list_element *c)
 {
-  set_output_radix_1 (from_tty, *(unsigned *) c->var);
+  set_output_radix_1 (from_tty, output_radix);
 }
 
 static void
@@ -1389,6 +1347,8 @@ set_output_radix_1 (int from_tty, unsigned radix)
       output_format = 'o';     /* octal */
       break;
     default:
+      /* FIXME: cagney/2002-03-17: This needs to revert the bad radix
+         value.  */
       error ("Unsupported output radix ``decimal %u''; output radix unchanged.",
             radix);
     }
@@ -1534,14 +1494,14 @@ _initialize_valprint (void)
                   "Set default input radix for entering numbers.",
                   &setlist);
   add_show_from_set (c, &showlist);
-  c->function.sfunc = set_input_radix;
+  set_cmd_sfunc (c, set_input_radix);
 
   c = add_set_cmd ("output-radix", class_support, var_uinteger,
                   (char *) &output_radix,
                   "Set default output radix for printing of values.",
                   &setlist);
   add_show_from_set (c, &showlist);
-  c->function.sfunc = set_output_radix;
+  set_cmd_sfunc (c, set_output_radix);
 
   /* The "set radix" and "show radix" commands are special in that they are
      like normal set and show commands but allow two normally independent
This page took 0.026706 seconds and 4 git commands to generate.