gdb: Convert language skip_trampoline field to a method
[deliverable/binutils-gdb.git] / gdb / p-typeprint.c
index 2fd0fecd770ba2edab87410be8339923cf0ddae2..70a8308b047e2ef51cc06b808b033cb7310a6254 100644 (file)
@@ -1,5 +1,5 @@
 /* Support for printing Pascal types for GDB, the GNU debugger.
-   Copyright (C) 2000-2014 Free Software Foundation, Inc.
+   Copyright (C) 2000-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -31,9 +31,8 @@
 #include "p-lang.h"
 #include "typeprint.h"
 #include "gdb-demangle.h"
-#include <string.h>
-#include <errno.h>
 #include <ctype.h>
+#include "cli/cli-style.h"
 
 static void pascal_type_print_varspec_suffix (struct type *, struct ui_file *,
                                              int, int, int,
@@ -54,10 +53,10 @@ pascal_print_type (struct type *type, const char *varstring,
   enum type_code code;
   int demangled_args;
 
-  code = TYPE_CODE (type);
+  code = type->code ();
 
   if (show > 0)
-    CHECK_TYPEDEF (type);
+    type = check_typedef (type);
 
   if ((code == TYPE_CODE_FUNC
        || code == TYPE_CODE_METHOD))
@@ -98,11 +97,11 @@ void
 pascal_print_typedef (struct type *type, struct symbol *new_symbol,
                      struct ui_file *stream)
 {
-  CHECK_TYPEDEF (type);
+  type = check_typedef (type);
   fprintf_filtered (stream, "type ");
-  fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new_symbol));
+  fprintf_filtered (stream, "%s = ", new_symbol->print_name ());
   type_print (type, "", stream, 0);
-  fprintf_filtered (stream, ";\n");
+  fprintf_filtered (stream, ";");
 }
 
 /* If TYPE is a derived type, then print out derivation information.
@@ -141,7 +140,7 @@ pascal_type_print_derivation_info (struct ui_file *stream, struct type *type)
       fprintf_filtered (stream, "%s%s ",
                        BASETYPE_VIA_PUBLIC (type, i) ? "public" : "private",
                        BASETYPE_VIA_VIRTUAL (type, i) ? " virtual" : "");
-      name = type_name_no_tag (TYPE_BASECLASS (type, i));
+      name = TYPE_BASECLASS (type, i)->name ();
       fprintf_filtered (stream, "%s", name ? name : "(null)");
     }
   if (i > 0)
@@ -156,8 +155,8 @@ void
 pascal_type_print_method_args (const char *physname, const char *methodname,
                               struct ui_file *stream)
 {
-  int is_constructor = (strncmp (physname, "__ct__", 6) == 0);
-  int is_destructor = (strncmp (physname, "__dt__", 6) == 0);
+  int is_constructor = (startswith (physname, "__ct__"));
+  int is_destructor = (startswith (physname, "__dt__"));
 
   if (is_constructor || is_destructor)
     {
@@ -212,12 +211,12 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
   if (type == 0)
     return;
 
-  if (TYPE_NAME (type) && show <= 0)
+  if (type->name () && show <= 0)
     return;
 
   QUIT;
 
-  switch (TYPE_CODE (type))
+  switch (type->code ())
     {
     case TYPE_CODE_PTR:
       fprintf_filtered (stream, "^");
@@ -229,7 +228,8 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
     case TYPE_CODE_METHOD:
       if (passed_a_ptr)
        fprintf_filtered (stream, "(");
-      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
+      if (TYPE_TARGET_TYPE (type) != NULL
+         && TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
        {
          fprintf_filtered (stream, "function  ");
        }
@@ -241,7 +241,7 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
       if (passed_a_ptr)
        {
          fprintf_filtered (stream, " ");
-         pascal_type_print_base (TYPE_DOMAIN_TYPE (type),
+         pascal_type_print_base (TYPE_SELF_TYPE (type),
                                  stream, 0, passed_a_ptr, flags);
          fprintf_filtered (stream, "::");
        }
@@ -257,7 +257,8 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
       if (passed_a_ptr)
        fprintf_filtered (stream, "(");
 
-      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
+      if (TYPE_TARGET_TYPE (type) != NULL
+         && TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
        {
          fprintf_filtered (stream, "function  ");
        }
@@ -308,7 +309,7 @@ static void
 pascal_print_func_args (struct type *type, struct ui_file *stream,
                        const struct type_print_options *flags)
 {
-  int i, len = TYPE_NFIELDS (type);
+  int i, len = type->num_fields ();
 
   if (len)
     {
@@ -336,6 +337,33 @@ pascal_print_func_args (struct type *type, struct ui_file *stream,
     }
 }
 
+/* Helper for pascal_type_print_varspec_suffix to print the suffix of
+   a function or method.  */
+
+static void
+pascal_type_print_func_varspec_suffix  (struct type *type, struct ui_file *stream,
+                                       int show, int passed_a_ptr,
+                                       int demangled_args,
+                                       const struct type_print_options *flags)
+{
+  if (TYPE_TARGET_TYPE (type) == NULL
+      || TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
+    {
+      fprintf_filtered (stream, " : ");
+      pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
+                                       stream, 0, 0, flags);
+
+      if (TYPE_TARGET_TYPE (type) == NULL)
+       type_print_unknown_return_type (stream);
+      else
+       pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
+                               flags);
+
+      pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
+                                       passed_a_ptr, 0, flags);
+    }
+}
+
 /* Print any array sizes, function arguments or close parentheses
    needed after the variable name (to describe its type).
    Args work like pascal_type_print_varspec_prefix.  */
@@ -349,12 +377,12 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
   if (type == 0)
     return;
 
-  if (TYPE_NAME (type) && show <= 0)
+  if (type->name () && show <= 0)
     return;
 
   QUIT;
 
-  switch (TYPE_CODE (type))
+  switch (type->code ())
     {
     case TYPE_CODE_ARRAY:
       if (passed_a_ptr)
@@ -367,16 +395,8 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
       pascal_type_print_method_args ("",
                                     "",
                                     stream);
-      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
-       {
-         fprintf_filtered (stream, " : ");
-         pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
-                                           stream, 0, 0, flags);
-         pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
-                                 flags);
-         pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
-                                           passed_a_ptr, 0, flags);
-       }
+      pascal_type_print_func_varspec_suffix (type, stream, show,
+                                            passed_a_ptr, 0, flags);
       break;
 
     case TYPE_CODE_PTR:
@@ -390,16 +410,8 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
        fprintf_filtered (stream, ")");
       if (!demangled_args)
        pascal_print_func_args (type, stream, flags);
-      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
-       {
-         fprintf_filtered (stream, " : ");
-         pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type),
-                                           stream, 0, 0, flags);
-         pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0,
-                                 flags);
-         pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
-                                           passed_a_ptr, 0, flags);
-       }
+      pascal_type_print_func_varspec_suffix (type, stream, show,
+                                            passed_a_ptr, 0, flags);
       break;
 
     case TYPE_CODE_UNDEF:
@@ -459,15 +471,15 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
   wrap_here ("    ");
   if (type == NULL)
     {
-      fputs_filtered ("<type unknown>", stream);
+      fputs_styled ("<type unknown>", metadata_style.style (), stream);
       return;
     }
 
   /* void pointer */
-  if ((TYPE_CODE (type) == TYPE_CODE_PTR)
-      && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID))
+  if ((type->code () == TYPE_CODE_PTR)
+      && (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_VOID))
     {
-      fputs_filtered (TYPE_NAME (type) ? TYPE_NAME (type) : "pointer",
+      fputs_filtered (type->name () ? type->name () : "pointer",
                      stream);
       return;
     }
@@ -475,15 +487,15 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
      just print the type name directly from the type.  */
 
   if (show <= 0
-      && TYPE_NAME (type) != NULL)
+      && type->name () != NULL)
     {
-      fputs_filtered (TYPE_NAME (type), stream);
+      fputs_filtered (type->name (), stream);
       return;
     }
 
-  CHECK_TYPEDEF (type);
+  type = check_typedef (type);
 
-  switch (TYPE_CODE (type))
+  switch (type->code ())
     {
     case TYPE_CODE_TYPEDEF:
     case TYPE_CODE_PTR:
@@ -511,9 +523,9 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
          only after args !!  */
       break;
     case TYPE_CODE_STRUCT:
-      if (TYPE_TAG_NAME (type) != NULL)
+      if (type->name () != NULL)
        {
-         fputs_filtered (TYPE_TAG_NAME (type), stream);
+         fputs_filtered (type->name (), stream);
          fputs_filtered (" = ", stream);
        }
       if (HAVE_CPLUS_STRUCT (type))
@@ -527,9 +539,9 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
       goto struct_union;
 
     case TYPE_CODE_UNION:
-      if (TYPE_TAG_NAME (type) != NULL)
+      if (type->name () != NULL)
        {
-         fputs_filtered (TYPE_TAG_NAME (type), stream);
+         fputs_filtered (type->name (), stream);
          fputs_filtered (" = ", stream);
        }
       fprintf_filtered (stream, "case <?> of ");
@@ -539,15 +551,15 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
       if (show < 0)
        {
          /* If we just printed a tag name, no need to print anything else.  */
-         if (TYPE_TAG_NAME (type) == NULL)
+         if (type->name () == NULL)
            fprintf_filtered (stream, "{...}");
        }
-      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
+      else if (show > 0 || type->name () == NULL)
        {
          pascal_type_print_derivation_info (stream, type);
 
          fprintf_filtered (stream, "\n");
-         if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
+         if ((type->num_fields () == 0) && (TYPE_NFN_FIELDS (type) == 0))
            {
              if (TYPE_STUB (type))
                fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
@@ -564,12 +576,12 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
          /* If there is a base class for this type,
             do not print the field that it occupies.  */
 
-         len = TYPE_NFIELDS (type);
+         len = type->num_fields ();
          for (i = TYPE_N_BASECLASSES (type); i < len; i++)
            {
              QUIT;
              /* Don't print out virtual function table.  */
-             if ((strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0)
+             if ((startswith (TYPE_FIELD_NAME (type, i), "_vptr"))
                  && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
                continue;
 
@@ -606,12 +618,12 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
                }
 
              print_spaces_filtered (level + 4, stream);
-             if (field_is_static (&TYPE_FIELD (type, i)))
+             if (field_is_static (&type->field (i)))
                fprintf_filtered (stream, "static ");
              pascal_print_type (TYPE_FIELD_TYPE (type, i),
                                 TYPE_FIELD_NAME (type, i),
                                 stream, show - 1, level + 4, flags);
-             if (!field_is_static (&TYPE_FIELD (type, i))
+             if (!field_is_static (&type->field (i))
                  && TYPE_FIELD_PACKED (type, i))
                {
                  /* It is a bitfield.  This code does not attempt
@@ -645,8 +657,8 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
                {
                  const char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
 
-                 int is_constructor = (strncmp (physname, "__ct__", 6) == 0);
-                 int is_destructor = (strncmp (physname, "__dt__", 6) == 0);
+                 int is_constructor = (startswith (physname, "__ct__"));
+                 int is_destructor = (startswith (physname, "__dt__"));
 
                  QUIT;
                  if (TYPE_FN_FIELD_PROTECTED (f, j))
@@ -695,8 +707,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
                      fprintf_filtered (stream, "destructor  ");
                    }
                  else if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0
-                          && TYPE_CODE (TYPE_TARGET_TYPE (
-                               TYPE_FN_FIELD_TYPE (f, j))) != TYPE_CODE_VOID)
+                          && TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID)
                    {
                      fprintf_filtered (stream, "function  ");
                    }
@@ -711,8 +722,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
                                                 stream);
 
                  if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0
-                     && TYPE_CODE (TYPE_TARGET_TYPE (
-                          TYPE_FN_FIELD_TYPE (f, j))) != TYPE_CODE_VOID)
+                     && TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID)
                    {
                      fputs_filtered (" : ", stream);
                      type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
@@ -729,9 +739,9 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
       break;
 
     case TYPE_CODE_ENUM:
-      if (TYPE_TAG_NAME (type) != NULL)
+      if (type->name () != NULL)
        {
-         fputs_filtered (TYPE_TAG_NAME (type), stream);
+         fputs_filtered (type->name (), stream);
          if (show > 0)
            fputs_filtered (" ", stream);
        }
@@ -742,13 +752,13 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
       if (show < 0)
        {
          /* If we just printed a tag name, no need to print anything else.  */
-         if (TYPE_TAG_NAME (type) == NULL)
+         if (type->name () == NULL)
            fprintf_filtered (stream, "(...)");
        }
-      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
+      else if (show > 0 || type->name () == NULL)
        {
          fprintf_filtered (stream, "(");
-         len = TYPE_NFIELDS (type);
+         len = type->num_fields ();
          lastval = 0;
          for (i = 0; i < len; i++)
            {
@@ -808,16 +818,17 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show,
          such as fundamental types.  For these, just print whatever
          the type name is, as recorded in the type itself.  If there
          is no type name, then complain.  */
-      if (TYPE_NAME (type) != NULL)
+      if (type->name () != NULL)
        {
-         fputs_filtered (TYPE_NAME (type), stream);
+         fputs_filtered (type->name (), stream);
        }
       else
        {
          /* At least for dump_symtab, it is important that this not be
             an error ().  */
-         fprintf_filtered (stream, "<invalid unnamed pascal type code %d>",
-                           TYPE_CODE (type));
+         fprintf_styled (stream, metadata_style.style (),
+                         "<invalid unnamed pascal type code %d>",
+                         type->code ());
        }
       break;
     }
This page took 0.030024 seconds and 4 git commands to generate.