123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /* Pascal language support definitions for GDB, the GNU debugger.
- Copyright (C) 2000-2022 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 */
|