From 1c4852651c26d88494b6c2988f9bee164f1f3d34 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Fri, 30 Oct 2020 15:09:35 +0000 Subject: gdb: move rust_language into rust-lang.h Move the rust_language class declaration into the rust-lang.h header file. This allows for the function implementations called directly in rust-lang.c and rust-exp.y without the need for trampoline functions. There should be no user visible changes after this commit. gdb/ChangeLog: * rust-exp.y (rust_parse): Rename to... (rust_language::parser): ...this. * rust-lang.c (-rust_printstr): Rename to... (rust_language::printstr): ...this. (rust_value_print_inner): Delete declaration. (val_print_struct): Rename to... (rust_language::val_print_struct): ...this. Update calls to member functions. (rust_print_enum): Rename to... (rust_language::print_enum): ...this. Update calls to member functions. (rust_value_print_inner): Rename to... (rust_language::value_print_inner): ...this. Update calls to member functions. (exp_descriptor_rust): Rename to... (rust_language::exp_descriptor_tab): ...this. (class rust_language): Move to rust-lang.h. (rust_language::language_arch_info): Implementation moved to here from class declaration. (rust_language::print_type): Likewise. (rust_language::emitchar): Likewise. (rust_language::is_string_type_p): Likewise. * rust-lang.h: Add 'demangle.h', 'language.h', 'value.h', and 'c-lang.h' includes. (rust_parse): Delete declaration. (class rust_language): Class declaration moved here from rust-lang.c. --- gdb/rust-lang.h | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 3 deletions(-) (limited to 'gdb/rust-lang.h') diff --git a/gdb/rust-lang.h b/gdb/rust-lang.h index 3ab860e..df94fc1 100644 --- a/gdb/rust-lang.h +++ b/gdb/rust-lang.h @@ -20,12 +20,14 @@ #ifndef RUST_LANG_H #define RUST_LANG_H +#include "demangle.h" +#include "language.h" +#include "value.h" +#include "c-lang.h" + struct parser_state; struct type; -/* The la_parser implementation for Rust. */ -extern int rust_parse (struct parser_state *); - /* Return true if TYPE is a tuple type; otherwise false. */ extern bool rust_tuple_type_p (struct type *type); @@ -48,4 +50,194 @@ extern const char *rust_last_path_segment (const char *path); extern struct type *rust_slice_type (const char *name, struct type *elt_type, struct type *usize_type); +/* Class representing the Rust language. */ + +class rust_language : public language_defn +{ +public: + rust_language () + : language_defn (language_rust) + { /* Nothing. */ } + + /* See language.h. */ + + const char *name () const override + { return "rust"; } + + /* See language.h. */ + + const char *natural_name () const override + { return "Rust"; } + + /* See language.h. */ + + const std::vector &filename_extensions () const override + { + static const std::vector extensions = { ".rs" }; + return extensions; + } + + /* See language.h. */ + + void language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) const override; + + /* See language.h. */ + + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); + return *demangled != NULL; + } + + /* See language.h. */ + + char *demangle_symbol (const char *mangled, int options) const override + { + return gdb_demangle (mangled, options); + } + + /* 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; + + /* See language.h. */ + + gdb::unique_xmalloc_ptr watch_location_expression + (struct type *type, CORE_ADDR addr) const override + { + type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type))); + std::string name = type_to_string (type); + return gdb::unique_xmalloc_ptr + (xstrprintf ("*(%s as *mut %s)", core_addr_to_string (addr), + name.c_str ())); + } + + /* 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. */ + + struct block_symbol lookup_symbol_nonlocal + (const char *name, const struct block *block, + const domain_enum domain) const override + { + struct block_symbol result = {}; + + if (symbol_lookup_debug) + { + fprintf_unfiltered (gdb_stdlog, + "rust_lookup_symbol_non_local" + " (%s, %s (scope %s), %s)\n", + name, host_address_to_string (block), + block_scope (block), domain_name (domain)); + } + + /* Look up bare names in the block's scope. */ + std::string scopedname; + if (name[cp_find_first_component (name)] == '\0') + { + const char *scope = block_scope (block); + + if (scope[0] != '\0') + { + scopedname = std::string (scope) + "::" + name; + name = scopedname.c_str (); + } + else + name = NULL; + } + + if (name != NULL) + { + result = lookup_symbol_in_static_block (name, block, domain); + if (result.symbol == NULL) + result = lookup_global_symbol (name, block, domain); + } + return result; + } + + /* 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; + + /* See language.h. */ + + void printchar (int ch, struct type *chtype, + struct ui_file *stream) const override + { + fputs_filtered ("'", stream); + emitchar (ch, chtype, stream, '\''); + fputs_filtered ("'", stream); + } + + /* 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 + { + type = check_typedef (type); + fprintf_filtered (stream, "type %s = ", new_symbol->print_name ()); + type_print (type, "", stream, 0); + fprintf_filtered (stream, ";"); + } + + /* See language.h. */ + + bool is_string_type_p (struct type *type) const override; + + /* See language.h. */ + + bool range_checking_on_by_default () const override + { return true; } + + /* See language.h. */ + + const struct exp_descriptor *expression_ops () const override + { return &exp_descriptor_tab; } + + /* See language.h. */ + + const struct op_print *opcode_print_table () const override + { return c_op_print_tab; } + +private: + + /* Table of expression handling functions for use by EXPRESSION_OPS + member function. */ + + static const struct exp_descriptor exp_descriptor_tab; + + /* Helper for value_print_inner, arguments are as for that function. + Prints structs and untagged unions. */ + + void val_print_struct (struct value *val, struct ui_file *stream, + int recurse, + const struct value_print_options *options) const; + + /* Helper for value_print_inner, arguments are as for that function. + Prints discriminated unions (Rust enums). */ + + void print_enum (struct value *val, struct ui_file *stream, int recurse, + const struct value_print_options *options) const; +}; + #endif /* RUST_LANG_H */ -- cgit v1.1