gdb: Convert language la_get_symbol_name_matcher field to a method
[deliverable/binutils-gdb.git] / gdb / p-lang.c
index 232ce56fd13399eeb25ed22aca6ce8f4f2f49c45..189617afc06da60b5d5178919e3ea3e49ee5198e 100644 (file)
@@ -1,7 +1,6 @@
 /* Pascal language support routines for GDB, the GNU debugger.
 
 /* Pascal language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 2000-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    This file is part of GDB.
 
 /* This file is derived from c-lang.c */
 
 #include "defs.h"
 /* This file is derived from c-lang.c */
 
 #include "defs.h"
-#include "gdb_string.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
 #include "parser-defs.h"
 #include "language.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "expression.h"
 #include "parser-defs.h"
 #include "language.h"
+#include "varobj.h"
 #include "p-lang.h"
 #include "valprint.h"
 #include "value.h"
 #include <ctype.h>
 #include "p-lang.h"
 #include "valprint.h"
 #include "value.h"
 #include <ctype.h>
-extern void _initialize_pascal_language (void);
-
+#include "c-lang.h"
+#include "gdbarch.h"
+#include "cli/cli-style.h"
 
 /* All GPC versions until now (2007-09-27) also define a symbol called
 
 /* All GPC versions until now (2007-09-27) also define a symbol called
-   '_p_initialize'. Check for the presence of this symbol first.  */
+   '_p_initialize'.  Check for the presence of this symbol first.  */
 static const char GPC_P_INITIALIZE[] = "_p_initialize";
 
 /* The name of the symbol that GPC uses as the name of the main
 static const char GPC_P_INITIALIZE[] = "_p_initialize";
 
 /* The name of the symbol that GPC uses as the name of the main
@@ -54,28 +53,28 @@ static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program";
    so that it finds the even if the program was compiled
    without debugging information.
    According to information supplied by Waldeck Hebisch,
    so that it finds the even if the program was compiled
    without debugging information.
    According to information supplied by Waldeck Hebisch,
-   this should work for all versions posterior to June 2000. */
+   this should work for all versions posterior to June 2000.  */
 
 const char *
 pascal_main_name (void)
 {
 
 const char *
 pascal_main_name (void)
 {
-  struct minimal_symbol *msym;
+  struct bound_minimal_symbol msym;
 
   msym = lookup_minimal_symbol (GPC_P_INITIALIZE, NULL, NULL);
 
   /*  If '_p_initialize' was not found, the main program is likely not
      written in Pascal.  */
 
   msym = lookup_minimal_symbol (GPC_P_INITIALIZE, NULL, NULL);
 
   /*  If '_p_initialize' was not found, the main program is likely not
      written in Pascal.  */
-  if (msym == NULL)
+  if (msym.minsym == NULL)
     return NULL;
 
   msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL);
     return NULL;
 
   msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     {
       return GPC_MAIN_PROGRAM_NAME_1;
     }
 
   msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL);
     {
       return GPC_MAIN_PROGRAM_NAME_1;
     }
 
   msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL);
-  if (msym != NULL)
+  if (msym.minsym != NULL)
     {
       return GPC_MAIN_PROGRAM_NAME_2;
     }
     {
       return GPC_MAIN_PROGRAM_NAME_2;
     }
@@ -99,65 +98,75 @@ int
 is_pascal_string_type (struct type *type,int *length_pos,
                        int *length_size, int *string_pos,
                       struct type **char_type,
 is_pascal_string_type (struct type *type,int *length_pos,
                        int *length_size, int *string_pos,
                       struct type **char_type,
-                      char **arrayname)
+                      const char **arrayname)
 {
 {
-  if (type != NULL && TYPE_CODE (type) == TYPE_CODE_STRUCT)
+  if (type != NULL && type->code () == TYPE_CODE_STRUCT)
     {
       /* Old Borland type pascal strings from Free Pascal Compiler.  */
       /* Two fields: length and st.  */
     {
       /* Old Borland type pascal strings from Free Pascal Compiler.  */
       /* Two fields: length and st.  */
-      if (TYPE_NFIELDS (type) == 2
-         && TYPE_FIELDS (type) [0].name
-          && strcmp (TYPE_FIELDS (type)[0].name, "length") == 0 
-         && TYPE_FIELDS (type) [1].name
-          && strcmp (TYPE_FIELDS (type)[1].name, "st") == 0)
+      if (type->num_fields () == 2
+         && TYPE_FIELD_NAME (type, 0)
+         && strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0
+         && TYPE_FIELD_NAME (type, 1)
+         && strcmp (TYPE_FIELD_NAME (type, 1), "st") == 0)
         {
           if (length_pos)
            *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
           if (length_size)
         {
           if (length_pos)
            *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
           if (length_size)
-           *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0));
+           *length_size = TYPE_LENGTH (type->field (0).type ());
           if (string_pos)
            *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
           if (char_type)
           if (string_pos)
            *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
           if (char_type)
-           *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 1));
+           *char_type = TYPE_TARGET_TYPE (type->field (1).type ());
          if (arrayname)
          if (arrayname)
-           *arrayname = TYPE_FIELDS (type)[1].name;
+           *arrayname = TYPE_FIELD_NAME (type, 1);
          return 2;
         };
       /* GNU pascal strings.  */
       /* Three fields: Capacity, length and schema$ or _p_schema.  */
          return 2;
         };
       /* GNU pascal strings.  */
       /* Three fields: Capacity, length and schema$ or _p_schema.  */
-      if (TYPE_NFIELDS (type) == 3
-         && TYPE_FIELDS (type) [0].name
-          && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0
-         && TYPE_FIELDS (type) [1].name
-          && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0)
+      if (type->num_fields () == 3
+         && TYPE_FIELD_NAME (type, 0)
+         && strcmp (TYPE_FIELD_NAME (type, 0), "Capacity") == 0
+         && TYPE_FIELD_NAME (type, 1)
+         && strcmp (TYPE_FIELD_NAME (type, 1), "length") == 0)
         {
          if (length_pos)
            *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
          if (length_size)
         {
          if (length_pos)
            *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
          if (length_size)
-           *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 1));
+           *length_size = TYPE_LENGTH (type->field (1).type ());
          if (string_pos)
            *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
          if (string_pos)
            *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
-          /* FIXME: how can I detect wide chars in GPC ?? */
+          /* FIXME: how can I detect wide chars in GPC ??  */
           if (char_type)
            {
           if (char_type)
            {
-             *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 2));
+             *char_type = TYPE_TARGET_TYPE (type->field (2).type ());
 
 
-             if (TYPE_CODE (*char_type) == TYPE_CODE_ARRAY)
+             if ((*char_type)->code () == TYPE_CODE_ARRAY)
                *char_type = TYPE_TARGET_TYPE (*char_type);
            }
          if (arrayname)
                *char_type = TYPE_TARGET_TYPE (*char_type);
            }
          if (arrayname)
-           *arrayname = TYPE_FIELDS (type)[2].name;
+           *arrayname = TYPE_FIELD_NAME (type, 2);
          return 3;
         };
     }
   return 0;
 }
 
          return 3;
         };
     }
   return 0;
 }
 
+/* This is a wrapper around IS_PASCAL_STRING_TYPE that returns true if TYPE
+   is a string.  */
+
+static bool
+pascal_is_string_type_p (struct type *type)
+{
+  return is_pascal_string_type (type, nullptr, nullptr, nullptr,
+                               nullptr, nullptr) > 0;
+}
+
 static void pascal_one_char (int, struct ui_file *, int *);
 
 /* Print the character C on STREAM as part of the contents of a literal
    string.
 static void pascal_one_char (int, struct ui_file *, int *);
 
 /* Print the character C on STREAM as part of the contents of a literal
    string.
-   In_quotes is reset to 0 if a char is written with #4 notation */
+   In_quotes is reset to 0 if a char is written with #4 notation */
 
 static void
 pascal_one_char (int c, struct ui_file *stream, int *in_quotes)
 
 static void
 pascal_one_char (int c, struct ui_file *stream, int *in_quotes)
@@ -188,7 +197,7 @@ static void pascal_emit_char (int c, struct type *type,
 
 /* Print the character C on STREAM as part of the contents of a literal
    string whose delimiter is QUOTER.  Note that that format for printing
 
 /* Print the character C on STREAM as part of the contents of a literal
    string whose delimiter is QUOTER.  Note that that format for printing
-   characters and strings is language specific. */
+   characters and strings is language specific.  */
 
 static void
 pascal_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
 
 static void
 pascal_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
@@ -221,7 +230,7 @@ pascal_printstr (struct ui_file *stream, struct type *type,
                 const char *encoding, int force_ellipses,
                 const struct value_print_options *options)
 {
                 const char *encoding, int force_ellipses,
                 const struct value_print_options *options)
 {
-  enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
+  enum bfd_endian byte_order = type_byte_order (type);
   unsigned int i;
   unsigned int things_printed = 0;
   int in_quotes = 0;
   unsigned int i;
   unsigned int things_printed = 0;
   int in_quotes = 0;
@@ -268,7 +277,7 @@ pascal_printstr (struct ui_file *stream, struct type *type,
 
       rep1 = i + 1;
       reps = 1;
 
       rep1 = i + 1;
       reps = 1;
-      while (rep1 < length 
+      while (rep1 < length
             && extract_unsigned_integer (string + rep1 * width, width,
                                          byte_order) == current_char)
        {
             && extract_unsigned_integer (string + rep1 * width, width,
                                          byte_order) == current_char)
        {
@@ -280,14 +289,13 @@ pascal_printstr (struct ui_file *stream, struct type *type,
        {
          if (in_quotes)
            {
        {
          if (in_quotes)
            {
-             if (options->inspect_it)
-               fputs_filtered ("\\', ", stream);
-             else
-               fputs_filtered ("', ", stream);
+             fputs_filtered ("', ", stream);
              in_quotes = 0;
            }
          pascal_printchar (current_char, type, stream);
              in_quotes = 0;
            }
          pascal_printchar (current_char, type, stream);
-         fprintf_filtered (stream, " <repeats %u times>", reps);
+         fprintf_filtered (stream, " %p[<repeats %u times>%p]",
+                           metadata_style.style ().ptr (),
+                           reps, nullptr);
          i = rep1 - 1;
          things_printed += options->repeat_count_threshold;
          need_comma = 1;
          i = rep1 - 1;
          things_printed += options->repeat_count_threshold;
          need_comma = 1;
@@ -296,10 +304,7 @@ pascal_printstr (struct ui_file *stream, struct type *type,
        {
          if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
            {
        {
          if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
            {
-             if (options->inspect_it)
-               fputs_filtered ("\\'", stream);
-             else
-               fputs_filtered ("'", stream);
+             fputs_filtered ("'", stream);
              in_quotes = 1;
            }
          pascal_one_char (current_char, stream, &in_quotes);
              in_quotes = 1;
            }
          pascal_one_char (current_char, stream, &in_quotes);
@@ -309,12 +314,7 @@ pascal_printstr (struct ui_file *stream, struct type *type,
 
   /* Terminate the quotes if necessary.  */
   if (in_quotes)
 
   /* Terminate the quotes if necessary.  */
   if (in_quotes)
-    {
-      if (options->inspect_it)
-       fputs_filtered ("\\'", stream);
-      else
-       fputs_filtered ("'", stream);
-    }
+    fputs_filtered ("'", stream);
 
   if (force_ellipses || i < length)
     fputs_filtered ("...", stream);
 
   if (force_ellipses || i < length)
     fputs_filtered ("...", stream);
@@ -351,7 +351,7 @@ const struct op_print pascal_op_print_tab[] =
   {"^", UNOP_IND, PREC_SUFFIX, 1},
   {"@", UNOP_ADDR, PREC_PREFIX, 0},
   {"sizeof", UNOP_SIZEOF, PREC_PREFIX, 0},
   {"^", UNOP_IND, PREC_SUFFIX, 1},
   {"@", UNOP_ADDR, PREC_PREFIX, 0},
   {"sizeof", UNOP_SIZEOF, PREC_PREFIX, 0},
-  {NULL, 0, 0, 0}
+  {NULL, OP_NULL, PREC_PREFIX, 0}
 };
 \f
 enum pascal_primitive_types {
 };
 \f
 enum pascal_primitive_types {
@@ -375,95 +375,114 @@ enum pascal_primitive_types {
   nr_pascal_primitive_types
 };
 
   nr_pascal_primitive_types
 };
 
-static void
-pascal_language_arch_info (struct gdbarch *gdbarch,
-                          struct language_arch_info *lai)
+static const char *p_extensions[] =
 {
 {
-  const struct builtin_type *builtin = builtin_type (gdbarch);
+  ".pas", ".p", ".pp", NULL
+};
 
 
-  lai->string_char_type = builtin->builtin_char;
-  lai->primitive_type_vector
-    = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_pascal_primitive_types + 1,
-                              struct type *);
-  lai->primitive_type_vector [pascal_primitive_type_int]
-    = builtin->builtin_int;
-  lai->primitive_type_vector [pascal_primitive_type_long]
-    = builtin->builtin_long;
-  lai->primitive_type_vector [pascal_primitive_type_short]
-    = builtin->builtin_short;
-  lai->primitive_type_vector [pascal_primitive_type_char]
-    = builtin->builtin_char;
-  lai->primitive_type_vector [pascal_primitive_type_float]
-    = builtin->builtin_float;
-  lai->primitive_type_vector [pascal_primitive_type_double]
-    = builtin->builtin_double;
-  lai->primitive_type_vector [pascal_primitive_type_void]
-    = builtin->builtin_void;
-  lai->primitive_type_vector [pascal_primitive_type_long_long]
-    = builtin->builtin_long_long;
-  lai->primitive_type_vector [pascal_primitive_type_signed_char]
-    = builtin->builtin_signed_char;
-  lai->primitive_type_vector [pascal_primitive_type_unsigned_char]
-    = builtin->builtin_unsigned_char;
-  lai->primitive_type_vector [pascal_primitive_type_unsigned_short]
-    = builtin->builtin_unsigned_short;
-  lai->primitive_type_vector [pascal_primitive_type_unsigned_int]
-    = builtin->builtin_unsigned_int;
-  lai->primitive_type_vector [pascal_primitive_type_unsigned_long]
-    = builtin->builtin_unsigned_long;
-  lai->primitive_type_vector [pascal_primitive_type_unsigned_long_long]
-    = builtin->builtin_unsigned_long_long;
-  lai->primitive_type_vector [pascal_primitive_type_long_double]
-    = builtin->builtin_long_double;
-  lai->primitive_type_vector [pascal_primitive_type_complex]
-    = builtin->builtin_complex;
-  lai->primitive_type_vector [pascal_primitive_type_double_complex]
-    = builtin->builtin_double_complex;
-
-  lai->bool_type_symbol = "boolean";
-  lai->bool_type_default = builtin->builtin_bool;
-}
+/* Constant data representing the Pascal language.  */
 
 
-const struct language_defn pascal_language_defn =
+extern const struct language_data pascal_language_data =
 {
   "pascal",                    /* Language name */
 {
   "pascal",                    /* Language name */
+  "Pascal",
   language_pascal,
   range_check_on,
   language_pascal,
   range_check_on,
-  type_check_on,
   case_sensitive_on,
   array_row_major,
   macro_expansion_no,
   case_sensitive_on,
   array_row_major,
   macro_expansion_no,
+  p_extensions,
   &exp_descriptor_standard,
   pascal_parse,
   &exp_descriptor_standard,
   pascal_parse,
-  pascal_error,
   null_post_parser,
   pascal_printchar,            /* Print a character constant */
   pascal_printstr,             /* Function to print string constant */
   pascal_emit_char,            /* Print a single char */
   null_post_parser,
   pascal_printchar,            /* Print a character constant */
   pascal_printstr,             /* Function to print string constant */
   pascal_emit_char,            /* Print a single char */
-  pascal_print_type,           /* Print a type using appropriate syntax */
   pascal_print_typedef,                /* Print a typedef using appropriate syntax */
   pascal_print_typedef,                /* Print a typedef using appropriate syntax */
-  pascal_val_print,            /* Print a value using appropriate syntax */
+  pascal_value_print_inner,    /* la_value_print_inner */
   pascal_value_print,          /* Print a top-level value */
   pascal_value_print,          /* Print a top-level value */
-  NULL,                                /* Language specific skip_trampoline */
   "this",                      /* name_of_this */
   "this",                      /* name_of_this */
+  false,                       /* la_store_sym_names_in_linkage_form_p */
   basic_lookup_symbol_nonlocal,        /* lookup_symbol_nonlocal */
   basic_lookup_symbol_nonlocal,        /* lookup_symbol_nonlocal */
-  basic_lookup_transparent_type,/* lookup_transparent_type */
-  NULL,                                /* Language specific symbol demangler */
-  NULL,                                /* Language specific class_name_from_physname */
   pascal_op_print_tab,         /* expression operators for printing */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   default_word_break_characters,
   pascal_op_print_tab,         /* expression operators for printing */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   default_word_break_characters,
-  default_make_symbol_completion_list,
-  pascal_language_arch_info,
-  default_print_array_index,
-  default_pass_by_reference,
-  default_get_string,
-  LANG_MAGIC
+  default_collect_symbol_completion_matches,
+  c_watch_location_expression,
+  &default_varobj_ops,
+  pascal_is_string_type_p,
+  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 };
 
-void
-_initialize_pascal_language (void)
+/* Class representing the Pascal language.  */
+
+class pascal_language : public language_defn
 {
 {
-  add_language (&pascal_language_defn);
-}
+public:
+  pascal_language ()
+    : language_defn (language_pascal, pascal_language_data)
+  { /* Nothing.  */ }
+
+  /* See language.h.  */
+  void language_arch_info (struct gdbarch *gdbarch,
+                          struct language_arch_info *lai) const override
+  {
+    const struct builtin_type *builtin = builtin_type (gdbarch);
+
+    lai->string_char_type = builtin->builtin_char;
+    lai->primitive_type_vector
+      = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_pascal_primitive_types + 1,
+                              struct type *);
+    lai->primitive_type_vector [pascal_primitive_type_int]
+      = builtin->builtin_int;
+    lai->primitive_type_vector [pascal_primitive_type_long]
+      = builtin->builtin_long;
+    lai->primitive_type_vector [pascal_primitive_type_short]
+      = builtin->builtin_short;
+    lai->primitive_type_vector [pascal_primitive_type_char]
+      = builtin->builtin_char;
+    lai->primitive_type_vector [pascal_primitive_type_float]
+      = builtin->builtin_float;
+    lai->primitive_type_vector [pascal_primitive_type_double]
+      = builtin->builtin_double;
+    lai->primitive_type_vector [pascal_primitive_type_void]
+      = builtin->builtin_void;
+    lai->primitive_type_vector [pascal_primitive_type_long_long]
+      = builtin->builtin_long_long;
+    lai->primitive_type_vector [pascal_primitive_type_signed_char]
+      = builtin->builtin_signed_char;
+    lai->primitive_type_vector [pascal_primitive_type_unsigned_char]
+      = builtin->builtin_unsigned_char;
+    lai->primitive_type_vector [pascal_primitive_type_unsigned_short]
+      = builtin->builtin_unsigned_short;
+    lai->primitive_type_vector [pascal_primitive_type_unsigned_int]
+      = builtin->builtin_unsigned_int;
+    lai->primitive_type_vector [pascal_primitive_type_unsigned_long]
+      = builtin->builtin_unsigned_long;
+    lai->primitive_type_vector [pascal_primitive_type_unsigned_long_long]
+      = builtin->builtin_unsigned_long_long;
+    lai->primitive_type_vector [pascal_primitive_type_long_double]
+      = builtin->builtin_long_double;
+    lai->primitive_type_vector [pascal_primitive_type_complex]
+      = builtin->builtin_complex;
+    lai->primitive_type_vector [pascal_primitive_type_double_complex]
+      = builtin->builtin_double_complex;
+
+    lai->bool_type_symbol = "boolean";
+    lai->bool_type_default = builtin->builtin_bool;
+  }
+
+  /* See language.h.  */
+
+  void print_type (struct type *type, const char *varstring,
+                  struct ui_file *stream, int show, int level,
+                  const struct type_print_options *flags) const override
+  {
+    pascal_print_type (type, varstring, stream, show, level, flags);
+  }
+};
+
+/* Single instance of the Pascal language class.  */
+
+static pascal_language pascal_language_defn;
This page took 0.029938 seconds and 4 git commands to generate.