diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/ax-gdb.c | 46 | ||||
-rw-r--r-- | gdb/expop.h | 10 |
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 { |