summaryrefslogtreecommitdiff
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:23 -0700
commitcbc18219d313984150f25af6cc66c866e1686190 (patch)
tree3d389830898d13f65dc6f509c785e461010286a6 /gdb/expop.h
parentae4bb61e199c90c71e3482169233a0f40f446484 (diff)
downloadbinutils-gdb-cbc18219d313984150f25af6cc66c866e1686190.tar.gz
Implement UNOP_MEMVAL and UNOP_MEMVAL_TYPE
This adds class unop_memval_operation and unop_memval_type_operation, which implement UNOP_MEMVAL and UNOP_MEMVAL_TYPE. gdb/ChangeLog 2021-03-08 Tom Tromey <tom@tromey.com> * expop.h (class unop_memval_operation) (class unop_memval_type_operation): New. * eval.c (eval_op_memval): No longer static. (unop_memval_operation::evaluate_for_address) (unop_memval_type_operation::evaluate_for_address) (unop_memval_operation::evaluate_for_sizeof) (unop_memval_type_operation::evaluate_for_sizeof): New methods. * ax-gdb.c (unop_memval_operation::do_generate_ax) (unop_memval_type_operation::do_generate_ax): New methods.
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 87e52acb6bf..b808c0f63bc 100644
--- a/gdb/expop.h
+++ b/gdb/expop.h
@@ -193,6 +193,10 @@ extern struct value *eval_op_alignof (struct type *expect_type,
struct expression *exp,
enum noside noside,
struct value *arg1);
+extern struct value *eval_op_memval (struct type *expect_type,
+ struct expression *exp,
+ enum noside noside,
+ struct value *arg1, struct type *type);
namespace expr
{
@@ -1636,6 +1640,79 @@ public:
{ return UNOP_ALIGNOF; }
};
+/* Implement UNOP_MEMVAL. */
+class unop_memval_operation
+ : public tuple_holding_operation<operation_up, struct type *>
+{
+public:
+
+ using tuple_holding_operation::tuple_holding_operation;
+
+ value *evaluate (struct type *expect_type,
+ struct expression *exp,
+ enum noside noside) override
+ {
+ value *val = std::get<0> (m_storage)->evaluate (expect_type, exp, noside);
+ return eval_op_memval (expect_type, exp, noside, val,
+ std::get<1> (m_storage));
+ }
+
+ value *evaluate_for_sizeof (struct expression *exp,
+ enum noside noside) override;
+
+ value *evaluate_for_address (struct expression *exp,
+ enum noside noside) override;
+
+ enum exp_opcode opcode () const override
+ { return UNOP_MEMVAL; }
+
+protected:
+
+ void do_generate_ax (struct expression *exp,
+ struct agent_expr *ax,
+ struct axs_value *value,
+ struct type *cast_type)
+ override;
+};
+
+/* Implement UNOP_MEMVAL_TYPE. */
+class unop_memval_type_operation
+ : public tuple_holding_operation<operation_up, operation_up>
+{
+public:
+
+ using tuple_holding_operation::tuple_holding_operation;
+
+ value *evaluate (struct type *expect_type,
+ struct expression *exp,
+ enum noside noside) override
+ {
+ value *typeval
+ = std::get<0> (m_storage)->evaluate (expect_type, exp,
+ EVAL_AVOID_SIDE_EFFECTS);
+ struct type *type = value_type (typeval);
+ value *val = std::get<1> (m_storage)->evaluate (expect_type, exp, noside);
+ return eval_op_memval (expect_type, exp, noside, val, type);
+ }
+
+ value *evaluate_for_sizeof (struct expression *exp,
+ enum noside noside) override;
+
+ value *evaluate_for_address (struct expression *exp,
+ enum noside noside) override;
+
+ enum exp_opcode opcode () const override
+ { return UNOP_MEMVAL_TYPE; }
+
+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 */