diff options
author | Tom Tromey <tom@tromey.com> | 2021-03-08 07:27:57 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-03-08 07:28:14 -0700 |
commit | 75f9892d435f58fd12e26638a56564e374bfa951 (patch) | |
tree | 6ec69dd5e1d91fd0a367c4c69d1828a6311a123c /gdb/ax-gdb.c | |
parent | de401988aeac56a8478f61cde1b35e961742317b (diff) | |
download | gdb-75f9892d435f58fd12e26638a56564e374bfa951.zip gdb-75f9892d435f58fd12e26638a56564e374bfa951.tar.gz gdb-75f9892d435f58fd12e26638a56564e374bfa951.tar.bz2 |
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 <tom@tromey.com>
* expop.h (gen_expr_binop, gen_expr_structop): Declare.
* ax-gdb.c (gen_expr_binop): New function.
(gen_expr_structop): Likewise.
Diffstat (limited to 'gdb/ax-gdb.c')
-rw-r--r-- | gdb/ax-gdb.c | 46 |
1 files changed, 46 insertions, 0 deletions
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 |