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:
Tom Tromey 2021-03-08 07:27:57 -07:00
parent de401988ae
commit 75f9892d43
3 changed files with 62 additions and 0 deletions

View file

@ -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.

View file

@ -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

View file

@ -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
{