/* Pascal language support definitions for GDB, the GNU debugger. Copyright (C) 2000-2024 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef GDB_P_LANG_H #define GDB_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); /* These are in p-lang.c: */ extern int is_pascal_string_type (struct type *, int *, int *, int *, struct type **, const char **); extern int pascal_object_is_vtbl_ptr_type (struct type *); extern int pascal_object_is_vtbl_member (struct type *); /* Class representing the Pascal language. */ class pascal_language : public language_defn { public: pascal_language () : language_defn (language_pascal) { /* Nothing. */ } /* See language.h. */ const char *name () const override { return "pascal"; } /* See language.h. */ const char *natural_name () const override { return "Pascal"; } /* See language.h. */ const std::vector &filename_extensions () const override { static const std::vector extensions = { ".pas", ".p", ".pp" }; return extensions; } /* See language.h. */ void language_arch_info (struct gdbarch *gdbarch, struct language_arch_info *lai) const override; /* 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; /* See language.h. */ 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) gdb_puts ("'", 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 /* GDB_P_LANG_H */