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.
This commit is contained in:
parent
de401988ae
commit
75f9892d43
3 changed files with 62 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
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.
|
||||
|
|
46
gdb/ax-gdb.c
46
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
|
||||
|
|
10
gdb/expop.h
10
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
|
||||
{
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue