summaryrefslogtreecommitdiff
path: root/gdb
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
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')
-rw-r--r--gdb/ChangeLog66
-rw-r--r--gdb/p-exp.y11
-rw-r--r--gdb/p-lang.c384
-rw-r--r--gdb/p-lang.h245
-rw-r--r--gdb/p-typeprint.c214
-rw-r--r--gdb/p-valprint.c22
6 files changed, 506 insertions, 436 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a0f46226211..57d8065bfe3 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,71 @@
2020-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
+ * 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 <andrew.burgess@embecosm.com>
+
* go-exp.y (go_parse): Rename to...
(go_language::parser): ...this.
* go-lang.c (go_demangle): 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<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
- {
- 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[<repeats %u times>%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[<repeats %u times>%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<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 */
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 <ctype.h>
#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.