| /* 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 <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); |
| |
| /* 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<const char *> &filename_extensions () const override |
| { |
| static const std::vector<const char *> 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 /* P_LANG_H */ |