cli-script.c: Simplify using std::string, eliminate cleanups
[deliverable/binutils-gdb.git] / gdb / p-valprint.c
index d6373aedd4e52437a70ec3150858163b1099e506..f639e29b6258668f8c8d56e856bd421037e54e95 100644 (file)
@@ -1,7 +1,6 @@
 /* Support for printing Pascal values for GDB, the GNU debugger.
 
-   Copyright (C) 2000-2001, 2003, 2005-2012 Free Software Foundation,
-   Inc.
+   Copyright (C) 2000-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -38,7 +37,7 @@
 #include "p-lang.h"
 #include "cp-abi.h"
 #include "cp-support.h"
-#include "exceptions.h"
+#include "objfiles.h"
 \f
 
 /* Decorations for Pascal.  */
@@ -50,7 +49,9 @@ static const struct generic_val_print_decorations p_decorations =
   " * I",
   "true",
   "false",
-  "void"
+  "void",
+  "{",
+  "}"
 };
 
 /* See val_print for a description of the various parameters of this
@@ -72,10 +73,10 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
   unsigned eltlen;
   int length_pos, length_size, string_pos;
   struct type *char_type;
-  LONGEST val;
   CORE_ADDR addr;
+  int want_space = 0;
 
-  CHECK_TYPEDEF (type);
+  type = check_typedef (type);
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_ARRAY:
@@ -84,7 +85,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
          len = high_bound - low_bound + 1;
          elttype = check_typedef (TYPE_TARGET_TYPE (type));
          eltlen = TYPE_LENGTH (elttype);
-         if (options->prettyprint_arrays)
+         if (options->prettyformat_arrays)
            {
              print_spaces_filtered (2 + 2 * recurse, stream);
            }
@@ -157,7 +158,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
          /* Extract the address, assume that it is unsigned.  */
          addr = extract_unsigned_integer (valaddr + embedded_offset,
                                           TYPE_LENGTH (type), byte_order);
-         print_address_demangle (gdbarch, addr, stream, demangle);
+         print_address_demangle (options, gdbarch, addr, stream, demangle);
          break;
        }
       check_typedef (TYPE_TARGET_TYPE (type));
@@ -169,13 +170,14 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
       if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
        {
          /* Try to print what function it points to.  */
-         print_address_demangle (gdbarch, addr, stream, demangle);
+         print_address_demangle (options, gdbarch, addr, stream, demangle);
          return;
        }
 
       if (options->addressprint && options->format != 's')
        {
          fputs_filtered (paddress (gdbarch, addr), stream);
+         want_space = 1;
        }
 
       /* For a pointer to char or unsigned char, also print the string
@@ -188,6 +190,8 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
          && (options->format == 0 || options->format == 's')
          && addr != 0)
        {
+         if (want_space)
+           fputs_filtered (" ", stream);
          /* No wide string yet.  */
          i = val_print_string (elttype, NULL, addr, -1, stream, options);
        }
@@ -201,9 +205,11 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
          && addr != 0)
        {
          ULONGEST string_length;
-         void *buffer;
+         gdb_byte *buffer;
 
-         buffer = xmalloc (length_size);
+         if (want_space)
+           fputs_filtered (" ", stream);
+         buffer = (gdb_byte *) xmalloc (length_size);
          read_memory (addr + length_pos, buffer, length_size);
          string_length = extract_unsigned_integer (buffer, length_size,
                                                    byte_order);
@@ -217,27 +223,36 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
          /* Print vtbl's nicely.  */
          CORE_ADDR vt_address = unpack_pointer (type,
                                                 valaddr + embedded_offset);
-         struct minimal_symbol *msymbol =
+         struct bound_minimal_symbol msymbol =
            lookup_minimal_symbol_by_pc (vt_address);
 
-         if ((msymbol != NULL)
-             && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol)))
+         /* If 'symbol_print' is set, we did the work above.  */
+         if (!options->symbol_print
+             && (msymbol.minsym != NULL)
+             && (vt_address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
            {
-             fputs_filtered (" <", stream);
-             fputs_filtered (SYMBOL_PRINT_NAME (msymbol), stream);
+             if (want_space)
+               fputs_filtered (" ", stream);
+             fputs_filtered ("<", stream);
+             fputs_filtered (MSYMBOL_PRINT_NAME (msymbol.minsym), stream);
              fputs_filtered (">", stream);
+             want_space = 1;
            }
          if (vt_address && options->vtblprint)
            {
              struct value *vt_val;
-             struct symbol *wsym = (struct symbol *) NULL;
+             struct symbol *wsym = NULL;
              struct type *wtype;
-             struct block *block = (struct block *) NULL;
-             int is_this_fld;
+             struct block *block = NULL;
+             struct field_of_this_result is_this_fld;
 
-             if (msymbol != NULL)
-               wsym = lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol), block,
-                                     VAR_DOMAIN, &is_this_fld);
+             if (want_space)
+               fputs_filtered (" ", stream);
+
+             if (msymbol.minsym != NULL)
+               wsym = lookup_symbol (MSYMBOL_LINKAGE_NAME (msymbol.minsym),
+                                     block,
+                                     VAR_DOMAIN, &is_this_fld).symbol;
 
              if (wsym)
                {
@@ -250,7 +265,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
              vt_val = value_at (wtype, vt_address);
              common_val_print (vt_val, stream, recurse + 1, options,
                                current_language);
-             if (options->pretty)
+             if (options->prettyformat)
                {
                  fprintf_filtered (stream, "\n");
                  print_spaces_filtered (2 + 2 * recurse, stream);
@@ -292,7 +307,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_PTR.)  */
          /* Extract the address, assume that it is unsigned.  */
          print_address_demangle
-           (gdbarch,
+           (options, gdbarch,
             extract_unsigned_integer (valaddr + embedded_offset
                                       + TYPE_FIELD_BITPOS (type,
                                                            VTBL_FNADDR_OFFSET) / 8,
@@ -321,10 +336,9 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
        }
       break;
 
-    case TYPE_CODE_BITSTRING:
     case TYPE_CODE_SET:
       elttype = TYPE_INDEX_TYPE (type);
-      CHECK_TYPEDEF (elttype);
+      elttype = check_typedef (elttype);
       if (TYPE_STUB (elttype))
        {
          fprintf_filtered (stream, "<incomplete type>");
@@ -336,13 +350,9 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
          struct type *range = elttype;
          LONGEST low_bound, high_bound;
          int i;
-         int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
          int need_comma = 0;
 
-         if (is_bitstring)
-           fputs_filtered ("B'", stream);
-         else
-           fputs_filtered ("[", stream);
+         fputs_filtered ("[", stream);
 
          i = get_discrete_bounds (range, &low_bound, &high_bound);
          if (low_bound == 0 && high_bound == -1 && TYPE_LENGTH (type) > 0)
@@ -370,9 +380,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
                  i = element;
                  goto maybe_bad_bstring;
                }
-             if (is_bitstring)
-               fprintf_filtered (stream, "%d", element);
-             else if (element)
+             if (element)
                {
                  if (need_comma)
                    fputs_filtered (", ", stream);
@@ -396,10 +404,7 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
                }
            }
        done:
-         if (is_bitstring)
-           fputs_filtered ("'", stream);
-         else
-           fputs_filtered ("]", stream);
+         fputs_filtered ("]", stream);
        }
       break;
 
@@ -464,7 +469,7 @@ static void pascal_object_print_static_field (struct value *,
                                              const struct value_print_options *);
 
 static void pascal_object_print_value (struct type *, const gdb_byte *,
-                                      int,
+                                      LONGEST,
                                       CORE_ADDR, struct ui_file *, int,
                                       const struct value *,
                                       const struct value_print_options *,
@@ -480,10 +485,10 @@ const char pascal_vtbl_ptr_name[] =
 int
 pascal_object_is_vtbl_ptr_type (struct type *type)
 {
-  const char *typename = type_name_no_tag (type);
+  const char *type_name = type_name_no_tag (type);
 
-  return (typename != NULL
-         && strcmp (typename, pascal_vtbl_ptr_name) == 0);
+  return (type_name != NULL
+         && strcmp (type_name, pascal_vtbl_ptr_name) == 0);
 }
 
 /* Return truth value for the assertion that TYPE is of the type
@@ -523,7 +528,7 @@ pascal_object_is_vtbl_member (struct type *type)
 
 void
 pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
-                                 int offset,
+                                 LONGEST offset,
                                  CORE_ADDR address, struct ui_file *stream,
                                  int recurse,
                                  const struct value *val,
@@ -532,9 +537,10 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
                                  int dont_print_statmem)
 {
   int i, len, n_baseclasses;
-  char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack);
+  char *last_dont_print
+    = (char *) obstack_next_free (&dont_print_statmem_obstack);
 
-  CHECK_TYPEDEF (type);
+  type = check_typedef (type);
 
   fprintf_filtered (stream, "{");
   len = TYPE_NFIELDS (type);
@@ -572,7 +578,7 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
            fprintf_filtered (stream, ", ");
          else if (n_baseclasses > 0)
            {
-             if (options->pretty)
+             if (options->prettyformat)
                {
                  fprintf_filtered (stream, "\n");
                  print_spaces_filtered (2 + 2 * recurse, stream);
@@ -583,7 +589,7 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
            }
          fields_seen = 1;
 
-         if (options->pretty)
+         if (options->prettyformat)
            {
              fprintf_filtered (stream, "\n");
              print_spaces_filtered (2 + 2 * recurse, stream);
@@ -592,36 +598,17 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
            {
              wrap_here (n_spaces (2 + 2 * recurse));
            }
-         if (options->inspect_it)
-           {
-             if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
-               fputs_filtered ("\"( ptr \"", stream);
-             else
-               fputs_filtered ("\"( nodef \"", stream);
-             if (field_is_static (&TYPE_FIELD (type, i)))
-               fputs_filtered ("static ", stream);
-             fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
-                                      language_cplus,
-                                      DMGL_PARAMS | DMGL_ANSI);
-             fputs_filtered ("\" \"", stream);
-             fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
-                                      language_cplus,
-                                      DMGL_PARAMS | DMGL_ANSI);
-             fputs_filtered ("\") \"", stream);
-           }
-         else
-           {
-             annotate_field_begin (TYPE_FIELD_TYPE (type, i));
-
-             if (field_is_static (&TYPE_FIELD (type, i)))
-               fputs_filtered ("static ", stream);
-             fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
-                                      language_cplus,
-                                      DMGL_PARAMS | DMGL_ANSI);
-             annotate_field_name_end ();
-             fputs_filtered (" = ", stream);
-             annotate_field_value ();
-           }
+
+         annotate_field_begin (TYPE_FIELD_TYPE (type, i));
+
+         if (field_is_static (&TYPE_FIELD (type, i)))
+           fputs_filtered ("static ", stream);
+         fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
+                                  language_cplus,
+                                  DMGL_PARAMS | DMGL_ANSI);
+         annotate_field_name_end ();
+         fputs_filtered (" = ", stream);
+         annotate_field_value ();
 
          if (!field_is_static (&TYPE_FIELD (type, i))
              && TYPE_FIELD_PACKED (type, i))
@@ -642,11 +629,6 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
                {
                  fputs_filtered (_("<synthetic pointer>"), stream);
                }
-             else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
-                                         TYPE_FIELD_BITSIZE (type, i)))
-               {
-                 val_print_optimized_out (stream);
-               }
              else
                {
                  struct value_print_options opts = *options;
@@ -673,7 +655,7 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
                  v = value_field_bitfield (type, i, valaddr, offset, val);
 
                  if (v == NULL)
-                   val_print_optimized_out (stream);
+                   val_print_optimized_out (NULL, stream);
                  else
                    pascal_object_print_static_field (v, stream, recurse + 1,
                                                      options);
@@ -704,7 +686,7 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
          dont_print_statmem_obstack = tmp_obstack;
        }
 
-      if (options->pretty)
+      if (options->prettyformat)
        {
          fprintf_filtered (stream, "\n");
          print_spaces_filtered (2 * recurse, stream);
@@ -718,7 +700,7 @@ pascal_object_print_value_fields (struct type *type, const gdb_byte *valaddr,
 
 static void
 pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
-                          int offset,
+                          LONGEST offset,
                           CORE_ADDR address, struct ui_file *stream,
                           int recurse,
                           const struct value *val,
@@ -741,12 +723,11 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
 
   for (i = 0; i < n_baseclasses; i++)
     {
-      int boffset = 0;
+      LONGEST boffset = 0;
       struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
       const char *basename = type_name_no_tag (baseclass);
       const gdb_byte *base_valaddr = NULL;
-      int thisoffset;
-      volatile struct gdb_exception ex;
+      LONGEST thisoffset;
       int skip = 0;
 
       if (BASETYPE_VIA_VIRTUAL (type, i))
@@ -766,26 +747,32 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
 
       thisoffset = offset;
 
-      TRY_CATCH (ex, RETURN_MASK_ERROR)
+      TRY
        {
          boffset = baseclass_offset (type, i, valaddr, offset, address, val);
        }
-      if (ex.reason < 0 && ex.error == NOT_AVAILABLE_ERROR)
-       skip = -1;
-      else if (ex.reason < 0)
-       skip = 1;
-      else
+      CATCH (ex, RETURN_MASK_ERROR)
        {
-         skip = 0;
+         if (ex.error == NOT_AVAILABLE_ERROR)
+           skip = -1;
+         else
+           skip = 1;
+       }
+      END_CATCH
 
+      if (skip == 0)
+       {
          /* The virtual base class pointer might have been clobbered by the
             user program. Make sure that it still points to a valid memory
             location.  */
 
          if (boffset < 0 || boffset >= TYPE_LENGTH (type))
            {
-             /* FIXME (alloc): not safe is baseclass is really really big. */
-             gdb_byte *buf = alloca (TYPE_LENGTH (baseclass));
+             gdb_byte *buf;
+             struct cleanup *back_to;
+
+             buf = (gdb_byte *) xmalloc (TYPE_LENGTH (baseclass));
+             back_to = make_cleanup (xfree, buf);
 
              base_valaddr = buf;
              if (target_read_memory (address + boffset, buf,
@@ -794,12 +781,13 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr,
              address = address + boffset;
              thisoffset = 0;
              boffset = 0;
+             do_cleanups (back_to);
            }
          else
            base_valaddr = valaddr;
        }
 
-      if (options->pretty)
+      if (options->prettyformat)
        {
          fprintf_filtered (stream, "\n");
          print_spaces_filtered (2 * recurse, stream);
@@ -856,6 +844,12 @@ pascal_object_print_static_field (struct value *val,
   struct type *type = value_type (val);
   struct value_print_options opts;
 
+  if (value_entirely_optimized_out (val))
+    {
+      val_print_optimized_out (val, stream);
+      return;
+    }
+
   if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
     {
       CORE_ADDR *first_dont_print, addr;
@@ -881,7 +875,7 @@ pascal_object_print_static_field (struct value *val,
       obstack_grow (&dont_print_statmem_obstack, (char *) &addr,
                    sizeof (CORE_ADDR));
 
-      CHECK_TYPEDEF (type);
+      type = check_typedef (type);
       pascal_object_print_value_fields (type,
                                        value_contents_for_printing (val),
                                        value_embedded_offset (val),
This page took 0.03111 seconds and 4 git commands to generate.