Move gdb's xmalloc and friends to new file
[external/binutils.git] / gdb / valprint.c
index bed2cec..4c3d67a 100644 (file)
@@ -1,6 +1,6 @@
 /* Print values for GDB, the GNU debugger.
 
-   Copyright (C) 1986-2018 Free Software Foundation, Inc.
+   Copyright (C) 1986-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -88,6 +88,7 @@ static void val_print_type_code_flags (struct type *type,
                                       struct ui_file *stream);
 
 #define PRINT_MAX_DEFAULT 200  /* Start print_max off at this value.  */
+#define PRINT_MAX_DEPTH_DEFAULT 20     /* Start print_max_depth off at this value. */
 
 struct value_print_options user_print_options =
 {
@@ -109,7 +110,9 @@ struct value_print_options user_print_options =
   1,                           /* pascal_static_field_print */
   0,                           /* raw */
   0,                           /* summary */
-  1                            /* symbol_print */
+  1,                           /* symbol_print */
+  PRINT_MAX_DEPTH_DEFAULT,     /* max_depth */
+  1                            /* finish_print */
 };
 
 /* Initialize *OPTS to be a copy of the user print options.  */
@@ -281,6 +284,18 @@ val_print_scalar_type_p (struct type *type)
     }
 }
 
+/* A helper function for val_print.  When printing with limited depth we
+   want to print string and scalar arguments, but not aggregate arguments.
+   This function distinguishes between the two.  */
+
+static bool
+val_print_scalar_or_string_type_p (struct type *type,
+                                  const struct language_defn *language)
+{
+  return (val_print_scalar_type_p (type)
+         || language->la_is_string_type_p (type));
+}
+
 /* See its definition in value.h.  */
 
 int
@@ -986,7 +1001,6 @@ generic_val_print (struct type *type,
       error (_("Unhandled type code %d in symbol table."),
             TYPE_CODE (type));
     }
-  gdb_flush (stream);
 }
 
 /* Print using the given LANGUAGE the data of type TYPE located at
@@ -1032,7 +1046,6 @@ val_print (struct type *type, LONGEST embedded_offset,
   if (TYPE_STUB (real_type))
     {
       fprintf_filtered (stream, _("<incomplete type>"));
-      gdb_flush (stream);
       return;
     }
 
@@ -1056,17 +1069,38 @@ val_print (struct type *type, LONGEST embedded_offset,
       return;
     }
 
-  TRY
+  /* If this value is too deep then don't print it.  */
+  if (!val_print_scalar_or_string_type_p (type, language)
+      && val_print_check_max_depth (stream, recurse, options, language))
+    return;
+
+  try
     {
       language->la_val_print (type, embedded_offset, address,
                              stream, recurse, val,
                              &local_opts);
     }
-  CATCH (except, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &except)
     {
       fprintf_filtered (stream, _("<error reading variable>"));
     }
-  END_CATCH
+}
+
+/* See valprint.h.  */
+
+bool
+val_print_check_max_depth (struct ui_file *stream, int recurse,
+                          const struct value_print_options *options,
+                          const struct language_defn *language)
+{
+  if (options->max_depth > -1 && recurse >= options->max_depth)
+    {
+      gdb_assert (language->la_struct_too_deep_ellipsis != NULL);
+      fputs_filtered (language->la_struct_too_deep_ellipsis, stream);
+      return true;
+    }
+
+  return false;
 }
 
 /* Check whether the value VAL is printable.  Return 1 if it is;
@@ -1604,6 +1638,7 @@ maybe_negate_by_bytes (const gdb_byte *bytes, unsigned len,
                       gdb::byte_vector *out_vec)
 {
   gdb_byte sign_byte;
+  gdb_assert (len > 0);
   if (byte_order == BFD_ENDIAN_BIG)
     sign_byte = bytes[0];
   else
@@ -1885,7 +1920,7 @@ print_function_pointer_address (const struct value_print_options *options,
 {
   CORE_ADDR func_addr
     = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
-                                         target_stack);
+                                         current_top_target ());
 
   /* If the function pointer is represented by a description, print
      the address of the description.  */
@@ -2096,10 +2131,10 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
   return (nread);
 }
 
-/* Read a string from the inferior, at ADDR, with LEN characters of WIDTH bytes
-   each.  Fetch at most FETCHLIMIT characters.  BUFFER will be set to a newly
-   allocated buffer containing the string, which the caller is responsible to
-   free, and BYTES_READ will be set to the number of bytes read.  Returns 0 on
+/* Read a string from the inferior, at ADDR, with LEN characters of
+   WIDTH bytes each.  Fetch at most FETCHLIMIT characters.  BUFFER
+   will be set to a newly allocated buffer containing the string, and
+   BYTES_READ will be set to the number of bytes read.  Returns 0 on
    success, or a target_xfer_status on failure.
 
    If LEN > 0, reads the lesser of LEN or FETCHLIMIT characters
@@ -2122,20 +2157,18 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
 
 int
 read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
-            enum bfd_endian byte_order, gdb_byte **buffer, int *bytes_read)
+            enum bfd_endian byte_order, gdb::unique_xmalloc_ptr<gdb_byte> *buffer,
+            int *bytes_read)
 {
   int errcode;                 /* Errno returned from bad reads.  */
   unsigned int nfetch;         /* Chars to fetch / chars fetched.  */
   gdb_byte *bufptr;            /* Pointer to next available byte in
                                   buffer.  */
-  struct cleanup *old_chain = NULL;    /* Top of the old cleanup chain.  */
 
   /* Loop until we either have all the characters, or we encounter
      some error, such as bumping into the end of the address space.  */
 
-  *buffer = NULL;
-
-  old_chain = make_cleanup (free_current_contents, buffer);
+  buffer->reset (nullptr);
 
   if (len > 0)
     {
@@ -2143,8 +2176,8 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
         one operation.  */
       unsigned int fetchlen = std::min ((unsigned) len, fetchlimit);
 
-      *buffer = (gdb_byte *) xmalloc (fetchlen * width);
-      bufptr = *buffer;
+      buffer->reset ((gdb_byte *) xmalloc (fetchlen * width));
+      bufptr = buffer->get ();
 
       nfetch = partial_memory_read (addr, bufptr, fetchlen * width, &errcode)
        / width;
@@ -2173,12 +2206,12 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
          nfetch = std::min ((unsigned long) chunksize, fetchlimit - bufsize);
 
          if (*buffer == NULL)
-           *buffer = (gdb_byte *) xmalloc (nfetch * width);
+           buffer->reset ((gdb_byte *) xmalloc (nfetch * width));
          else
-           *buffer = (gdb_byte *) xrealloc (*buffer,
-                                            (nfetch + bufsize) * width);
+           buffer->reset ((gdb_byte *) xrealloc (buffer->release (),
+                                                 (nfetch + bufsize) * width));
 
-         bufptr = *buffer + bufsize * width;
+         bufptr = buffer->get () + bufsize * width;
          bufsize += nfetch;
 
          /* Read as much as we can.  */
@@ -2210,24 +2243,23 @@ read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
            }
        }
       while (errcode == 0      /* no error */
-            && bufptr - *buffer < fetchlimit * width   /* no overrun */
+            && bufptr - buffer->get () < fetchlimit * width    /* no overrun */
             && !found_nul);    /* haven't found NUL yet */
     }
   else
     {                          /* Length of string is really 0!  */
       /* We always allocate *buffer.  */
-      *buffer = bufptr = (gdb_byte *) xmalloc (1);
+      buffer->reset ((gdb_byte *) xmalloc (1));
+      bufptr = buffer->get ();
       errcode = 0;
     }
 
   /* bufptr and addr now point immediately beyond the last byte which we
      consider part of the string (including a '\0' which ends the string).  */
-  *bytes_read = bufptr - *buffer;
+  *bytes_read = bufptr - buffer->get ();
 
   QUIT;
 
-  discard_cleanups (old_chain);
-
   return errcode;
 }
 
@@ -2363,13 +2395,13 @@ generic_emit_char (int c, struct type *type, struct ui_file *stream,
 {
   enum bfd_endian byte_order
     = gdbarch_byte_order (get_type_arch (type));
-  gdb_byte *buf;
+  gdb_byte *c_buf;
   int need_escape = 0;
 
-  buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
-  pack_long (buf, type, c);
+  c_buf = (gdb_byte *) alloca (TYPE_LENGTH (type));
+  pack_long (c_buf, type, c);
 
-  wchar_iterator iter (buf, TYPE_LENGTH (type), encoding, TYPE_LENGTH (type));
+  wchar_iterator iter (c_buf, TYPE_LENGTH (type), encoding, TYPE_LENGTH (type));
 
   /* This holds the printable form of the wchar_t data.  */
   auto_obstack wchar_buf;
@@ -2515,7 +2547,7 @@ count_next_character (wchar_iterator *iter,
 
 /* Print the characters in CHARS to the OBSTACK.  QUOTE_CHAR is the quote
    character to use with string output.  WIDTH is the size of the output
-   character type.  BYTE_ORDER is the the target byte order.  OPTIONS
+   character type.  BYTE_ORDER is the target byte order.  OPTIONS
    is the user's print options.  */
 
 static void
@@ -2575,7 +2607,6 @@ print_converted_chars_to_obstack (struct obstack *obstack,
        case REPEAT:
          {
            int j;
-           char *s;
 
            /* We are outputting a character with a repeat count
               greater than options->repeat_count_threshold.  */
@@ -2598,13 +2629,13 @@ print_converted_chars_to_obstack (struct obstack *obstack,
              print_wchar (gdb_WEOF, elem->buf, elem->buflen, width,
                           byte_order, obstack, quote_char, &need_escape);
            obstack_grow_wstr (obstack, LCST ("'"));
-           s = xstrprintf (_(" <repeats %u times>"), elem->repeat_count);
+           std::string s = string_printf (_(" <repeats %u times>"),
+                                          elem->repeat_count);
            for (j = 0; s[j]; ++j)
              {
                gdb_wchar_t w = gdb_btowc (s[j]);
                obstack_grow (obstack, &w, sizeof (gdb_wchar_t));
              }
-           xfree (s);
          }
          break;
 
@@ -2793,8 +2824,7 @@ val_print_string (struct type *elttype, const char *encoding,
   int found_nul;               /* Non-zero if we found the nul char.  */
   unsigned int fetchlimit;     /* Maximum number of chars to print.  */
   int bytes_read;
-  gdb_byte *buffer = NULL;     /* Dynamically growable fetch buffer.  */
-  struct cleanup *old_chain = NULL;    /* Top of the old cleanup chain.  */
+  gdb::unique_xmalloc_ptr<gdb_byte> buffer;    /* Dynamically growable fetch buffer.  */
   struct gdbarch *gdbarch = get_type_arch (elttype);
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int width = TYPE_LENGTH (elttype);
@@ -2812,7 +2842,6 @@ val_print_string (struct type *elttype, const char *encoding,
 
   err = read_string (addr, len, width, fetchlimit, byte_order,
                     &buffer, &bytes_read);
-  old_chain = make_cleanup (xfree, buffer);
 
   addr += bytes_read;
 
@@ -2823,8 +2852,8 @@ val_print_string (struct type *elttype, const char *encoding,
   /* Determine found_nul by looking at the last character read.  */
   found_nul = 0;
   if (bytes_read >= width)
-    found_nul = extract_unsigned_integer (buffer + bytes_read - width, width,
-                                         byte_order) == 0;
+    found_nul = extract_unsigned_integer (buffer.get () + bytes_read - width,
+                                         width, byte_order) == 0;
   if (len == -1 && !found_nul)
     {
       gdb_byte *peekbuf;
@@ -2852,7 +2881,7 @@ val_print_string (struct type *elttype, const char *encoding,
      and then the error message.  */
   if (err == 0 || bytes_read > 0)
     {
-      LA_PRINT_STRING (stream, elttype, buffer, bytes_read / width,
+      LA_PRINT_STRING (stream, elttype, buffer.get (), bytes_read / width,
                       encoding, force_ellipsis, options);
     }
 
@@ -2865,11 +2894,17 @@ val_print_string (struct type *elttype, const char *encoding,
       fprintf_filtered (stream, ">");
     }
 
-  gdb_flush (stream);
-  do_cleanups (old_chain);
-
   return (bytes_read / width);
 }
+
+/* Handle 'show print max-depth'.  */
+
+static void
+show_print_max_depth (struct ui_file *file, int from_tty,
+                     struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Maximum print depth is %s.\n"), value);
+}
 \f
 
 /* The 'set input-radix' command writes to this auxiliary variable.
@@ -3163,4 +3198,14 @@ Use 'show input-radix' or 'show output-radix' to independently show each."),
 Set printing of array indexes."), _("\
 Show printing of array indexes"), NULL, NULL, show_print_array_indexes,
                            &setprintlist, &showprintlist);
+
+  add_setshow_zuinteger_unlimited_cmd ("max-depth", class_support,
+                            &user_print_options.max_depth, _("\
+Set maximum print depth for nested structures, unions and arrays."), _("\
+Show maximum print depth for nested structures, unions, and arrays."), _("\
+When structures, unions, or arrays are nested beyond this depth then they\n\
+will be replaced with either '{...}' or '(...)' depending on the language.\n\
+Use 'set print max-depth unlimited' to print the complete structure."),
+                                      NULL, show_print_max_depth,
+                                      &setprintlist, &showprintlist);
 }