From: Tom Tromey Date: Mon, 8 Mar 2021 14:27:57 +0000 (-0700) Subject: Add two agent expression helper functions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=75f9892d435f58fd12e26638a56564e374bfa951;p=binutils-gdb.git 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 94ce9918957..2b90a32e749 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 728b21dfd6a..1c6a7431143 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 97848fd5aa2..1bf06139dfb 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 {