summaryrefslogtreecommitdiff
path: root/gdb/p-lang.h
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2020-10-28 18:10:01 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2020-12-23 20:53:14 +0000
commit46157d77c324ab6adf52ddf994a6ccb3328b3edb (patch)
tree2e2220e236d5e9456d57fea71f01fac60878a77d /gdb/p-lang.h
parent82fc57fd6b0aff85d86c47b5892f91c04fd58f0f (diff)
downloadbinutils-gdb-46157d77c324ab6adf52ddf994a6ccb3328b3edb.tar.gz
gdb: move pascal_language into p-lang.h
Move the pascal_language class declaration into the p-lang.h header file. This allows for the function implementations to be spread over the different p-*.c files without the need for global trampoline functions. As a consequence of this change many of the Pascal value and type printing helper functions have become member functions within the pascal_language class. There should be no user visible changes after this commit. gdb/ChangeLog: * p-exp.y (exp): Update call to pascal_is_string_type. (pascal_parse): Rename to... (pascal_language::parser): ...this. * p-lang.c (is_pascal_string_type): Rename to... (pascal_is_string_type): ...this. (pascal_one_char): Rename to... (pascal_language::print_one_char): ...this. (pascal_printchar): Rename to... (pascal_language::printchar): ...this. Update call to print_one_char member function. (pascal_op_print_tab): Rename to... (pascal_language::op_print_tab): ...this. (class pascal_language): Moved to p-lang.h. (pascal_language::language_arch_info): Function implementation moved out of class declaration. (pascal_language::printstr): Likewise. * p-lang.h (pascal_parse): Delete declaration. (pascal_is_string_type): Declare. (pascal_print_type): Delete declaration. (pascal_print_typedef): Delete declaration. (pascal_value_print_inner): Delete declaration. (pascal_value_print): Delete declaration. (pascal_type_print_method_args): Delete declaration. (is_pascal_string_type): Delete declaration. (pascal_printchar): Delete declaration. (pascal_builtin_types): Delete declaration. (pascal_type_print_base): Delete declaration. (pascal_type_print_varspec_prefix): Delete declaration. (class pascal_language): Moved here from p-lang.c. * p-typeprint.c (pascal_type_print_varspec_suffix): Delete declaration. (pascal_type_print_derivation_info): Delete declaration. (pascal_print_type): Rename to... (pascal_language::print_type): ...this. Update calls to member functions. (pascal_print_typedef): Rename to... (pascal_language::print_typedef): ...this. Update calls to member functions. (pascal_type_print_derivation_info): Rename to... (pascal_language::type_print_derivation_info): ...this. (pascal_type_print_method_args): Rename to... (pascal_language::type_print_method_args): ...this. (pascal_type_print_varspec_prefix): Rename to... (pascal_language::type_print_varspec_prefix): ...this. Update calls to member functions. (pascal_print_func_args): Rename to... (pascal_language::print_func_args): ...this. Update calls to member functions. (pascal_type_print_func_varspec_suffix): Rename to... (pascal_language::type_print_func_varspec_suffix): ...this. Update calls to member functions. (pascal_type_print_varspec_suffix): Rename to... (pascal_language::type_print_varspec_suffix): ...this. Update calls to member functions. (pascal_type_print_base): Rename to... (pascal_language::type_print_base): ...this. Update calls to member functions. * p-valprint.c (pascal_value_print_inner): Rename to... (pascal_language::value_print_inner): ...this. Update calls to member functions. (pascal_value_print): Rename to... (pascal_language::value_print): ...this. Update calls to member functions.
Diffstat (limited to 'gdb/p-lang.h')
-rw-r--r--gdb/p-lang.h245
1 files changed, 217 insertions, 28 deletions
diff --git a/gdb/p-lang.h b/gdb/p-lang.h
index 3eaad015a6e..3f08a26d2b3 100644
--- a/gdb/p-lang.h
+++ b/gdb/p-lang.h
@@ -25,51 +25,240 @@
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 (struct parser_state *); /* Defined in p-exp.y */
+/* These are in p-lang.c: */
-/* 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 is_pascal_string_type (struct type *, int *, int *, int *,
+ struct type **, const char **);
-extern void pascal_print_typedef (struct type *, struct symbol *,
- struct ui_file *);
+extern int pascal_object_is_vtbl_ptr_type (struct type *);
-/* Implement la_value_print_inner for Pascal. */
+extern int pascal_object_is_vtbl_member (struct type *);
-extern void pascal_value_print_inner (struct value *, struct ui_file *, int,
- 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 struct type **const pascal_builtin_types[];
+ /* See language.h. */
-/* These are in p-typeprint.c: */
+ const std::vector<const char *> &filename_extensions () const override
+ {
+ static const std::vector<const char *> extensions
+ = { ".pas", ".p", ".pp" };
+ return extensions;
+ }
-extern void
- pascal_type_print_base (struct type *, struct ui_file *, int, int,
- const struct type_print_options *);
+ /* See language.h. */
-extern void
- pascal_type_print_varspec_prefix (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 int pascal_object_is_vtbl_ptr_type (struct type *);
+ /* See language.h. */
-extern int pascal_object_is_vtbl_member (struct type *);
+ 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)
+ 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; }
+
+ /* See language.h. */
+
+ const struct op_print *opcode_print_table () const override
+ { return op_print_tab; }
+
+private:
+
+ /* Table of opcode data for use by OPCODE_PRINT_TABLE member function. */
+
+ static const struct op_print op_print_tab[];
+
+ /* 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 */