daily update
[deliverable/binutils-gdb.git] / gdb / valprint.c
index 1ca46be9852881be7cbda45ab016ac9131327a41..3feb91564d0ac8ad58b08645c36ec8d0f2ae15fc 100644 (file)
@@ -1,5 +1,6 @@
 /* Print values for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991-1994, 1998, 2000
+   Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001
    Free Software Foundation, Inc.
 
    This file is part of GDB.
 #include "target.h"
 #include "obstack.h"
 #include "language.h"
-#include "demangle.h"
 #include "annotate.h"
 #include "valprint.h"
+#include "floatformat.h"
+#include "doublest.h"
 
 #include <errno.h>
 
@@ -257,7 +259,7 @@ print_decimal (struct ui_file *stream, char *sign, int use_local,
                        sign, temp[2], temp[1], temp[0]);
       break;
     default:
-      abort ();
+      internal_error (__FILE__, __LINE__, "failed internal consistency check");
     }
   return;
 }
@@ -360,7 +362,7 @@ print_longest (struct ui_file *stream, int format, int use_local,
       fprintf_filtered (stream, local_hex_format_custom ("016ll"), val_long);
       break;
     default:
-      abort ();
+      internal_error (__FILE__, __LINE__, "failed internal consistency check");
     }
 #else /* !CC_HAS_LONG_LONG || !PRINTF_HAS_LONG_LONG */
   /* In the following it is important to coerce (val_long) to a long. It does
@@ -407,20 +409,17 @@ print_longest (struct ui_file *stream, int format, int use_local,
                        (unsigned long) val_long);
       break;
     default:
-      abort ();
+      internal_error (__FILE__, __LINE__, "failed internal consistency check");
     }
 #endif /* CC_HAS_LONG_LONG || PRINTF_HAS_LONG_LONG */
 }
 
 #if 0
 void
-strcat_longest (format, use_local, val_long, buf, buflen)
-     int format;
-     int use_local;
-     LONGEST val_long;
-     char *buf;
-     int buflen;               /* ignored, for now */
+strcat_longest (int format, int use_local, LONGEST val_long, char *buf,
+               int buflen)
 {
+/* FIXME: Use buflen to avoid buffer overflow.  */
 #if defined (CC_HAS_LONG_LONG) && !defined (PRINTF_HAS_LONG_LONG)
   long vtop, vbot;
 
@@ -470,7 +469,7 @@ strcat_longest (format, use_local, val_long, buf, buflen)
       sprintf (buf, local_hex_format_custom ("016ll"), val_long);
       break;
     default:
-      abort ();
+      internal_error (__FILE__, __LINE__, "failed internal consistency check");
     }
 #else /* !PRINTF_HAS_LONG_LONG */
   /* In the following it is important to coerce (val_long) to a long. It does
@@ -511,7 +510,7 @@ strcat_longest (format, use_local, val_long, buf, buflen)
               ((long) val_long));
       break;
     default:
-      abort ();
+      internal_error (__FILE__, __LINE__, "failed internal consistency check");
     }
 
 #endif /* !PRINTF_HAS_LONG_LONG */
@@ -541,92 +540,39 @@ 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, 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 = &floatformat_unknown;
   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)
-    {
-      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.  */
+  /* FIXME: kettenis/2001-01-20: The check for IEEE_FLOAT is probably
+     still necessary since GDB by default assumes that the target uses
+     the IEEE 754 representation for its floats and doubles.  Of
+     course this is all crock and should be cleaned up.  */
 
-         /* 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 (len == TARGET_FLOAT_BIT / TARGET_CHAR_BIT && IEEE_FLOAT)
+    fmt = TARGET_FLOAT_FORMAT;
+  else if (len == TARGET_DOUBLE_BIT / TARGET_CHAR_BIT && IEEE_FLOAT)
+    fmt = TARGET_DOUBLE_FORMAT;
+  else if (len == TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT)
+    fmt = TARGET_LONG_DOUBLE_FORMAT;
 
-      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_nan (fmt, valaddr))
+    {
+      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;
     }
 
   doub = unpack_double (type, valaddr, &inv);
@@ -636,6 +582,9 @@ 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.  */
+
   if (len < sizeof (double))
       fprintf_filtered (stream, "%.9g", (double) doub);
   else if (len == sizeof (double))
@@ -644,7 +593,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
 }
@@ -889,9 +839,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++)
     {
@@ -993,7 +941,7 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
     {
       fprintf_filtered (stream, "%1d", digits[i]);
     }
-  free (digits);
+  xfree (digits);
 
   fprintf_filtered (stream, local_decimal_format_suffix ());
 }
@@ -1205,7 +1153,7 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
     {
       buffer = (char *) xmalloc (len * width);
       bufptr = buffer;
-      old_chain = make_cleanup (free, buffer);
+      old_chain = make_cleanup (xfree, buffer);
 
       nfetch = partial_memory_read (addr, bufptr, len * width, &errcode)
        / width;
@@ -1228,7 +1176,7 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
              buffer = (char *) xrealloc (buffer, (nfetch + bufsize) * width);
            }
 
-         old_chain = make_cleanup (free, buffer);
+         old_chain = make_cleanup (xfree, buffer);
          bufptr = buffer + bufsize * width;
          bufsize += nfetch;
 
This page took 0.0292480000000001 seconds and 4 git commands to generate.