Enable async mode in the target in attach_cmd.
[binutils-gdb.git] / gdb / p-valprint.c
index 284dc85bf8c816434c241f44d2d259c164bd6b4b..8334ab9fe8443f1a2c7f18e69417ec5e8f0949e4 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,8 +116,8 @@ 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
@@ -184,9 +184,9 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
         pointed to, unless pointer is null.  */
       if (((TYPE_LENGTH (elttype) == 1
           && (elttype->code () == TYPE_CODE_INT
-               || elttype->code () == TYPE_CODE_CHAR))
-           || ((TYPE_LENGTH (elttype) == 2 || TYPE_LENGTH (elttype) == 4)
-               && elttype->code () == TYPE_CODE_CHAR))
+              || elttype->code () == TYPE_CODE_CHAR))
+          || ((TYPE_LENGTH (elttype) == 2 || TYPE_LENGTH (elttype) == 4)
+              && elttype->code () == TYPE_CODE_CHAR))
          && (options->format == 0 || options->format == 's')
          && addr != 0)
        {
@@ -200,8 +200,8 @@ 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;
@@ -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
                {
@@ -305,23 +305,21 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
          /* Extract the address, assume that it is unsigned.  */
          print_address_demangle
            (options, gdbarch,
-            extract_unsigned_integer (valaddr
-                                      + TYPE_FIELD_BITPOS (type,
-                                                           VTBL_FNADDR_OFFSET) / 8,
-                                      TYPE_LENGTH (TYPE_FIELD_TYPE (type,
-                                                                    VTBL_FNADDR_OFFSET)),
-                                      byte_order),
+            extract_unsigned_integer
+              (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,
@@ -330,9 +328,9 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
       break;
 
     case TYPE_CODE_SET:
-      elttype = TYPE_INDEX_TYPE (type);
+      elttype = type->index_type ();
       elttype = check_typedef (elttype);
-      if (TYPE_STUB (elttype))
+      if (elttype->is_stub ())
        {
          fprintf_styled (stream, metadata_style.style (), "<incomplete type>");
          break;
@@ -345,14 +343,15 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream,
 
          fputs_filtered ("[", 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
              maximum value.  */
              bound_info = 0;
              high_bound = TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1;
-             TYPE_HIGH_BOUND (range) = high_bound;
+             range->bounds ()->high.set_const_val (high_bound);
            }
        maybe_bad_bstring:
          if (bound_info < 0)
@@ -403,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;
@@ -421,7 +420,7 @@ pascal_value_print (struct value *val, struct ui_file *stream,
       || type->code () == TYPE_CODE_REF)
     {
       /* Hack:  remove (char *) for char strings.  Their
-         type is indicated by the quoted string anyway.  */
+        type is indicated by the quoted string anyway.  */
       if (type->code () == TYPE_CODE_PTR
          && type->name () == NULL
          && TYPE_TARGET_TYPE (type)->name () != NULL
@@ -492,7 +491,7 @@ pascal_object_is_vtbl_member (struct type *type)
              || type->code () == TYPE_CODE_PTR)        /* If using thunks.  */
            {
              /* Virtual functions tables are full of pointers
-                to virtual functions.  */
+                to virtual functions.  */
              return pascal_object_is_vtbl_ptr_type (type);
            }
        }
@@ -500,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.
@@ -539,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)
        {
@@ -553,7 +550,7 @@ pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
        {
          /* If requested, skip printing of static fields.  */
          if (!options->pascal_static_field_print
-             && field_is_static (&TYPE_FIELD (type, i)))
+             && field_is_static (&type->field (i)))
            continue;
          if (fields_seen)
            fprintf_filtered (stream, ", ");
@@ -577,43 +574,41 @@ pascal_object_print_value_fields (struct value *val, struct ui_file *stream,
            }
          else
            {
-             wrap_here (n_spaces (2 + 2 * recurse));
+             stream->wrap_here (2 + 2 * recurse);
            }
 
-         annotate_field_begin (TYPE_FIELD_TYPE (type, i));
+         annotate_field_begin (type->field (i).type ());
 
-         if (field_is_static (&TYPE_FIELD (type, i)))
+         if (field_is_static (&type->field (i)))
            {
              fputs_filtered ("static ", stream);
              fprintf_symbol_filtered (stream,
-                                      TYPE_FIELD_NAME (type, i),
+                                      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);
          annotate_field_value ();
 
-         if (!field_is_static (&TYPE_FIELD (type, i))
+         if (!field_is_static (&type->field (i))
              && TYPE_FIELD_PACKED (type, i))
            {
              struct value *v;
 
              /* Bitfields require special handling, especially due to byte
-                order problems.  */
+                order problems.  */
              if (TYPE_FIELD_IGNORE (type, i))
                {
                  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);
@@ -636,7 +631,7 @@ 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 (field_is_static (&TYPE_FIELD (type, i)))
+             else if (field_is_static (&type->field (i)))
                {
                  /* struct value *v = value_static_field (type, i);
                     v4.17 specific.  */
@@ -700,8 +695,8 @@ pascal_object_print_value (struct value *val, struct ui_file *stream,
   if (dont_print_vb == 0)
     {
       /* If we're at top level, carve out a completely fresh
-         chunk of the obstack and use that until this particular
-         invocation returns.  */
+        chunk of the obstack and use that until this particular
+        invocation returns.  */
       /* Bump up the high-water mark.  Now alpha is omega.  */
       obstack_finish (&dont_print_vb_obstack);
     }
@@ -771,7 +766,7 @@ pascal_object_print_value (struct value *val, struct ui_file *stream,
        }
       fputs_filtered ("<", stream);
       /* Not sure what the best notation is in the case where there is no
-         baseclass name.  */
+        baseclass name.  */
 
       fputs_filtered (basename ? basename : "", stream);
       fputs_filtered ("> = ", stream);
@@ -794,10 +789,10 @@ pascal_object_print_value (struct value *val, struct ui_file *stream,
   if (dont_print_vb == 0)
     {
       /* Free the space used to deal with the printing
-         of this type from top level.  */
+        of this type from top level.  */
       obstack_free (&dont_print_vb_obstack, last_dont_print);
       /* Reset watermark so that we can continue protecting
-         ourselves from whatever we were protecting ourselves.  */
+        ourselves from whatever we were protecting ourselves.  */
       dont_print_vb_obstack = tmp_obstack;
     }
 }