diff options
-rw-r--r-- | gdb/ChangeLog | 16 | ||||
-rw-r--r-- | gdb/language.c | 215 |
2 files changed, 76 insertions, 155 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 282100a..8de8376 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2020-10-23 Andrew Burgess <andrew.burgess@embecosm.com> + + * language.c (default_is_string_type_p): Delete, implementation + moved into auto_or_unknown_language::is_string_type_p. + (unk_op_print_tab): Moved into + auto_or_unknown_language::opcode_print_table. + (unknown_language_arch_info): Delete, implementation moved into + auto_or_unknown_language::language_arch_info. + (class auto_or_unknown_language): New class, member functions + copied from unknown_language class, with some updates. + (class unknown_language): Most member functions moved into + auto_or_unknown_language class. Inherit from + auto_or_unknown_language class. + (class auto_language): Inherit from auto_or_unknown_language. + Delete most member functions. + 2020-10-22 Hannes Domani <ssbssa@yahoo.de> * stabsread.c (read_member_functions): Remove gdb_assert. diff --git a/gdb/language.c b/gdb/language.c index 761f496..ffc1e85 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -782,60 +782,25 @@ language_defn::expression_ops () const return &exp_descriptor_standard; } -/* Return true if TYPE is a string type, otherwise return false. This - default implementation only detects TYPE_CODE_STRING. */ +/* Parent class for both the "auto" and "unknown" languages. These two + pseudo-languages are very similar so merging their implementations like + this makes sense. */ -static bool -default_is_string_type_p (struct type *type) -{ - type = check_typedef (type); - while (type->code () == TYPE_CODE_REF) - { - type = TYPE_TARGET_TYPE (type); - type = check_typedef (type); - } - return (type->code () == TYPE_CODE_STRING); -} - -static const struct op_print unk_op_print_tab[] = -{ - {NULL, OP_NULL, PREC_NULL, 0} -}; - -static void -unknown_language_arch_info (struct gdbarch *gdbarch, - struct language_arch_info *lai) -{ - lai->string_char_type = builtin_type (gdbarch)->builtin_char; - lai->bool_type_default = builtin_type (gdbarch)->builtin_int; - lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1, - struct type *); -} - -/* Class representing the unknown language. */ - -class unknown_language : public language_defn +class auto_or_unknown_language : public language_defn { public: - unknown_language () - : language_defn (language_unknown) + auto_or_unknown_language (enum language lang) + : language_defn (lang) { /* Nothing. */ } /* See language.h. */ - - const char *name () const override - { return "unknown"; } - - /* See language.h. */ - - const char *natural_name () const override - { return "Unknown"; } - - /* See language.h. */ void language_arch_info (struct gdbarch *gdbarch, struct language_arch_info *lai) const override { - unknown_language_arch_info (gdbarch, lai); + lai->string_char_type = builtin_type (gdbarch)->builtin_char; + lai->bool_type_default = builtin_type (gdbarch)->builtin_int; + lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1, + struct type *); } /* See language.h. */ @@ -844,14 +809,15 @@ public: struct ui_file *stream, int show, int level, const struct type_print_options *flags) const override { - error (_("unimplemented unknown_language::print_type called")); + error (_("type printing not implemented for language \"%s\""), + natural_name ()); } /* See language.h. */ char *demangle (const char *mangled, int options) const override { - /* The unknown language just uses the C++ demangler. */ + /* The auto language just uses the C++ demangler. */ return gdb_demangle (mangled, options); } @@ -860,7 +826,8 @@ public: void value_print (struct value *val, struct ui_file *stream, const struct value_print_options *options) const override { - error (_("unimplemented unknown_language::value_print called")); + error (_("value printing not implemented for language \"%s\""), + natural_name ()); } /* See language.h. */ @@ -869,7 +836,8 @@ public: (struct value *val, struct ui_file *stream, int recurse, const struct value_print_options *options) const override { - error (_("unimplemented unknown_language::value_print_inner called")); + error (_("inner value printing not implemented for language \"%s\""), + natural_name ()); } /* See language.h. */ @@ -885,7 +853,8 @@ public: void emitchar (int ch, struct type *chtype, struct ui_file *stream, int quoter) const override { - error (_("unimplemented unknown_language::emitchar called")); + error (_("emit character not implemented for language \"%s\""), + natural_name ()); } /* See language.h. */ @@ -893,7 +862,8 @@ public: void printchar (int ch, struct type *chtype, struct ui_file *stream) const override { - error (_("unimplemented unknown_language::printchar called")); + error (_("print character not implemented for language \"%s\""), + natural_name ()); } /* See language.h. */ @@ -903,7 +873,8 @@ public: const char *encoding, int force_ellipses, const struct value_print_options *options) const override { - error (_("unimplemented unknown_language::printstr called")); + error (_("print string not implemented for language \"%s\""), + natural_name ()); } /* See language.h. */ @@ -911,14 +882,21 @@ public: void print_typedef (struct type *type, struct symbol *new_symbol, struct ui_file *stream) const override { - error (_("unimplemented unknown_language::print_typedef called")); + error (_("print typedef not implemented for language \"%s\""), + natural_name ()); } /* See language.h. */ bool is_string_type_p (struct type *type) const override { - return default_is_string_type_p (type); + type = check_typedef (type); + while (type->code () == TYPE_CODE_REF) + { + type = TYPE_TARGET_TYPE (type); + type = check_typedef (type); + } + return (type->code () == TYPE_CODE_STRING); } /* See language.h. */ @@ -928,26 +906,24 @@ public: /* See language.h. */ - bool store_sym_names_in_linkage_form_p () const override - { return true; } - - /* See language.h. */ - const struct op_print *opcode_print_table () const override - { return unk_op_print_tab; } -}; - -/* Single instance of the unknown language class. */ + { + static const struct op_print unk_op_print_tab[] = + { + {NULL, OP_NULL, PREC_NULL, 0} + }; -static unknown_language unknown_language_defn; + return unk_op_print_tab; + } +}; /* Class representing the fake "auto" language. */ -class auto_language : public language_defn +class auto_language : public auto_or_unknown_language { public: auto_language () - : language_defn (language_auto) + : auto_or_unknown_language (language_auto) { /* Nothing. */ } /* See language.h. */ @@ -959,111 +935,40 @@ public: const char *natural_name () const override { return "Auto"; } +}; - /* See language.h. */ - void language_arch_info (struct gdbarch *gdbarch, - struct language_arch_info *lai) const override - { - unknown_language_arch_info (gdbarch, lai); - } - - /* 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 - { - error (_("unimplemented auto_language::print_type called")); - } - - /* See language.h. */ - - char *demangle (const char *mangled, int options) const override - { - /* The auto language just uses the C++ demangler. */ - return gdb_demangle (mangled, options); - } - - /* See language.h. */ - - void value_print (struct value *val, struct ui_file *stream, - const struct value_print_options *options) const override - { - error (_("unimplemented auto_language::value_print called")); - } - - /* See language.h. */ - - void value_print_inner - (struct value *val, struct ui_file *stream, int recurse, - const struct value_print_options *options) const override - { - error (_("unimplemented auto_language::value_print_inner called")); - } - - /* See language.h. */ - - int parser (struct parser_state *ps) const override - { - /* No parsing is done, just claim success. */ - return 1; - } - - /* See language.h. */ - - void emitchar (int ch, struct type *chtype, - struct ui_file *stream, int quoter) const override - { - error (_("unimplemented auto_language::emitchar called")); - } - - /* See language.h. */ - - void printchar (int ch, struct type *chtype, - struct ui_file *stream) const override - { - error (_("unimplemented auto_language::printchar called")); - } - - /* See language.h. */ +/* Single instance of the fake "auto" language. */ - 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 - { - error (_("unimplemented auto_language::printstr called")); - } +static auto_language auto_language_defn; - /* See language.h. */ +/* Class representing the unknown language. */ - void print_typedef (struct type *type, struct symbol *new_symbol, - struct ui_file *stream) const override - { - error (_("unimplemented auto_language::print_typedef called")); - } +class unknown_language : public auto_or_unknown_language +{ +public: + unknown_language () + : auto_or_unknown_language (language_unknown) + { /* Nothing. */ } /* See language.h. */ - bool is_string_type_p (struct type *type) const override - { - return default_is_string_type_p (type); - } + const char *name () const override + { return "unknown"; } /* See language.h. */ - const char *name_of_this () const override - { return "this"; } + const char *natural_name () const override + { return "Unknown"; } /* See language.h. */ - const struct op_print *opcode_print_table () const override - { return unk_op_print_tab; } + bool store_sym_names_in_linkage_form_p () const override + { return true; } }; -/* Single instance of the fake "auto" language. */ +/* Single instance of the unknown language class. */ -static auto_language auto_language_defn; +static unknown_language unknown_language_defn; /* Per-architecture language information. */ |