123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- /* Rust language support definitions for GDB, the GNU debugger.
- Copyright (C) 2016-2022 Free Software Foundation, Inc.
- This file is part of GDB.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
- #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;
- /* Return true if TYPE is a tuple type; otherwise false. */
- extern bool rust_tuple_type_p (struct type *type);
- /* Return true if TYPE is a tuple struct type; otherwise false. */
- extern bool rust_tuple_struct_type_p (struct type *type);
- /* Given a block, find the name of the block's crate. Returns an empty
- stringif no crate name can be found. */
- extern std::string rust_crate_for_block (const struct block *block);
- /* Returns the last segment of a Rust path like foo::bar::baz. Will
- not handle cases where the last segment contains generics. */
- extern const char *rust_last_path_segment (const char *path);
- /* Create a new slice type. NAME is the name of the type. ELT_TYPE
- is the type of the elements of the slice. USIZE_TYPE is the Rust
- "usize" type to use. The new type is allocated whereever ELT_TYPE
- is allocated. */
- 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, gdb::unique_xmalloc_ptr<char> *demangled)
- const override
- {
- *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI);
- return *demangled != NULL;
- }
- /* See language.h. */
- gdb::unique_xmalloc_ptr<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 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)
- {
- 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 */
|