/* Rust language support definitions for GDB, the GNU debugger. Copyright (C) 2016-2021 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 . */ #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 &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. */ 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 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; } 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 */