[075/203] Add two agent expression helper functions

Message ID 20210101214723.1784144-76-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 a couple of agent expression helper functions that will be
useful when implementing various operations.

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

	* expop.h (gen_expr_binop, gen_expr_structop): Declare.
	* ax-gdb.c (gen_expr_binop): New function.
	(gen_expr_structop): Likewise.
---
 gdb/ChangeLog |  6 ++++++
 gdb/ax-gdb.c  | 45 +++++++++++++++++++++++++++++++++++++++++++++
 gdb/expop.h   | 10 ++++++++++
 3 files changed, 61 insertions(+)

-- 
2.26.2

Patch

diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index 728b21dfd6a..1ffa8e49bf1 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -158,6 +158,12 @@  static void gen_expr_binop_rest (struct expression *exp,
 				 struct axs_value *value,
 				 struct axs_value *value1,
 				 struct axs_value *value2);
+static void gen_expr_binop_rest (struct expression *exp,
+				 enum exp_opcode op,
+				 struct agent_expr *ax,
+				 struct axs_value *value,
+				 struct axs_value *value1,
+				 struct axs_value *value2);
 
 
 /* Detecting constant expressions.  */
@@ -2458,6 +2464,45 @@  gen_expr_binop_rest (struct expression *exp,
   gen_expr (exp, pc, ax, value2);
   gen_expr_binop_rest (exp, op, ax, value, value1, value2);
 }
+
+/* A helper function that emits a binop based on two operations.  */
+
+void
+gen_expr_binop (struct expression *exp,
+		enum exp_opcode op,
+		expr::operation *lhs, expr::operation *rhs,
+		struct agent_expr *ax, struct axs_value *value)
+{
+  struct axs_value value1, value2;
+
+  lhs->generate_ax (exp, ax, &value1);
+  gen_usual_unary (ax, &value1);
+  rhs->generate_ax (exp, ax, &value2);
+  gen_expr_binop_rest (exp, op, ax, value, &value1, &value2);
+}
+
+/* A helper function that emits a structop based on an operation and a
+   member name.  */
+
+void
+gen_expr_structop (struct expression *exp,
+		   enum exp_opcode op,
+		   expr::operation *lhs,
+		   const char *name,
+		   struct agent_expr *ax, struct axs_value *value)
+{
+  lhs->generate_ax (exp, ax, value);
+  if (op == STRUCTOP_STRUCT)
+    gen_struct_ref (ax, value, name, ".", "structure or union");
+  else if (op == STRUCTOP_PTR)
+    gen_struct_ref (ax, value, name, "->",
+		    "pointer to a structure or union");
+  else
+    /* If this `if' chain doesn't handle it, then the case list
+       shouldn't mention it, and we shouldn't be here.  */
+    internal_error (__FILE__, __LINE__,
+		    _("gen_expr: unhandled struct case"));
+}
 
 
 /* Given a single variable and a scope, generate bytecodes to trace
diff --git a/gdb/expop.h b/gdb/expop.h
index 9fea1152cc9..2e7191cf59c 100644
--- a/gdb/expop.h
+++ b/gdb/expop.h
@@ -31,6 +31,16 @@ 
 struct agent_expr;
 struct axs_value;
 
+extern void gen_expr_binop (struct expression *exp,
+			    enum exp_opcode op,
+			    expr::operation *lhs, expr::operation *rhs,
+			    struct agent_expr *ax, struct axs_value *value);
+extern void gen_expr_structop (struct expression *exp,
+			       enum exp_opcode op,
+			       expr::operation *lhs,
+			       const char *name,
+			       struct agent_expr *ax, struct axs_value *value);
+
 namespace expr
 {