From 46157d77c324ab6adf52ddf994a6ccb3328b3edb Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Wed, 28 Oct 2020 18:10:01 +0000 Subject: 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. --- gdb/p-typeprint.c | 214 +++++++++++++++++++----------------------------------- 1 file changed, 75 insertions(+), 139 deletions(-) (limited to 'gdb/p-typeprint.c') diff --git a/gdb/p-typeprint.c b/gdb/p-typeprint.c index b53a0de..36c337c 100644 --- a/gdb/p-typeprint.c +++ b/gdb/p-typeprint.c @@ -34,21 +34,12 @@ #include #include "cli/cli-style.h" -static void pascal_type_print_varspec_suffix (struct type *, struct ui_file *, - int, int, int, - const struct type_print_options *); - -static void pascal_type_print_derivation_info (struct ui_file *, - struct type *); - - - -/* LEVEL is the depth to indent lines by. */ +/* See language.h. */ void -pascal_print_type (struct type *type, const char *varstring, - struct ui_file *stream, int show, int level, - const struct type_print_options *flags) +pascal_language::print_type (struct type *type, const char *varstring, + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) const { enum type_code code; int demangled_args; @@ -61,7 +52,7 @@ pascal_print_type (struct type *type, const char *varstring, if ((code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD)) { - pascal_type_print_varspec_prefix (type, stream, show, 0, flags); + type_print_varspec_prefix (type, stream, show, 0, flags); } /* first the name */ fputs_filtered (varstring, stream); @@ -76,26 +67,24 @@ pascal_print_type (struct type *type, const char *varstring, if (!(code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD)) { - pascal_type_print_varspec_prefix (type, stream, show, 0, flags); + type_print_varspec_prefix (type, stream, show, 0, flags); } - pascal_type_print_base (type, stream, show, level, flags); + type_print_base (type, stream, show, level, flags); /* For demangled function names, we have the arglist as part of the name, so don't print an additional pair of ()'s. */ demangled_args = varstring ? strchr (varstring, '(') != NULL : 0; - pascal_type_print_varspec_suffix (type, stream, show, 0, demangled_args, + type_print_varspec_suffix (type, stream, show, 0, demangled_args, flags); } -/* Print a typedef using Pascal syntax. TYPE is the underlying type. - NEW_SYMBOL is the symbol naming the type. STREAM is the stream on - which to print. */ +/* See language.h. */ void -pascal_print_typedef (struct type *type, struct symbol *new_symbol, - struct ui_file *stream) +pascal_language::print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) const { type = check_typedef (type); fprintf_filtered (stream, "type "); @@ -104,32 +93,11 @@ pascal_print_typedef (struct type *type, struct symbol *new_symbol, fprintf_filtered (stream, ";"); } -/* 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. */ +/* See p-lang.h. */ -static void -pascal_type_print_derivation_info (struct ui_file *stream, struct type *type) +void +pascal_language::type_print_derivation_info (struct ui_file *stream, + struct type *type) const { const char *name; int i; @@ -149,11 +117,12 @@ pascal_type_print_derivation_info (struct ui_file *stream, struct type *type) } } -/* Print the Pascal method arguments ARGS to the file STREAM. */ +/* See p-lang.h. */ void -pascal_type_print_method_args (const char *physname, const char *methodname, - struct ui_file *stream) +pascal_language::type_print_method_args (const char *physname, + const char *methodname, + struct ui_file *stream) const { int is_constructor = (startswith (physname, "__ct__")); int is_destructor = (startswith (physname, "__dt__")); @@ -195,18 +164,13 @@ pascal_type_print_method_args (const char *physname, const char *methodname, } } -/* 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. */ +/* See p-lang.h. */ void -pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, - int show, int passed_a_ptr, - const struct type_print_options *flags) +pascal_language::type_print_varspec_prefix (struct type *type, + struct ui_file *stream, + int show, int passed_a_ptr, + const struct type_print_options *flags) const { if (type == 0) return; @@ -220,7 +184,7 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, { case TYPE_CODE_PTR: fprintf_filtered (stream, "^"); - pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, + type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, flags); break; /* Pointer should be handled normally in pascal. */ @@ -241,15 +205,15 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, if (passed_a_ptr) { fprintf_filtered (stream, " "); - pascal_type_print_base (TYPE_SELF_TYPE (type), + type_print_base (TYPE_SELF_TYPE (type), stream, 0, passed_a_ptr, flags); fprintf_filtered (stream, "::"); } break; case TYPE_CODE_REF: - pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, - flags); + type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, + flags); fprintf_filtered (stream, "&"); break; @@ -301,14 +265,16 @@ pascal_type_print_varspec_prefix (struct type *type, struct ui_file *stream, gcc -Wall will reveal any types that haven't been handled. */ break; default: - error (_("type not handled in pascal_type_print_varspec_prefix()")); + gdb_assert_not_reached ("unexpected type"); break; } } -static void -pascal_print_func_args (struct type *type, struct ui_file *stream, - const struct type_print_options *flags) +/* See p-lang.h. */ + +void +pascal_language::print_func_args (struct type *type, struct ui_file *stream, + const struct type_print_options *flags) const { int i, len = type->num_fields (); @@ -324,12 +290,12 @@ pascal_print_func_args (struct type *type, struct ui_file *stream, wrap_here (" "); } /* Can we find if it is a var parameter ?? - if ( TYPE_FIELD(type, i) == ) - { - fprintf_filtered (stream, "var "); - } */ - pascal_print_type (type->field (i).type (), "" /* TYPE_FIELD_NAME - seems invalid! */ + if ( TYPE_FIELD(type, i) == ) + { + fprintf_filtered (stream, "var "); + } */ + print_type (type->field (i).type (), "" /* TYPE_FIELD_NAME + seems invalid! */ ,stream, -1, 0, flags); } if (len) @@ -338,42 +304,41 @@ pascal_print_func_args (struct type *type, struct ui_file *stream, } } -/* Helper for pascal_type_print_varspec_suffix to print the suffix of - a function or method. */ +/* See p-lang.h. */ -static void -pascal_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) +void +pascal_language::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 { if (TYPE_TARGET_TYPE (type) == NULL || TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID) { fprintf_filtered (stream, " : "); - pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), + type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0, flags); if (TYPE_TARGET_TYPE (type) == NULL) type_print_unknown_return_type (stream); else - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0, + type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0, flags); - pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, - passed_a_ptr, 0, flags); + type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + passed_a_ptr, 0, flags); } } -/* 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. */ +/* See p-lang.h. */ -static void -pascal_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) +void +pascal_language::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 { if (type == 0) return; @@ -393,25 +358,23 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, case TYPE_CODE_METHOD: if (passed_a_ptr) fprintf_filtered (stream, ")"); - pascal_type_print_method_args ("", - "", - stream); - pascal_type_print_func_varspec_suffix (type, stream, show, + type_print_method_args ("", "", stream); + type_print_func_varspec_suffix (type, stream, show, passed_a_ptr, 0, flags); break; case TYPE_CODE_PTR: case TYPE_CODE_REF: - pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), - stream, 0, 1, 0, flags); + type_print_varspec_suffix (TYPE_TARGET_TYPE (type), + stream, 0, 1, 0, flags); break; case TYPE_CODE_FUNC: if (passed_a_ptr) fprintf_filtered (stream, ")"); if (!demangled_args) - pascal_print_func_args (type, stream, flags); - pascal_type_print_func_varspec_suffix (type, stream, show, + print_func_args (type, stream, flags); + type_print_func_varspec_suffix (type, stream, show, passed_a_ptr, 0, flags); break; @@ -435,30 +398,16 @@ pascal_type_print_varspec_suffix (struct type *type, struct ui_file *stream, gcc -Wall will report types that may not have been considered. */ break; default: - error (_("type not handled in pascal_type_print_varspec_suffix()")); + gdb_assert_not_reached ("unexpected type"); break; } } -/* 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. */ +/* See p-lang.h. */ void -pascal_type_print_base (struct type *type, struct ui_file *stream, int show, - int level, const struct type_print_options *flags) +pascal_language::type_print_base (struct type *type, struct ui_file *stream, int show, + int level, const struct type_print_options *flags) const { int i; int len; @@ -502,27 +451,16 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, case TYPE_CODE_TYPEDEF: case TYPE_CODE_PTR: case TYPE_CODE_REF: - /* case TYPE_CODE_FUNC: - case TYPE_CODE_METHOD: */ - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level, - flags); + type_print_base (TYPE_TARGET_TYPE (type), stream, show, level, + flags); break; case TYPE_CODE_ARRAY: - /* pascal_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), - stream, 0, 0); - pascal_type_print_base (TYPE_TARGET_TYPE (type), - stream, show, level); - pascal_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), - stream, 0, 0, 0); */ - pascal_print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0, flags); + print_type (TYPE_TARGET_TYPE (type), NULL, stream, 0, 0, flags); break; case TYPE_CODE_FUNC: case TYPE_CODE_METHOD: - /* - pascal_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); - only after args !! */ break; case TYPE_CODE_STRUCT: if (type->name () != NULL) @@ -558,7 +496,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, } else if (show > 0 || type->name () == NULL) { - pascal_type_print_derivation_info (stream, type); + type_print_derivation_info (stream, type); fprintf_filtered (stream, "\n"); if ((type->num_fields () == 0) && (TYPE_NFN_FIELDS (type) == 0)) @@ -626,7 +564,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, print_spaces_filtered (level + 4, stream); if (field_is_static (&type->field (i))) fprintf_filtered (stream, "static "); - pascal_print_type (type->field (i).type (), + print_type (type->field (i).type (), TYPE_FIELD_NAME (type, i), stream, show - 1, level + 4, flags); if (!field_is_static (&type->field (i)) @@ -725,9 +663,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, } /* This does not work, no idea why !! */ - pascal_type_print_method_args (physname, - method_name, - stream); + type_print_method_args (physname, method_name, stream); if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) != 0 && TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE(f, j))->code () != TYPE_CODE_VOID) @@ -813,7 +749,7 @@ pascal_type_print_base (struct type *type, struct ui_file *stream, int show, case TYPE_CODE_SET: fputs_filtered ("set of ", stream); - pascal_print_type (type->index_type (), "", stream, + print_type (type->index_type (), "", stream, show - 1, level, flags); break; -- cgit v1.1