Let expand_symtabs_matching short-circuit
[binutils-gdb.git] / gdb / p-lang.h
index 74d5d539ee8e2bb03bb94784a65e57f75c74afa4..95dca01f22ea8c074cf461f55bd6f1dfdb7ba3b4 100644 (file)
@@ -1,6 +1,6 @@
 /* Pascal language support definitions for GDB, the GNU debugger.
 
-   Copyright (C) 2000-2013 Free Software Foundation, Inc.
+   Copyright (C) 2000-2021 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+#ifndef P_LANG_H
+#define P_LANG_H
+
 /* This file is derived from c-lang.h */
 
 struct value;
+struct parser_state;
+
+/* Determines if type TYPE is a pascal string type.  Returns a positive
+   value if the type is a known pascal string type.  This function is used
+   by p-valprint.c code to allow better string display.  If it is a pascal
+   string type, then it also sets info needed to get the length and the
+   data of the string length_pos, length_size and string_pos are given in
+   bytes.  char_size gives the element size in bytes.  FIXME: if the
+   position or the size of these fields are not multiple of TARGET_CHAR_BIT
+   then the results are wrong but this does not happen for Free Pascal nor
+   for GPC.  */
+
+extern int pascal_is_string_type (struct type *type,int *length_pos,
+                                 int *length_size, int *string_pos,
+                                 struct type **char_type,
+                                 const char **arrayname);
 
 /* Defined in p-lang.c */
+
 extern const char *pascal_main_name (void);
 
-extern int pascal_parse (void);        /* Defined in p-exp.y */
+/* These are in p-lang.c: */
 
-extern void pascal_error (char *);     /* Defined in p-exp.y */
+extern int is_pascal_string_type (struct type *, int *, int *, int *,
+                                 struct type **, const char **);
 
-/* Defined in p-typeprint.c */
-extern void pascal_print_type (struct type *, const char *, struct ui_file *,
-                              int, int, const struct type_print_options *);
+extern int pascal_object_is_vtbl_ptr_type (struct type *);
 
-extern void pascal_print_typedef (struct type *, struct symbol *,
-                                 struct ui_file *);
+extern int pascal_object_is_vtbl_member (struct type *);
 
-extern void pascal_val_print (struct type *, const gdb_byte *, int,
-                             CORE_ADDR, struct ui_file *, int,
-                             const struct value *,
-                             const struct value_print_options *);
+/* Class representing the Pascal language.  */
 
-extern void pascal_value_print (struct value *, struct ui_file *,
-                               const struct value_print_options *);
+class pascal_language : public language_defn
+{
+public:
+  pascal_language ()
+    : language_defn (language_pascal)
+  { /* Nothing.  */ }
 
-extern void pascal_type_print_method_args (const char *, const char *,
-                                          struct ui_file *);
+  /* See language.h.  */
 
-/* These are in p-lang.c: */
+  const char *name () const override
+  { return "pascal"; }
 
-extern int
-  is_pascal_string_type (struct type *, int *, int *, int *,
-                        struct type **, const char **);
+  /* See language.h.  */
 
-extern void pascal_printchar (int, struct type *, struct ui_file *);
+  const char *natural_name () const override
+  { return "Pascal"; }
 
-extern void pascal_printstr (struct ui_file *, struct type *, const gdb_byte *,
-                            unsigned int, const char *, int,
-                            const struct value_print_options *);
+  /* See language.h.  */
 
-extern struct type **const (pascal_builtin_types[]);
+  const std::vector<const char *> &filename_extensions () const override
+  {
+    static const std::vector<const char *> extensions
+      = { ".pas", ".p", ".pp" };
+    return extensions;
+  }
 
-/* These are in p-typeprint.c: */
+  /* See language.h.  */
 
-extern void
-  pascal_type_print_base (struct type *, struct ui_file *, int, int,
-                         const struct type_print_options *);
+  void language_arch_info (struct gdbarch *gdbarch,
+                          struct language_arch_info *lai) const override;
 
-extern void
-  pascal_type_print_varspec_prefix (struct type *, struct ui_file *, int, int,
-                                   const struct type_print_options *);
+  /* See language.h.  */
 
-extern void pascal_object_print_value_fields (struct type *, const gdb_byte *,
-                                             int,
-                                             CORE_ADDR, struct ui_file *,
-                                             int,
-                                             const struct value *,
-                                             const struct value_print_options *,
-                                             struct type **, int);
+  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;
 
-extern int pascal_object_is_vtbl_ptr_type (struct type *);
+  /* See language.h.  */
 
-extern int pascal_object_is_vtbl_member (struct type *);
+  void value_print (struct value *val, struct ui_file *stream,
+                   const struct value_print_options *options) const override;
+
+  /* See language.h.  */
+
+  void value_print_inner
+       (struct value *val, struct ui_file *stream, int recurse,
+        const struct value_print_options *options) const override;
+
+  /* See language.h.  */
+
+  int parser (struct parser_state *ps) const override;
+
+  /* See language.h.  */
+
+  void emitchar (int ch, struct type *chtype,
+                struct ui_file *stream, int quoter) const override
+  {
+    int in_quotes = 0;
+
+    print_one_char (ch, stream, &in_quotes);
+    if (in_quotes)
+      fputs_filtered ("'", stream);
+  }
+
+  /* See language.h.  */
+
+  void printchar (int ch, struct type *chtype,
+                 struct ui_file *stream) const override;
+
+  /* See language.h.  */
+
+  void printstr (struct ui_file *stream, struct type *elttype,
+                const gdb_byte *string, unsigned int length,
+                const char *encoding, int force_ellipses,
+                const struct value_print_options *options) const override;
+
+  /* See language.h.  */
+
+  void print_typedef (struct type *type, struct symbol *new_symbol,
+                     struct ui_file *stream) const override;
+
+  /* See language.h.  */
+
+  bool is_string_type_p (struct type *type) const override
+  {
+    return pascal_is_string_type(type, nullptr, nullptr, nullptr,
+                                nullptr, nullptr) > 0;
+  }
+
+  /* See language.h.  */
+
+  const char *name_of_this () const override
+  { return "this"; }
+
+  /* See language.h.  */
+
+  bool range_checking_on_by_default () const override
+  { return true; }
+
+private:
+
+  /* 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.  */
+
+  void print_one_char (int c, struct ui_file *stream, int *in_quotes) const;
+
+  /* Print the name of the type (or the ultimate pointer target,
+     function value or array element), or the description of a
+     structure or union.
+
+     SHOW positive means print details about the type (e.g. enum values),
+     and print structure elements passing SHOW - 1 for show.  SHOW negative
+     means just print the type name or struct tag if there is one.  If
+     there is no name, print something sensible but concise like "struct
+     {...}".
+     SHOW zero means just print the type name or struct tag if there is one.
+     If there is no name, print something sensible but not as concise like
+     "struct {int x; int y;}".
+
+     LEVEL is the number of spaces to indent by.
+     We increase it for some recursive calls.  */
+
+  void type_print_base (struct type *type, struct ui_file *stream, int show,
+                       int level,
+                       const struct type_print_options *flags) const;
+
+
+  /* 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.  */
+
+  void type_print_varspec_suffix (struct type *type, struct ui_file *stream,
+                                 int show, int passed_a_ptr,
+                                 int demangled_args,
+                                 const struct type_print_options *flags) const;
+
+  /* Helper for pascal_language::type_print_varspec_suffix to print the
+     suffix of a function or method.  */
+
+  void 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) const;
+
+  /* Print any asterisks or open-parentheses needed before the
+     variable name (to describe its type).
+
+     On outermost call, pass 0 for PASSED_A_PTR.
+     On outermost call, SHOW > 0 means should ignore
+     any typename for TYPE and show its details.
+     SHOW is always zero on recursive calls.  */
+
+  void type_print_varspec_prefix
+       (struct type *type, struct ui_file *stream, int show,
+        int passed_a_ptr, const struct type_print_options *flags) const;
+
+  /* Print the function args from TYPE (a TYPE_CODE_FUNC) to STREAM taking
+     FLAGS into account where appropriate.  */
+
+  void  print_func_args (struct type *type, struct ui_file *stream,
+                        const struct type_print_options *flags) const;
+
+  /* Print the Pascal method arguments for PHYSNAME and METHODNAME to the
+     file STREAM.  */
+
+  void type_print_method_args (const char *physname, const char *methodname,
+                              struct ui_file *stream) const;
+
+  /* If TYPE is a derived type, then print out derivation information.
+     Print only the actual base classes of this type, not the base classes
+     of the base classes.  I.e. for the derivation hierarchy:
+
+     class A { int a; };
+     class B : public A {int b; };
+     class C : public B {int c; };
+
+     Print the type of class C as:
+
+     class C : public B {
+     int c;
+     }
+
+     Not as the following (like gdb used to), which is not legal C++ syntax
+     for derived types and may be confused with the multiple inheritance
+     form:
+
+     class C : public B : public A {
+     int c;
+     }
+
+     In general, gdb should try to print the types as closely as possible
+     to the form that they appear in the source code.  */
+
+  void type_print_derivation_info (struct ui_file *stream,
+                                  struct type *type) const;
+};
+
+#endif /* P_LANG_H */