From: Andrew Burgess Date: Wed, 28 Oct 2020 18:10:01 +0000 (+0000) Subject: gdb: move pascal_language into p-lang.h X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=46157d77c324ab6adf52ddf994a6ccb3328b3edb;p=binutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a0f46226211..57d8065bfe3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,69 @@ +2020-12-23 Andrew Burgess + + * 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. + 2020-12-23 Andrew Burgess * go-exp.y (go_parse): Rename to... diff --git a/gdb/p-exp.y b/gdb/p-exp.y index 618557c472a..469c284a33c 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -301,10 +301,9 @@ exp : field_exp COMPLETE exp : exp '[' /* We need to save the current_type value. */ { const char *arrayname; - int arrayfieldindex; - arrayfieldindex = is_pascal_string_type ( - current_type, NULL, NULL, - NULL, NULL, &arrayname); + int arrayfieldindex + = pascal_is_string_type (current_type, NULL, NULL, + NULL, NULL, &arrayname); if (arrayfieldindex) { struct stoken stringsval; @@ -1727,8 +1726,10 @@ yylex (void) } } +/* See language.h. */ + int -pascal_parse (struct parser_state *par_state) +pascal_language::parser (struct parser_state *par_state) const { /* Setting up the parser state. */ scoped_restore pstate_restore = make_scoped_restore (&pstate); diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 1610c0accae..3e58cccc006 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -84,20 +84,11 @@ pascal_main_name (void) return NULL; } -/* 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. */ +/* See p-lang.h. */ + int -is_pascal_string_type (struct type *type,int *length_pos, - int *length_size, int *string_pos, - struct type **char_type, +pascal_is_string_type (struct type *type,int *length_pos, int *length_size, + int *string_pos, struct type **char_type, const char **arrayname) { if (type != NULL && type->code () == TYPE_CODE_STRUCT) @@ -152,14 +143,11 @@ is_pascal_string_type (struct type *type,int *length_pos, return 0; } -static void pascal_one_char (int, struct ui_file *, int *); - -/* 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. */ +/* See p-lang.h. */ -static void -pascal_one_char (int c, struct ui_file *stream, int *in_quotes) +void +pascal_language::print_one_char (int c, struct ui_file *stream, + int *in_quotes) const { if (c == '\'' || ((unsigned int) c <= 0xff && (PRINT_LITERAL_FORM (c)))) { @@ -182,12 +170,15 @@ pascal_one_char (int c, struct ui_file *stream, int *in_quotes) } } +/* See language.h. */ + void -pascal_printchar (int c, struct type *type, struct ui_file *stream) +pascal_language::printchar (int c, struct type *type, + struct ui_file *stream) const { int in_quotes = 0; - pascal_one_char (c, stream, &in_quotes); + print_one_char (c, stream, &in_quotes); if (in_quotes) fputs_filtered ("'", stream); } @@ -197,7 +188,7 @@ pascal_printchar (int c, struct type *type, struct ui_file *stream) /* Table mapping opcodes into strings for printing operators and precedences of the operators. */ -const struct op_print pascal_op_print_tab[] = +const struct op_print pascal_language::op_print_tab[] = { {",", BINOP_COMMA, PREC_COMMA, 0}, {":=", BINOP_ASSIGN, PREC_ASSIGN, 1}, @@ -228,249 +219,138 @@ const struct op_print pascal_op_print_tab[] = }; -/* Class representing the Pascal language. */ +/* See language.h. */ -class pascal_language : public language_defn +void pascal_language::language_arch_info + (struct gdbarch *gdbarch, struct language_arch_info *lai) const { -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 - { - const struct builtin_type *builtin = builtin_type (gdbarch); - - /* Helper function to allow shorter lines below. */ - auto add = [&] (struct type * t) - { - lai->add_primitive_type (t); - }; - - add (builtin->builtin_int); - add (builtin->builtin_long); - add (builtin->builtin_short); - add (builtin->builtin_char); - add (builtin->builtin_float); - add (builtin->builtin_double); - add (builtin->builtin_void); - add (builtin->builtin_long_long); - add (builtin->builtin_signed_char); - add (builtin->builtin_unsigned_char); - add (builtin->builtin_unsigned_short); - add (builtin->builtin_unsigned_int); - add (builtin->builtin_unsigned_long); - add (builtin->builtin_unsigned_long_long); - add (builtin->builtin_long_double); - add (builtin->builtin_complex); - add (builtin->builtin_double_complex); - - lai->set_string_char_type (builtin->builtin_char); - lai->set_bool_type (builtin->builtin_bool, "boolean"); - } - - /* 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 - { - pascal_print_type (type, varstring, stream, show, level, flags); - } - - /* See language.h. */ - - void value_print (struct value *val, struct ui_file *stream, - const struct value_print_options *options) const override - { - return pascal_value_print (val, stream, options); - } - - /* See language.h. */ - - void value_print_inner - (struct value *val, struct ui_file *stream, int recurse, - const struct value_print_options *options) const override - { - return pascal_value_print_inner (val, stream, recurse, options); - } - - /* See language.h. */ - - int parser (struct parser_state *ps) const override - { - return pascal_parse (ps); - } - - /* See language.h. */ - - void emitchar (int ch, struct type *chtype, - struct ui_file *stream, int quoter) const override - { - int in_quotes = 0; - - pascal_one_char (ch, stream, &in_quotes); - if (in_quotes) - fputs_filtered ("'", stream); - } - - /* See language.h. */ + const struct builtin_type *builtin = builtin_type (gdbarch); - void printchar (int ch, struct type *chtype, - struct ui_file *stream) const override + /* Helper function to allow shorter lines below. */ + auto add = [&] (struct type * t) { - pascal_printchar (ch, chtype, stream); - } + lai->add_primitive_type (t); + }; + + add (builtin->builtin_int); + add (builtin->builtin_long); + add (builtin->builtin_short); + add (builtin->builtin_char); + add (builtin->builtin_float); + add (builtin->builtin_double); + add (builtin->builtin_void); + add (builtin->builtin_long_long); + add (builtin->builtin_signed_char); + add (builtin->builtin_unsigned_char); + add (builtin->builtin_unsigned_short); + add (builtin->builtin_unsigned_int); + add (builtin->builtin_unsigned_long); + add (builtin->builtin_unsigned_long_long); + add (builtin->builtin_long_double); + add (builtin->builtin_complex); + add (builtin->builtin_double_complex); + + lai->set_string_char_type (builtin->builtin_char); + lai->set_bool_type (builtin->builtin_bool, "boolean"); +} - /* See language.h. */ +/* 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 - { - enum bfd_endian byte_order = type_byte_order (elttype); - unsigned int i; - unsigned int things_printed = 0; - int in_quotes = 0; - int need_comma = 0; - int width; - - /* Preserve ELTTYPE's original type, just set its LENGTH. */ - check_typedef (elttype); - width = TYPE_LENGTH (elttype); - - /* If the string was not truncated due to `set print elements', and - the last byte of it is a null, we don't print that, in traditional C - style. */ - if ((!force_ellipses) && length > 0 - && extract_unsigned_integer (string + (length - 1) * width, width, - byte_order) == 0) - length--; - - if (length == 0) - { - fputs_filtered ("''", stream); - return; - } - - for (i = 0; i < length && things_printed < options->print_max; ++i) - { - /* Position of the character we are examining - to see whether it is repeated. */ - unsigned int rep1; - /* Number of repetitions we have detected so far. */ - unsigned int reps; - unsigned long int current_char; - - QUIT; - - if (need_comma) - { - fputs_filtered (", ", stream); - need_comma = 0; - } - - current_char = extract_unsigned_integer (string + i * width, width, - byte_order); - - rep1 = i + 1; - reps = 1; - while (rep1 < length - && extract_unsigned_integer (string + rep1 * width, width, - byte_order) == current_char) - { - ++rep1; - ++reps; - } - - if (reps > options->repeat_count_threshold) - { - if (in_quotes) - { - fputs_filtered ("', ", stream); - in_quotes = 0; - } - pascal_printchar (current_char, elttype, stream); - fprintf_filtered (stream, " %p[%p]", - metadata_style.style ().ptr (), - reps, nullptr); - i = rep1 - 1; - things_printed += options->repeat_count_threshold; - need_comma = 1; - } - else - { - if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char))) - { - fputs_filtered ("'", stream); - in_quotes = 1; - } - pascal_one_char (current_char, stream, &in_quotes); - ++things_printed; - } - } - - /* Terminate the quotes if necessary. */ - if (in_quotes) - fputs_filtered ("'", stream); - - if (force_ellipses || i < length) - fputs_filtered ("...", stream); - } - - /* See language.h. */ - - void print_typedef (struct type *type, struct symbol *new_symbol, - struct ui_file *stream) const override - { - pascal_print_typedef (type, new_symbol, stream); - } +void +pascal_language::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 +{ + enum bfd_endian byte_order = type_byte_order (elttype); + unsigned int i; + unsigned int things_printed = 0; + int in_quotes = 0; + int need_comma = 0; + int width; + + /* Preserve ELTTYPE's original type, just set its LENGTH. */ + check_typedef (elttype); + width = TYPE_LENGTH (elttype); + + /* If the string was not truncated due to `set print elements', and + the last byte of it is a null, we don't print that, in traditional C + style. */ + if ((!force_ellipses) && length > 0 + && extract_unsigned_integer (string + (length - 1) * width, width, + byte_order) == 0) + length--; + + if (length == 0) + { + fputs_filtered ("''", stream); + return; + } - /* See language.h. */ + for (i = 0; i < length && things_printed < options->print_max; ++i) + { + /* Position of the character we are examining + to see whether it is repeated. */ + unsigned int rep1; + /* Number of repetitions we have detected so far. */ + unsigned int reps; + unsigned long int current_char; - bool is_string_type_p (struct type *type) const override - { - return is_pascal_string_type (type, nullptr, nullptr, nullptr, - nullptr, nullptr) > 0; - } + QUIT; - /* See language.h. */ + if (need_comma) + { + fputs_filtered (", ", stream); + need_comma = 0; + } - const char *name_of_this () const override - { return "this"; } + current_char = extract_unsigned_integer (string + i * width, width, + byte_order); - /* See language.h. */ + rep1 = i + 1; + reps = 1; + while (rep1 < length + && extract_unsigned_integer (string + rep1 * width, width, + byte_order) == current_char) + { + ++rep1; + ++reps; + } - bool range_checking_on_by_default () const override - { return true; } + if (reps > options->repeat_count_threshold) + { + if (in_quotes) + { + fputs_filtered ("', ", stream); + in_quotes = 0; + } + printchar (current_char, elttype, stream); + fprintf_filtered (stream, " %p[%p]", + metadata_style.style ().ptr (), + reps, nullptr); + i = rep1 - 1; + things_printed += options->repeat_count_threshold; + need_comma = 1; + } + else + { + if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char))) + { + fputs_filtered ("'", stream); + in_quotes = 1; + } + print_one_char (current_char, stream, &in_quotes); + ++things_printed; + } + } - /* See language.h. */ + /* Terminate the quotes if necessary. */ + if (in_quotes) + fputs_filtered ("'", stream); - const struct op_print *opcode_print_table () const override - { return pascal_op_print_tab; } -}; + if (force_ellipses || i < length) + fputs_filtered ("...", stream); +} /* Single instance of the Pascal language class. */ 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 &filename_extensions () const override + { + static const std::vector 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 */ diff --git a/gdb/p-typeprint.c b/gdb/p-typeprint.c index b53a0de0c97..36c337c8f9a 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; diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index 8f785b71ea4..b748c066fb0 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -64,9 +64,9 @@ static const struct generic_val_print_decorations p_decorations = /* See p-lang.h. */ void -pascal_value_print_inner (struct value *val, struct ui_file *stream, - int recurse, - const struct value_print_options *options) +pascal_language::value_print_inner (struct value *val, + struct ui_file *stream, int recurse, + const struct value_print_options *options) const { struct type *type = check_typedef (value_type (val)); @@ -200,8 +200,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream, as GDB does not recognize stabs pascal strings Pascal strings are mapped to records with lowercase names PM. */ - if (is_pascal_string_type (elttype, &length_pos, &length_size, - &string_pos, &char_type, NULL) + if (pascal_is_string_type (elttype, &length_pos, &length_size, + &string_pos, &char_type, NULL) > 0 && addr != 0) { ULONGEST string_length; @@ -313,8 +313,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream, } else { - if (is_pascal_string_type (type, &length_pos, &length_size, - &string_pos, &char_type, NULL)) + if (pascal_is_string_type (type, &length_pos, &length_size, + &string_pos, &char_type, NULL) > 0) { len = extract_unsigned_integer (valaddr + length_pos, length_size, byte_order); @@ -402,8 +402,8 @@ pascal_value_print_inner (struct value *val, struct ui_file *stream, void -pascal_value_print (struct value *val, struct ui_file *stream, - const struct value_print_options *options) +pascal_language::value_print (struct value *val, struct ui_file *stream, + const struct value_print_options *options) const { struct type *type = value_type (val); struct value_print_options opts = *options; @@ -499,9 +499,7 @@ pascal_object_is_vtbl_member (struct type *type) return 0; } -/* Mutually recursive subroutines of pascal_object_print_value and - pascal_value_print to print out a structure's fields: - pascal_object_print_value_fields and pascal_object_print_value. +/* Helper function for print pascal objects. VAL, STREAM, RECURSE, and OPTIONS have the same meanings as in pascal_object_print_value and c_value_print.