Introduce register_operation
This adds class register_operation, which implements OP_REGISTER. gdb/ChangeLog 2021-03-08 Tom Tromey <tom@tromey.com> * expop.h (class register_operation): New. * eval.c (eval_op_register): No longer static. * ax-gdb.c (register_operation::do_generate_ax): New method.
This commit is contained in:
parent
247d935b83
commit
55bdbff857
@ -1,3 +1,9 @@
|
||||
2021-03-08 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* expop.h (class register_operation): New.
|
||||
* eval.c (eval_op_register): No longer static.
|
||||
* ax-gdb.c (register_operation::do_generate_ax): New method.
|
||||
|
||||
2021-03-08 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* expop.h (class last_operation): New.
|
||||
|
||||
24
gdb/ax-gdb.c
24
gdb/ax-gdb.c
@ -2341,6 +2341,30 @@ var_msym_value_operation::do_generate_ax (struct expression *exp,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
register_operation::do_generate_ax (struct expression *exp,
|
||||
struct agent_expr *ax,
|
||||
struct axs_value *value,
|
||||
struct type *cast_type)
|
||||
{
|
||||
const char *name = std::get<0> (m_storage).c_str ();
|
||||
int len = std::get<0> (m_storage).size ();
|
||||
int reg;
|
||||
|
||||
reg = user_reg_map_name_to_regnum (ax->gdbarch, name, len);
|
||||
if (reg == -1)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
_("Register $%s not available"), name);
|
||||
/* No support for tracing user registers yet. */
|
||||
if (reg >= gdbarch_num_cooked_regs (ax->gdbarch))
|
||||
error (_("'%s' is a user-register; "
|
||||
"GDB cannot yet trace user-register contents."),
|
||||
name);
|
||||
value->kind = axs_lvalue_register;
|
||||
value->u.reg = reg;
|
||||
value->type = register_type (ax->gdbarch, reg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* This handles the middle-to-right-side of code generation for binary
|
||||
|
||||
@ -1254,7 +1254,7 @@ eval_op_func_static_var (struct type *expect_type, struct expression *exp,
|
||||
|
||||
/* Helper function that implements the body of OP_REGISTER. */
|
||||
|
||||
static struct value *
|
||||
struct value *
|
||||
eval_op_register (struct type *expect_type, struct expression *exp,
|
||||
enum noside noside, const char *name)
|
||||
{
|
||||
|
||||
30
gdb/expop.h
30
gdb/expop.h
@ -58,6 +58,9 @@ extern struct value *eval_op_func_static_var (struct type *expect_type,
|
||||
struct expression *exp,
|
||||
enum noside noside,
|
||||
value *func, const char *var);
|
||||
extern struct value *eval_op_register (struct type *expect_type,
|
||||
struct expression *exp,
|
||||
enum noside noside, const char *name);
|
||||
|
||||
namespace expr
|
||||
{
|
||||
@ -597,6 +600,33 @@ public:
|
||||
{ return OP_LAST; }
|
||||
};
|
||||
|
||||
class register_operation
|
||||
: public tuple_holding_operation<std::string>
|
||||
{
|
||||
public:
|
||||
|
||||
using tuple_holding_operation::tuple_holding_operation;
|
||||
|
||||
value *evaluate (struct type *expect_type,
|
||||
struct expression *exp,
|
||||
enum noside noside) override
|
||||
{
|
||||
return eval_op_register (expect_type, exp, noside,
|
||||
std::get<0> (m_storage).c_str ());
|
||||
}
|
||||
|
||||
enum exp_opcode opcode () const override
|
||||
{ return OP_REGISTER; }
|
||||
|
||||
protected:
|
||||
|
||||
void do_generate_ax (struct expression *exp,
|
||||
struct agent_expr *ax,
|
||||
struct axs_value *value,
|
||||
struct type *cast_type)
|
||||
override;
|
||||
};
|
||||
|
||||
} /* namespace expr */
|
||||
|
||||
#endif /* EXPOP_H */
|
||||
|
||||
Loading…
Reference in New Issue
Block a user