aboutsummaryrefslogtreecommitdiff
path: root/gdb/expop.h
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-03-08 07:27:57 -0700
committerTom Tromey <tom@tromey.com>2021-03-08 07:28:20 -0700
commit9307d17b7a97bd49baf0d877785c43cf203b7cee (patch)
tree2a3cc7312867dfa2d2c1565739a3bf77b2be9e4c /gdb/expop.h
parentae64ba58b3bc5a9a023974f37515aee9862548fd (diff)
downloadgdb-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.h77
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 */