From 75f9892d435f58fd12e26638a56564e374bfa951 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 8 Mar 2021 07:27:57 -0700 Subject: [PATCH] Add two agent expression helper functions This adds a couple of agent expression helper functions that will be useful when implementing various operations. gdb/ChangeLog 2021-03-08 Tom Tromey * 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 | 46 ++++++++++++++++++++++++++++++++++++++++++++++ gdb/expop.h | 10 ++++++++++ 3 files changed, 62 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 94ce991895..2b90a32e74 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2021-03-08 Tom Tromey + + * 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 * expprint.c (expr::dump_for_expression): New functions. diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index 728b21dfd6..1c6a743114 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 97848fd5aa..1bf06139df 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 { -- 2.34.1