[arm] Cleanup: use hex for offsets
[binutils-gdb.git] / gdb / p-valprint.c
index 428b2efc656629472d2ea96731b7e5fc2771939e..43c286d6472705cd3bfdda9c27a3daaa660faef2 100644 (file)
@@ -1,6 +1,6 @@
 /* Support for printing Pascal values for GDB, the GNU debugger.
 
-   Copyright (C) 2000-2020 Free Software Foundation, Inc.
+   Copyright (C) 2000-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -20,7 +20,7 @@
 /* This file is derived from c-valprint.c */
 
 #include "defs.h"
-#include "gdb_obstack.h"
+#include "gdbsupport/gdb_obstack.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
@@ -64,13 +64,13 @@ static const struct generic_val_print_decorations p_decorations =
 /* See p-lang.h.  */
 
 void
-pascal_value_print_inner (struct value *val, struct ui_file *stream,
-                         int recurse,
-                         const struct value_print_options *options)
+pascal_language::value_print_inner (struct value *val,
+                                   struct ui_file *stream, int recurse,
+                                   const struct value_print_options *options) const
 
 {
   struct type *type = check_typedef (value_type (val));
-  struct gdbarch *gdbarch = get_type_arch (type);
+  struct gdbarch *gdbarch = type->arch ();
   enum bfd_endian byte_order = type_byte_order (type);
   unsigned int i = 0;  /* Number of characters printed */
   unsigned len;
@@ -80,7 +80,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
   struct type *char_type;
   CORE_ADDR addr;
   int want_space = 0;
-  const gdb_byte *valaddr = value_contents_for_printing (val);
+  const gdb_byte *valaddr = value_contents_for_printing (val).data ();
 
   switch (type->code ())
     {
@@ -116,26 +116,26 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
                    len = temp_len;
                  }
 
-               LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type),
-                                valaddr, len, NULL, 0, options);
+               printstr (stream, TYPE_TARGET_TYPE (type), valaddr, len,
+                         NULL, 0, options);
                i = len;
              }
            else
              {
-               fprintf_filtered (stream, "{");
+               gdb_printf (stream, "{");
                /* If this is a virtual function table, print the 0th
                   entry specially, and the rest of the members normally.  */
                if (pascal_object_is_vtbl_ptr_type (elttype))
                  {
                    i = 1;
-                   fprintf_filtered (stream, "%d vtable entries", len - 1);
+                   gdb_printf (stream, "%d vtable entries", len - 1);
                  }
                else
                  {
                    i = 0;
                  }
                value_print_array_elements (val, stream, recurse, options, i);
-               fprintf_filtered (stream, "}");
+               gdb_printf (stream, "}");
              }
            break;
          }
@@ -176,7 +176,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
 
       if (options->addressprint && options->format != 's')
        {
-         fputs_filtered (paddress (gdbarch, addr), stream);
+         gdb_puts (paddress (gdbarch, addr), stream);
          want_space = 1;
        }
 
@@ -191,7 +191,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
          && addr != 0)
        {
          if (want_space)
-           fputs_filtered (" ", stream);
+           gdb_puts (" ", stream);
          /* No wide string yet.  */
          i = val_print_string (elttype, NULL, addr, -1, stream, options);
        }
@@ -200,15 +200,15 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
         as GDB does not recognize stabs pascal strings
         Pascal strings are mapped to records
         with lowercase names PM.  */
-      if (is_pascal_string_type (elttype, &length_pos, &length_size,
-                                &string_pos, &char_type, NULL)
+      if (pascal_is_string_type (elttype, &length_pos, &length_size,
+                                &string_pos, &char_type, NULL) > 0
          && addr != 0)
        {
          ULONGEST string_length;
          gdb_byte *buffer;
 
          if (want_space)
-           fputs_filtered (" ", stream);
+           gdb_puts (" ", stream);
          buffer = (gdb_byte *) xmalloc (length_size);
          read_memory (addr + length_pos, buffer, length_size);
          string_length = extract_unsigned_integer (buffer, length_size,
@@ -228,13 +228,13 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
          /* If 'symbol_print' is set, we did the work above.  */
          if (!options->symbol_print
              && (msymbol.minsym != NULL)
-             && (vt_address == BMSYMBOL_VALUE_ADDRESS (msymbol)))
+             && (vt_address == msymbol.value_address ()))
            {
              if (want_space)
-               fputs_filtered (" ", stream);
-             fputs_filtered ("<", stream);
-             fputs_filtered (msymbol.minsym->print_name (), stream);
-             fputs_filtered (">", stream);
+               gdb_puts (" ", stream);
+             gdb_puts ("<", stream);
+             gdb_puts (msymbol.minsym->print_name (), stream);
+             gdb_puts (">", stream);
              want_space = 1;
            }
          if (vt_address && options->vtblprint)
@@ -244,7 +244,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
              struct type *wtype;
 
              if (want_space)
-               fputs_filtered (" ", stream);
+               gdb_puts (" ", stream);
 
              if (msymbol.minsym != NULL)
                {
@@ -255,7 +255,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
 
              if (wsym)
                {
-                 wtype = SYMBOL_TYPE (wsym);
+                 wtype = wsym->type ();
                }
              else
                {
@@ -266,8 +266,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
                                current_language);
              if (options->prettyformat)
                {
-                 fprintf_filtered (stream, "\n");
-                 print_spaces_filtered (2 + 2 * recurse, stream);
+                 gdb_printf (stream, "\n");
+                 print_spaces (2 + 2 * recurse, stream);
                }
            }
        }
@@ -292,7 +292,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
     case TYPE_CODE_UNION:
       if (recurse && !options->unionprint)
        {
-         fprintf_filtered (stream, "{...}");
+         gdb_printf (stream, "{...}");
          break;
        }
       /* Fall through.  */
@@ -306,20 +306,20 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
          print_address_demangle
            (options, gdbarch,
             extract_unsigned_integer
-              (valaddr + TYPE_FIELD_BITPOS (type, VTBL_FNADDR_OFFSET) / 8,
+              (valaddr + type->field (VTBL_FNADDR_OFFSET).loc_bitpos () / 8,
                TYPE_LENGTH (type->field (VTBL_FNADDR_OFFSET).type ()),
                byte_order),
             stream, demangle);
        }
       else
        {
-         if (is_pascal_string_type (type, &length_pos, &length_size,
-                                    &string_pos, &char_type, NULL))
+         if (pascal_is_string_type (type, &length_pos, &length_size,
+                                    &string_pos, &char_type, NULL) > 0)
            {
              len = extract_unsigned_integer (valaddr + length_pos,
                                              length_size, byte_order);
-             LA_PRINT_STRING (stream, char_type, valaddr + string_pos,
-                              len, NULL, 0, options);
+             printstr (stream, char_type, valaddr + string_pos, len,
+                       NULL, 0, options);
            }
          else
            pascal_object_print_value_fields (val, stream, recurse,
@@ -341,9 +341,10 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
          LONGEST low_bound, high_bound;
          int need_comma = 0;
 
-         fputs_filtered ("[", stream);
+         gdb_puts ("[", stream);
 
-         int bound_info = get_discrete_bounds (range, &low_bound, &high_bound);
+         int bound_info = (get_discrete_bounds (range, &low_bound, &high_bound)
+                           ? 0 : -1);
          if (low_bound == 0 && high_bound == -1 && TYPE_LENGTH (type) > 0)
            {
              /* If we know the size of the set type, we can figure out the
@@ -371,7 +372,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
              if (element)
                {
                  if (need_comma)
-                   fputs_filtered (", ", stream);
+                   gdb_puts (", ", stream);
                  print_type_scalar (range, i, stream);
                  need_comma = 1;
 
@@ -380,7 +381,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
                    {
                      int j = i;
 
-                     fputs_filtered ("..", stream);
+                     gdb_puts ("..", stream);
                      while (i + 1 <= high_bound
                             && value_bit_index (type, valaddr, ++i))
                        j = i;
@@ -389,7 +390,7 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
                }
            }
        done:
-         fputs_filtered ("]", stream);
+         gdb_puts ("]", stream);
        }
       break;
 
@@ -401,8 +402,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
 
 \f
 void
-pascal_value_print (struct value *val, struct ui_file *stream,
-                   const struct value_print_options *options)
+pascal_language::value_print (struct value *val, struct ui_file *stream,
+                             const struct value_print_options *options) const
 {
   struct type *type = value_type (val);
   struct value_print_options opts = *options;
@@ -429,9 +430,9 @@ pascal_value_print (struct value *val, struct ui_file *stream,
        }
       else
        {
-         fprintf_filtered (stream, "(");
+         gdb_printf (stream, "(");
          type_print (type, "", stream, -1);
-         fprintf_filtered (stream, ") ");
+         gdb_printf (stream, ") ");
        }
     }
   common_val_print (val, stream, 0, &opts, current_language);
@@ -442,8 +443,8 @@ static void
 show_pascal_static_field_print (struct ui_file *file, int from_tty,
                                struct cmd_list_element *c, const char *value)
 {
-  fprintf_filtered (file, _("Printing of pascal static members is %s.\n"),
-                   value);
+  gdb_printf (file, _("Printing of pascal static members is %s.\n"),
+             value);
 }
 
 static struct obstack dont_print_vb_obstack;
@@ -498,9 +499,7 @@ pascal_object_is_vtbl_member (struct type *type)
   return 0;
 }
 
-/* Mutually recursive subroutines of pascal_object_print_value and
-   pascal_value_print to print out a structure's fields:
-   pascal_object_print_value_fields and pascal_object_print_value.
+/* Helper function for print pascal objects.
 
    VAL, STREAM, RECURSE, and OPTIONS have the same meanings as in
    pascal_object_print_value and c_value_print.
@@ -521,7 +520,7 @@ pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
 
   struct type *type = check_typedef (value_type (val));
 
-  fprintf_filtered (stream, "{");
+  gdb_printf (stream, "{");
   len = type->num_fields ();
   n_baseclasses = TYPE_N_BASECLASSES (type);
 
@@ -537,7 +536,7 @@ pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
     {
       struct obstack tmp_obstack = dont_print_statmem_obstack;
       int fields_seen = 0;
-      const gdb_byte *valaddr = value_contents_for_printing (val);
+      const gdb_byte *valaddr = value_contents_for_printing (val).data ();
 
       if (dont_print_statmem == 0)
        {
@@ -554,45 +553,45 @@ pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
              && field_is_static (&type->field (i)))
            continue;
          if (fields_seen)
-           fprintf_filtered (stream, ", ");
+           gdb_printf (stream, ", ");
          else if (n_baseclasses > 0)
            {
              if (options->prettyformat)
                {
-                 fprintf_filtered (stream, "\n");
-                 print_spaces_filtered (2 + 2 * recurse, stream);
-                 fputs_filtered ("members of ", stream);
-                 fputs_filtered (type->name (), stream);
-                 fputs_filtered (": ", stream);
+                 gdb_printf (stream, "\n");
+                 print_spaces (2 + 2 * recurse, stream);
+                 gdb_puts ("members of ", stream);
+                 gdb_puts (type->name (), stream);
+                 gdb_puts (": ", stream);
                }
            }
          fields_seen = 1;
 
          if (options->prettyformat)
            {
-             fprintf_filtered (stream, "\n");
-             print_spaces_filtered (2 + 2 * recurse, stream);
+             gdb_printf (stream, "\n");
+             print_spaces (2 + 2 * recurse, stream);
            }
          else
            {
-             wrap_here (n_spaces (2 + 2 * recurse));
+             stream->wrap_here (2 + 2 * recurse);
            }
 
          annotate_field_begin (type->field (i).type ());
 
          if (field_is_static (&type->field (i)))
            {
-             fputs_filtered ("static ", stream);
-             fprintf_symbol_filtered (stream,
-                                      TYPE_FIELD_NAME (type, i),
-                                      current_language->la_language,
-                                      DMGL_PARAMS | DMGL_ANSI);
+             gdb_puts ("static ", stream);
+             fprintf_symbol (stream,
+                             type->field (i).name (),
+                             current_language->la_language,
+                             DMGL_PARAMS | DMGL_ANSI);
            }
          else
-           fputs_styled (TYPE_FIELD_NAME (type, i),
+           fputs_styled (type->field (i).name (),
                          variable_name_style.style (), stream);
          annotate_field_name_end ();
-         fputs_filtered (" = ", stream);
+         gdb_puts (" = ", stream);
          annotate_field_value ();
 
          if (!field_is_static (&type->field (i))
@@ -607,11 +606,9 @@ pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
                  fputs_styled ("<optimized out or zero length>",
                                metadata_style.style (), stream);
                }
-             else if (value_bits_synthetic_pointer (val,
-                                                    TYPE_FIELD_BITPOS (type,
-                                                                       i),
-                                                    TYPE_FIELD_BITSIZE (type,
-                                                                        i)))
+             else if (value_bits_synthetic_pointer
+                        (val, type->field (i).loc_bitpos (),
+                         TYPE_FIELD_BITSIZE (type, i)))
                {
                  fputs_styled (_("<synthetic pointer>"),
                                metadata_style.style (), stream);
@@ -673,11 +670,11 @@ pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
 
       if (options->prettyformat)
        {
-         fprintf_filtered (stream, "\n");
-         print_spaces_filtered (2 * recurse, stream);
+         gdb_printf (stream, "\n");
+         print_spaces (2 * recurse, stream);
        }
     }
-  fprintf_filtered (stream, "}");
+  gdb_printf (stream, "}");
 }
 
 /* Special val_print routine to avoid printing multiple copies of virtual
@@ -764,15 +761,15 @@ pascal_object_print_value (struct value *val, struct ui_file *stream,
 
       if (options->prettyformat)
        {
-         fprintf_filtered (stream, "\n");
-         print_spaces_filtered (2 * recurse, stream);
+         gdb_printf (stream, "\n");
+         print_spaces (2 * recurse, stream);
        }
-      fputs_filtered ("<", stream);
+      gdb_puts ("<", stream);
       /* Not sure what the best notation is in the case where there is no
         baseclass name.  */
 
-      fputs_filtered (basename ? basename : "", stream);
-      fputs_filtered ("> = ", stream);
+      gdb_puts (basename ? basename : "", stream);
+      gdb_puts ("> = ", stream);
 
       if (skip < 0)
        val_print_unavailable (stream);
@@ -783,7 +780,7 @@ pascal_object_print_value (struct value *val, struct ui_file *stream,
          (base_value, stream, recurse, options,
           (struct type **) obstack_base (&dont_print_vb_obstack),
           0);
-      fputs_filtered (", ", stream);
+      gdb_puts (", ", stream);
 
     flush_it:
       ;