diff options
Diffstat (limited to 'gdb/rust-lang.h')
-rw-r--r-- | gdb/rust-lang.h | 198 |
1 files changed, 195 insertions, 3 deletions
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<const char *> &filename_extensions () const override + { + static const std::vector<const char *> 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<char> 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<char> + (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 */ |