X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/b811d2c2920ddcb1adcd438da38e90912b31f45f..HEAD:/gdb/rust-lang.h diff --git a/gdb/rust-lang.h b/gdb/rust-lang.h index 3ab860e086..a1d10263fe 100644 --- a/gdb/rust-lang.h +++ b/gdb/rust-lang.h @@ -1,6 +1,6 @@ /* Rust language support definitions for GDB, the GNU debugger. - Copyright (C) 2016-2020 Free Software Foundation, Inc. + Copyright (C) 2016-2022 Free Software Foundation, Inc. This file is part of GDB. @@ -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,197 @@ 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 char *get_digit_separator () const override + { return "_"; } + + /* 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, gdb::unique_xmalloc_ptr *demangled) + const override + { + *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); + return *demangled != NULL; + } + + /* See language.h. */ + + gdb::unique_xmalloc_ptr demangle_symbol (const char *mangled, + int options) const override + { + return gdb_demangle (mangled, options); + } + + /* See language.h. */ + + bool can_print_type_offsets () const override + { + return true; + } + + /* 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 (check_typedef (type)->target_type ()); + std::string name = type_to_string (type); + return 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. */ + + void value_print (struct value *val, struct ui_file *stream, + 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) + { + gdb_printf (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 + { + gdb_puts ("'", stream); + emitchar (ch, chtype, stream, '\''); + gdb_puts ("'", 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); + gdb_printf (stream, "type %s = ", new_symbol->print_name ()); + type_print (type, "", stream, 0); + gdb_printf (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; } + +private: + + /* 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 */