diff options
author | Tom Tromey <tom@tromey.com> | 2021-03-08 07:27:57 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-03-08 07:28:20 -0700 |
commit | 9307d17b7a97bd49baf0d877785c43cf203b7cee (patch) | |
tree | 2a3cc7312867dfa2d2c1565739a3bf77b2be9e4c /gdb/expop.h | |
parent | ae64ba58b3bc5a9a023974f37515aee9862548fd (diff) | |
download | gdb-9307d17b7a97bd49baf0d877785c43cf203b7cee.zip gdb-9307d17b7a97bd49baf0d877785c43cf203b7cee.tar.gz gdb-9307d17b7a97bd49baf0d877785c43cf203b7cee.tar.bz2 |
Implement some unary operations
This introduces a couple of new template classes and then uses them to
implement some simple unary operations.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (unary_ftype): New typedef.
(unop_operation, usual_ax_binop_operation): New templates.
(unary_plus_operation, unary_neg_operation)
(unary_complement_operation, unary_logical_not_operation): New
typedefs.
* eval.c (eval_op_plus, eval_op_neg, eval_op_complement)
(eval_op_lognot): No longer static.
* ax-gdb.c (gen_expr_unop): New function.
Diffstat (limited to 'gdb/expop.h')
-rw-r--r-- | gdb/expop.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/gdb/expop.h b/gdb/expop.h index 2fa5b2f..abd914a 100644 --- a/gdb/expop.h +++ b/gdb/expop.h @@ -40,6 +40,10 @@ extern void gen_expr_structop (struct expression *exp, expr::operation *lhs, const char *name, struct agent_expr *ax, struct axs_value *value); +extern void gen_expr_unop (struct expression *exp, + enum exp_opcode op, + expr::operation *lhs, + struct agent_expr *ax, struct axs_value *value); extern struct value *eval_op_scope (struct type *expect_type, struct expression *exp, @@ -140,6 +144,24 @@ extern struct value *eval_op_repeat (struct type *expect_type, enum noside noside, enum exp_opcode op, struct value *arg1, struct value *arg2); +extern struct value *eval_op_plus (struct type *expect_type, + struct expression *exp, + enum noside noside, enum exp_opcode op, + struct value *arg1); +extern struct value *eval_op_neg (struct type *expect_type, + struct expression *exp, + enum noside noside, enum exp_opcode op, + struct value *arg1); +extern struct value *eval_op_complement (struct type *expect_type, + struct expression *exp, + enum noside noside, + enum exp_opcode op, + struct value *arg1); +extern struct value *eval_op_lognot (struct type *expect_type, + struct expression *exp, + enum noside noside, + enum exp_opcode op, + struct value *arg1); namespace expr { @@ -1239,6 +1261,61 @@ protected: override; }; +typedef struct value *unary_ftype (struct type *expect_type, + struct expression *exp, + enum noside noside, enum exp_opcode op, + struct value *arg1); + +/* Base class for unary operations. */ +template<enum exp_opcode OP, unary_ftype FUNC> +class unop_operation + : public maybe_constant_operation<operation_up> +{ +public: + + using maybe_constant_operation::maybe_constant_operation; + + value *evaluate (struct type *expect_type, + struct expression *exp, + enum noside noside) override + { + value *val = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); + return FUNC (expect_type, exp, noside, OP, val); + } + + enum exp_opcode opcode () const override + { return OP; } +}; + +/* Unary operations that can also be turned into agent expressions in + the "usual" way. */ +template<enum exp_opcode OP, unary_ftype FUNC> +class usual_ax_unop_operation + : public unop_operation<OP, FUNC> +{ + using unop_operation<OP, FUNC>::unop_operation; + +protected: + + void do_generate_ax (struct expression *exp, + struct agent_expr *ax, + struct axs_value *value, + struct type *cast_type) + override + { + gen_expr_unop (exp, OP, + std::get<0> (this->m_storage).get (), + ax, value); + } +}; + +using unary_plus_operation = usual_ax_unop_operation<UNOP_PLUS, eval_op_plus>; +using unary_neg_operation = usual_ax_unop_operation<UNOP_NEG, eval_op_neg>; +using unary_complement_operation + = usual_ax_unop_operation<UNOP_COMPLEMENT, eval_op_complement>; +using unary_logical_not_operation + = usual_ax_unop_operation<UNOP_LOGICAL_NOT, eval_op_lognot>; + } /* namespace expr */ #endif /* EXPOP_H */ |