aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/ax-gdb.c46
-rw-r--r--gdb/expop.h10
3 files changed, 62 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 94ce991..2b90a32 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2021-03-08 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.
+
+2021-03-08 Tom Tromey <tom@tromey.com>
+
* expprint.c (expr::dump_for_expression): New functions.
* expop.h (dump_for_expression): New overloads.
(tuple_holding_operation::dump, tuple_holding_operation::do_dump):
diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index 728b21d..1c6a743 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -45,6 +45,7 @@
#include "typeprint.h"
#include "valprint.h"
#include "c-lang.h"
+#include "expop.h"
#include "gdbsupport/format.h"
@@ -158,6 +159,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 +2465,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 97848fd..1bf0613 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
{