mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 17:18:24 +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:
@ -1,3 +1,33 @@
|
|||||||
|
2020-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2020-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
|
2020-12-23 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
* objc-lang.c (objc_language::opcode_print_table): Return
|
* objc-lang.c (objc_language::opcode_print_table): Return
|
||||||
|
@ -2540,7 +2540,7 @@ rust_parser::convert_ast_to_expression (const struct rust_op *operation,
|
|||||||
/* The parser as exposed to gdb. */
|
/* The parser as exposed to gdb. */
|
||||||
|
|
||||||
int
|
int
|
||||||
rust_parse (struct parser_state *state)
|
rust_language::parser (struct parser_state *state) const
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
|
251
gdb/rust-lang.c
251
gdb/rust-lang.c
@ -262,13 +262,13 @@ rust_get_trait_object_pointer (struct value *value)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* language_defn::printstr implementation for Rust. */
|
/* See language.h. */
|
||||||
|
|
||||||
static void
|
void
|
||||||
rust_printstr (struct ui_file *stream, struct type *type,
|
rust_language::printstr (struct ui_file *stream, struct type *type,
|
||||||
const gdb_byte *string, unsigned int length,
|
const gdb_byte *string, unsigned int length,
|
||||||
const char *user_encoding, int force_ellipses,
|
const char *user_encoding, int force_ellipses,
|
||||||
const struct value_print_options *options)
|
const struct value_print_options *options) const
|
||||||
{
|
{
|
||||||
/* Rust always uses UTF-8, but let the caller override this if need
|
/* Rust always uses UTF-8, but let the caller override this if need
|
||||||
be. */
|
be. */
|
||||||
@ -295,10 +295,6 @@ rust_printstr (struct ui_file *stream, struct type *type,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void rust_value_print_inner (struct value *val, struct ui_file *stream,
|
|
||||||
int recurse,
|
|
||||||
const struct value_print_options *options);
|
|
||||||
|
|
||||||
/* Helper function to print a string slice. */
|
/* Helper function to print a string slice. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -314,11 +310,12 @@ rust_val_print_str (struct ui_file *stream, struct value *val,
|
|||||||
options);
|
options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rust_val_print helper for structs and untagged unions. */
|
/* See rust-lang.h. */
|
||||||
|
|
||||||
static void
|
void
|
||||||
val_print_struct (struct value *val, struct ui_file *stream, int recurse,
|
rust_language::val_print_struct
|
||||||
const struct value_print_options *options)
|
(struct value *val, struct ui_file *stream, int recurse,
|
||||||
|
const struct value_print_options *options) const
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int first_field;
|
int first_field;
|
||||||
@ -388,8 +385,7 @@ val_print_struct (struct value *val, struct ui_file *stream, int recurse,
|
|||||||
fputs_filtered (": ", stream);
|
fputs_filtered (": ", stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
rust_value_print_inner (value_field (val, i), stream, recurse + 1,
|
value_print_inner (value_field (val, i), stream, recurse + 1, &opts);
|
||||||
&opts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options->prettyformat)
|
if (options->prettyformat)
|
||||||
@ -404,11 +400,12 @@ val_print_struct (struct value *val, struct ui_file *stream, int recurse,
|
|||||||
fputs_filtered ("}", stream);
|
fputs_filtered ("}", stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rust_val_print helper for discriminated unions (Rust enums). */
|
/* See rust-lang.h. */
|
||||||
|
|
||||||
static void
|
void
|
||||||
rust_print_enum (struct value *val, struct ui_file *stream, int recurse,
|
rust_language::print_enum (struct value *val, struct ui_file *stream,
|
||||||
const struct value_print_options *options)
|
int recurse,
|
||||||
|
const struct value_print_options *options) const
|
||||||
{
|
{
|
||||||
struct value_print_options opts = *options;
|
struct value_print_options opts = *options;
|
||||||
struct type *type = check_typedef (value_type (val));
|
struct type *type = check_typedef (value_type (val));
|
||||||
@ -466,8 +463,7 @@ rust_print_enum (struct value *val, struct ui_file *stream, int recurse,
|
|||||||
styled_string (variable_name_style.style (),
|
styled_string (variable_name_style.style (),
|
||||||
TYPE_FIELD_NAME (variant_type, j)));
|
TYPE_FIELD_NAME (variant_type, j)));
|
||||||
|
|
||||||
rust_value_print_inner (value_field (val, j), stream, recurse + 1,
|
value_print_inner (value_field (val, j), stream, recurse + 1, &opts);
|
||||||
&opts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_tuple)
|
if (is_tuple)
|
||||||
@ -490,11 +486,12 @@ static const struct generic_val_print_decorations rust_decorations =
|
|||||||
"]"
|
"]"
|
||||||
};
|
};
|
||||||
|
|
||||||
/* la_value_print_inner implementation for Rust. */
|
/* See language.h. */
|
||||||
static void
|
|
||||||
rust_value_print_inner (struct value *val, struct ui_file *stream,
|
void
|
||||||
int recurse,
|
rust_language::value_print_inner
|
||||||
const struct value_print_options *options)
|
(struct value *val, struct ui_file *stream, int recurse,
|
||||||
|
const struct value_print_options *options) const
|
||||||
{
|
{
|
||||||
struct value_print_options opts = *options;
|
struct value_print_options opts = *options;
|
||||||
opts.deref_ref = 1;
|
opts.deref_ref = 1;
|
||||||
@ -557,7 +554,7 @@ rust_value_print_inner (struct value *val, struct ui_file *stream,
|
|||||||
byte string, hence the choice of "ASCII" as the
|
byte string, hence the choice of "ASCII" as the
|
||||||
encoding. */
|
encoding. */
|
||||||
fputs_filtered ("b", stream);
|
fputs_filtered ("b", stream);
|
||||||
rust_printstr (stream, TYPE_TARGET_TYPE (type),
|
printstr (stream, TYPE_TARGET_TYPE (type),
|
||||||
value_contents_for_printing (val),
|
value_contents_for_printing (val),
|
||||||
high_bound - low_bound + 1, "ASCII", 0, &opts);
|
high_bound - low_bound + 1, "ASCII", 0, &opts);
|
||||||
}
|
}
|
||||||
@ -586,7 +583,7 @@ rust_value_print_inner (struct value *val, struct ui_file *stream,
|
|||||||
|
|
||||||
case TYPE_CODE_STRUCT:
|
case TYPE_CODE_STRUCT:
|
||||||
if (rust_enum_p (type))
|
if (rust_enum_p (type))
|
||||||
rust_print_enum (val, stream, recurse, &opts);
|
print_enum (val, stream, recurse, &opts);
|
||||||
else
|
else
|
||||||
val_print_struct (val, stream, recurse, &opts);
|
val_print_struct (val, stream, recurse, &opts);
|
||||||
break;
|
break;
|
||||||
@ -1849,7 +1846,7 @@ rust_operator_check (struct expression *exp, int pos,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const struct exp_descriptor exp_descriptor_rust =
|
const struct exp_descriptor rust_language::exp_descriptor_tab =
|
||||||
{
|
{
|
||||||
rust_print_subexp,
|
rust_print_subexp,
|
||||||
rust_operator_length,
|
rust_operator_length,
|
||||||
@ -1858,37 +1855,12 @@ static const struct exp_descriptor exp_descriptor_rust =
|
|||||||
rust_evaluate_subexp
|
rust_evaluate_subexp
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Class representing the Rust language. */
|
/* See language.h. */
|
||||||
|
|
||||||
class rust_language : public language_defn
|
void
|
||||||
|
rust_language::language_arch_info (struct gdbarch *gdbarch,
|
||||||
|
struct language_arch_info *lai) const
|
||||||
{
|
{
|
||||||
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
|
|
||||||
{
|
|
||||||
const struct builtin_type *builtin = builtin_type (gdbarch);
|
const struct builtin_type *builtin = builtin_type (gdbarch);
|
||||||
|
|
||||||
/* Helper function to allow shorter lines below. */
|
/* Helper function to allow shorter lines below. */
|
||||||
@ -1925,108 +1897,26 @@ public:
|
|||||||
|
|
||||||
lai->set_bool_type (bool_type);
|
lai->set_bool_type (bool_type);
|
||||||
lai->set_string_char_type (u8_type);
|
lai->set_string_char_type (u8_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See language.h. */
|
/* 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. */
|
void
|
||||||
|
rust_language::print_type (struct type *type, const char *varstring,
|
||||||
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,
|
struct ui_file *stream, int show, int level,
|
||||||
const struct type_print_options *flags) const override
|
const struct type_print_options *flags) const
|
||||||
{
|
{
|
||||||
print_offset_data podata;
|
print_offset_data podata;
|
||||||
rust_internal_print_type (type, varstring, stream, show, level,
|
rust_internal_print_type (type, varstring, stream, show, level,
|
||||||
flags, false, &podata);
|
flags, false, &podata);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See language.h. */
|
/* See language.h. */
|
||||||
|
|
||||||
gdb::unique_xmalloc_ptr<char> watch_location_expression
|
void
|
||||||
(struct type *type, CORE_ADDR addr) const override
|
rust_language::emitchar (int ch, struct type *chtype,
|
||||||
{
|
struct ui_file *stream, int quoter) const
|
||||||
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
|
|
||||||
{
|
|
||||||
return rust_value_print_inner (val, stream, recurse, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
{
|
|
||||||
return rust_parse (ps);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
void emitchar (int ch, struct type *chtype,
|
|
||||||
struct ui_file *stream, int quoter) const override
|
|
||||||
{
|
|
||||||
if (!rust_chartype_p (chtype))
|
if (!rust_chartype_p (chtype))
|
||||||
generic_emit_char (ch, chtype, stream, quoter,
|
generic_emit_char (ch, chtype, stream, quoter,
|
||||||
target_charset (get_type_arch (chtype)));
|
target_charset (get_type_arch (chtype)));
|
||||||
@ -2046,44 +1936,13 @@ public:
|
|||||||
fprintf_filtered (stream, "\\x%02x", ch);
|
fprintf_filtered (stream, "\\x%02x", ch);
|
||||||
else
|
else
|
||||||
fprintf_filtered (stream, "\\u{%06x}", ch);
|
fprintf_filtered (stream, "\\u{%06x}", ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See language.h. */
|
/* See language.h. */
|
||||||
|
|
||||||
void printchar (int ch, struct type *chtype,
|
bool
|
||||||
struct ui_file *stream) const override
|
rust_language::is_string_type_p (struct type *type) const
|
||||||
{
|
{
|
||||||
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
|
|
||||||
{
|
|
||||||
rust_printstr (stream, elttype, string, length, encoding,
|
|
||||||
force_ellipses, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
{
|
|
||||||
LONGEST low_bound, high_bound;
|
LONGEST low_bound, high_bound;
|
||||||
|
|
||||||
type = check_typedef (type);
|
type = check_typedef (type);
|
||||||
@ -2097,23 +1956,7 @@ public:
|
|||||||
&& !rust_enum_p (type)
|
&& !rust_enum_p (type)
|
||||||
&& rust_slice_type_p (type)
|
&& rust_slice_type_p (type)
|
||||||
&& strcmp (type->name (), "&str") == 0));
|
&& strcmp (type->name (), "&str") == 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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_rust; }
|
|
||||||
|
|
||||||
/* See language.h. */
|
|
||||||
|
|
||||||
const struct op_print *opcode_print_table () const override
|
|
||||||
{ return c_op_print_tab; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Single instance of the Rust language class. */
|
/* Single instance of the Rust language class. */
|
||||||
|
|
||||||
|
198
gdb/rust-lang.h
198
gdb/rust-lang.h
@ -20,12 +20,14 @@
|
|||||||
#ifndef RUST_LANG_H
|
#ifndef RUST_LANG_H
|
||||||
#define RUST_LANG_H
|
#define RUST_LANG_H
|
||||||
|
|
||||||
|
#include "demangle.h"
|
||||||
|
#include "language.h"
|
||||||
|
#include "value.h"
|
||||||
|
#include "c-lang.h"
|
||||||
|
|
||||||
struct parser_state;
|
struct parser_state;
|
||||||
struct type;
|
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. */
|
/* Return true if TYPE is a tuple type; otherwise false. */
|
||||||
extern bool rust_tuple_type_p (struct type *type);
|
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,
|
extern struct type *rust_slice_type (const char *name, struct type *elt_type,
|
||||||
struct type *usize_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 */
|
#endif /* RUST_LANG_H */
|
||||||
|
Reference in New Issue
Block a user