mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-17 07:53:51 +08:00
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.
This commit is contained in:
198
gdb/rust-lang.h
198
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 */
|
||||
|
Reference in New Issue
Block a user