[111/203] Introduce unop_addr_operation

Message ID 20210101214723.1784144-112-tom@tromey.com
State Superseded
Headers show
Series
  • Refactor expressions
Related show

Commit Message

Tom Tromey Jan. 1, 2021, 9:45 p.m.
This adds class unop_addr_operation, which implements UNOP_ADDR.

gdb/ChangeLog
2021-01-01  Tom Tromey  <tom@tromey.com>

	* expop.h (class unop_addr_operation): New.
	* ax-gdb.c (gen_expr_unop) <case UNOP_ADDR>: New.
---
 gdb/ChangeLog |  5 +++++
 gdb/ax-gdb.c  |  5 +++++
 gdb/expop.h   | 36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+)

-- 
2.26.2

Patch

diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index f7ab50f8cde..64710887534 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -2744,6 +2744,11 @@  gen_expr_unop (struct expression *exp,
       gen_deref (value);
       break;
 
+    case UNOP_ADDR:
+      lhs->generate_ax (exp, ax, value);
+      gen_address_of (value);
+      break;
+
     default:
       gdb_assert_not_reached ("invalid case in gen_expr_unop");
     }
diff --git a/gdb/expop.h b/gdb/expop.h
index 9f23b8afd7c..8ddc26d329a 100644
--- a/gdb/expop.h
+++ b/gdb/expop.h
@@ -1535,6 +1535,42 @@  class typeid_operation
   { return OP_TYPEID; }
 };
 
+/* Implement the address-of operation.  */
+class unop_addr_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
+  {
+    /* C++: check for and handle pointer to members.  */
+    if (noside == EVAL_SKIP)
+      return eval_skip_value (exp);
+    else
+      return std::get<0> (m_storage)->evaluate_for_address (exp, noside);
+  }
+
+  enum exp_opcode opcode () const override
+  { return UNOP_ADDR; }
+
+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, UNOP_ADDR,
+		   std::get<0> (this->m_storage).get (),
+		   ax, value);
+  }
+};
+
 } /* namespace expr */
 
 #endif /* EXPOP_H */