* inftarg.c (child_thread_alive): New function to see if a
[deliverable/binutils-gdb.git] / gdb / valprint.c
index c91b7cdf29e95a9ec708ac6f6ac2ea9b5964a5f2..d4c86969837cd46d82e92430a37fe79c274705f1 100644 (file)
@@ -28,6 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "obstack.h"
 #include "language.h"
 #include "demangle.h"
+#include "annotate.h"
 
 #include <errno.h>
 
@@ -60,8 +61,8 @@ set_output_radix PARAMS ((char *, int, struct cmd_list_element *));
 static void
 set_output_radix_1 PARAMS ((int, unsigned));
 
-static void
-value_print_array_elements PARAMS ((value, GDB_FILE *, int, enum val_prettyprint));
+static void value_print_array_elements PARAMS ((value_ptr, GDB_FILE *, int,
+                                               enum val_prettyprint));
 
 /* Maximum number of chars to print for a string pointer value or vector
    contents, or UINT_MAX for no limit.  Note that "set print elements 0"
@@ -136,8 +137,7 @@ val_print (type, valaddr, address, stream, format, deref_ref, recurse, pretty)
 
   /* Ensure that the type is complete and not just a stub.  If the type is
      only a stub and we can't find and substitute its complete type, then
-     print appropriate string and return.  Typical types that my be stubs
-     are structs, unions, and C++ methods. */
+     print appropriate string and return.  */
 
   check_stub_type (type);
   if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
@@ -158,7 +158,7 @@ val_print (type, valaddr, address, stream, format, deref_ref, recurse, pretty)
 
 int
 value_print (val, stream, format, pretty)
-     value val;
+     value_ptr val;
      GDB_FILE *stream;
      int format;
      enum val_prettyprint pretty;
@@ -277,9 +277,12 @@ val_print_type_code_int (type, valaddr, stream)
 #endif
          if (len <= sizeof (LONGEST))
            {
-             /* We can print it in decimal.  */
+             /* The most significant bytes are zero, so we can just get
+                the least significant sizeof (LONGEST) bytes and print it
+                in decimal.  */
              print_longest (stream, 'u', 0,
-                           unpack_long (BUILTIN_TYPE_LONGEST, first_addr));
+                            extract_unsigned_integer (first_addr,
+                                                      sizeof (LONGEST)));
            }
          else
            {
@@ -312,8 +315,10 @@ val_print_type_code_int (type, valaddr, stream)
    printf() that supports "ll" in the format string.  We handle these by seeing
    if the number is actually a long, and if not we just bail out and print the
    number in hex.  The format chars b,h,w,g are from
-   print_scalar_formatted().  USE_LOCAL says whether or not to call the
-   local formatting routine to get the format.  */
+   print_scalar_formatted().  If USE_LOCAL, format it according to the current
+   language (this should be used for most integers which GDB prints, the
+   exception is things like protocols where the format of the integer is
+   a protocol thing, not a user-visible thing).  */
 
 void
 print_longest (stream, format, use_local, val_long)
@@ -329,7 +334,7 @@ print_longest (stream, format, use_local, val_long)
   vbot = (long) val_long;
 
   if ((format == 'd' && (val_long < INT_MIN || val_long > INT_MAX))
-      || ((format == 'u' || format == 'x') && val_long > UINT_MAX))
+      || ((format == 'u' || format == 'x') && (unsigned long long)val_long > UINT_MAX))
     {
       fprintf_filtered (stream, "0x%lx%08lx", vtop, vbot);
       return;
@@ -424,6 +429,28 @@ print_longest (stream, format, use_local, val_long)
 #endif /* !PRINTF_HAS_LONG_LONG */
 }
 
+/* This used to be a macro, but I don't think it is called often enough
+   to merit such treatment.  */
+/* Convert a LONGEST to an int.  This is used in contexts (e.g. number of
+   arguments to a function, number in a value history, register number, etc.)
+   where the value must not be larger than can fit in an int.  */
+
+int
+longest_to_int (arg)
+     LONGEST arg;
+{
+
+  /* This check is in case a system header has botched the
+     definition of INT_MIN, like on BSDI.  */
+  if (sizeof (LONGEST) <= sizeof (int))
+    return arg;
+
+  if (arg > INT_MAX || arg < INT_MIN)
+    error ("Value out of range.");
+
+  return arg;
+}
+
 /* Print a floating point value of type TYPE, pointed to in GDB by VALADDR,
    on STREAM.  */
 
@@ -460,7 +487,7 @@ print_floating (valaddr, type, stream)
        /* Assume that floating point byte order is the same as
           integer byte order.  */
        low = extract_unsigned_integer (valaddr, 4);
-       nonnegative = low >= 0;
+       nonnegative = ((low & 0x80000000) == 0);
        is_nan = ((((low >> 23) & 0xFF) == 0xFF) 
                  && 0 != (low & 0x7FFFFF));
        low &= 0x7fffff;
@@ -479,7 +506,7 @@ print_floating (valaddr, type, stream)
        low = extract_unsigned_integer (valaddr, 4);
        high = extract_unsigned_integer (valaddr + 4, 4);
 #endif
-       nonnegative = high >= 0;
+       nonnegative = ((high & 0x80000000) == 0);
        is_nan = (((high >> 20) & 0x7ff) == 0x7ff
                  && ! ((((high & 0xfffff) == 0)) && (low == 0)));
        high &= 0xfffff;
@@ -576,7 +603,9 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
   elttype = TYPE_TARGET_TYPE (type);
   eltlen = TYPE_LENGTH (elttype);
   len = TYPE_LENGTH (type) / eltlen;
-             
+
+  annotate_array_section_begin (i, elttype);
+
   for (; i < len && things_printed < print_max; i++)
     {
       if (i != 0)
@@ -592,7 +621,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
            }
        }
       wrap_here (n_spaces (2 + 2 * recurse));
-      
+
       rep1 = i + 1;
       reps = 1;
       while ((rep1 < len) && 
@@ -601,12 +630,15 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
          ++reps;
          ++rep1;
        }
-      
+
       if (reps > repeat_count_threshold)
        {
          val_print (elttype, valaddr + i * eltlen, 0, stream, format,
                     deref_ref, recurse + 1, pretty);
+         annotate_elt_rep (reps);
          fprintf_filtered (stream, " <repeats %u times>", reps);
+         annotate_elt_rep_end ();
+
          i = rep1 - 1;
          things_printed += repeat_count_threshold;
        }
@@ -614,9 +646,11 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
        {
          val_print (elttype, valaddr + i * eltlen, 0, stream, format,
                     deref_ref, recurse + 1, pretty);
+         annotate_elt ();
          things_printed++;
        }
     }
+  annotate_array_section_end ();
   if (i < len)
     {
       fprintf_filtered (stream, "...");
@@ -625,7 +659,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
 
 static void
 value_print_array_elements (val, stream, format, pretty)
-     value val;
+     value_ptr val;
      GDB_FILE *stream;
      int format;
      enum val_prettyprint pretty;
@@ -685,6 +719,13 @@ value_print_array_elements (val, stream, format, pretty)
     byte, otherwise printing proceeds (including null bytes) until either
     print_max or LEN characters have been printed, whichever is smaller. */
 
+/* FIXME: All callers supply LEN of zero.  Supplying a non-zero LEN is
+   pointless, this routine just then becomes a convoluted version of
+   target_read_memory_partial.  Removing all the LEN stuff would simplify
+   this routine enormously.
+
+   FIXME: Use target_read_string.  */
+
 int
 val_print_string (addr, len, stream)
     CORE_ADDR addr;
@@ -719,9 +760,10 @@ val_print_string (addr, len, stream)
      are looking for a null terminator to end the fetching, so we might as
      well read in blocks that are large enough to be efficient, but not so
      large as to be slow if fetchlimit happens to be large.  So we choose the
-     minimum of DEFAULT_PRINT_MAX and fetchlimit. */
+     minimum of 8 and fetchlimit.  We used to use 200 instead of 8 but
+     200 is way too big for remote debugging over a serial line.  */
 
-  chunksize = (len == 0 ? min (PRINT_MAX_DEFAULT, fetchlimit) : fetchlimit);
+  chunksize = (len == 0 ? min (8, fetchlimit) : fetchlimit);
 
   /* Loop until we either have all the characters to print, or we encounter
      some error, such as bumping into the end of the address space. */
@@ -760,24 +802,35 @@ val_print_string (addr, len, stream)
           after the null byte, or at the next character after the end of
           the buffer. */
        limit = bufptr + nfetch;
-       do {
-         addr++;
-         bufptr++;
-       } while (bufptr < limit && *(bufptr - 1) != '\0');
+       while (bufptr < limit)
+         {
+           ++addr;
+           ++bufptr;
+           if (bufptr[-1] == '\0')
+             {
+               /* We don't care about any error which happened after
+                  the NULL terminator.  */
+               errcode = 0;
+               break;
+             }
+         }
       }
   } while (errcode == 0                                        /* no error */
-          && bufptr < buffer + fetchlimit              /* no overrun */
+          && bufsize < fetchlimit                      /* no overrun */
           && !(len == 0 && *(bufptr - 1) == '\0'));    /* no null term */
 
+  /* bufptr and addr now point immediately beyond the last byte which we
+     consider part of the string (including a '\0' which ends the string).  */
+
   /* We now have either successfully filled the buffer to fetchlimit, or
      terminated early due to an error or finding a null byte when LEN is
-     zero. */
+     zero.  */
 
-  if (len == 0 && *(bufptr - 1) != '\0')
+  if (len == 0 && bufptr > buffer && *(bufptr - 1) != '\0')
     {
       /* We didn't find a null terminator we were looking for.  Attempt
         to peek at the next character.  If not successful, or it is not
-        a null byte, then force ellipsis to be printed. */
+        a null byte, then force ellipsis to be printed.  */
       if (target_read_memory (addr, &peekchar, 1) != 0 || peekchar != '\0')
        {
          force_ellipsis = 1;
@@ -792,26 +845,32 @@ val_print_string (addr, len, stream)
     }
 
   QUIT;
-  
-  if (addressprint)
+
+  /* If we get an error before fetching anything, don't print a string.
+     But if we fetch something and then get an error, print the string
+     and then the error message.  */
+  if (errcode == 0 || bufptr > buffer)
     {
-      fputs_filtered (" ", stream);
+      if (addressprint)
+       {
+         fputs_filtered (" ", stream);
+       }
+      LA_PRINT_STRING (stream, buffer, bufptr - buffer, force_ellipsis);
     }
-  LA_PRINT_STRING (stream, buffer, bufptr - buffer, force_ellipsis);
-  
-  if (errcode != 0 && force_ellipsis)
+
+  if (errcode != 0)
     {
       if (errcode == EIO)
        {
-         fprintf_filtered (stream,
-                           " <Address 0x%lx out of bounds>",
-                           (unsigned long) addr);
+         fprintf_filtered (stream, " <Address ");
+         print_address_numeric (addr, 1, stream);
+         fprintf_filtered (stream, " out of bounds>");
        }
       else
        {
-         error ("Error reading memory address 0x%lx: %s.",
-                (unsigned long) addr,
-                safe_strerror (errcode));
+         fprintf_filtered (stream, " <Error reading address ");
+         print_address_numeric (addr, 1, stream);
+         fprintf_filtered (stream, ": %s>", safe_strerror (errcode));
        }
     }
   gdb_flush (stream);
This page took 0.026733 seconds and 4 git commands to generate.