[binutils-gdb] Convert dtrace probes to use operations
Tom Tromey
tromey@sourceware.org
Mon Mar 8 14:52:41 GMT 2021
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=482ddd69c5f026aac98932be2fa8ac985b37d5be
commit 482ddd69c5f026aac98932be2fa8ac985b37d5be
Author: Tom Tromey <tom@tromey.com>
Date: Mon Mar 8 07:27:57 2021 -0700
Convert dtrace probes to use operations
This changes dtrace to use the new operation type.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* gdbarch.sh (dtrace_parse_probe_argument): Change return type.
* gdbarch.h: Rebuild.
* gdbarch.c: Rebuild.
* dtrace-probe.c (dtrace_probe::build_arg_exprs): Update.
* amd64-linux-tdep.c (amd64_dtrace_parse_probe_argument): Change
return type.
(amd64_dtrace_parse_probe_argument): Update.
Diff:
---
gdb/ChangeLog | 10 ++++++++++
gdb/amd64-linux-tdep.c | 39 ++++++++++++++-------------------------
gdb/dtrace-probe.c | 13 ++++++-------
gdb/gdbarch.c | 6 +++---
gdb/gdbarch.h | 4 ++--
gdb/gdbarch.sh | 2 +-
6 files changed, 36 insertions(+), 38 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 060b9a12b35..87c56158588 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,13 @@
+2021-03-08 Tom Tromey <tom@tromey.com>
+
+ * gdbarch.sh (dtrace_parse_probe_argument): Change return type.
+ * gdbarch.h: Rebuild.
+ * gdbarch.c: Rebuild.
+ * dtrace-probe.c (dtrace_probe::build_arg_exprs): Update.
+ * amd64-linux-tdep.c (amd64_dtrace_parse_probe_argument): Change
+ return type.
+ (amd64_dtrace_parse_probe_argument): Update.
+
2021-03-08 Tom Tromey <tom@tromey.com>
* parser-defs.h (struct parser_state) <push, push_new,
diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index 00d19be5ba0..ac6843c1fdd 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -41,6 +41,7 @@
#include "glibc-tdep.h"
#include "arch/amd64.h"
#include "target-descriptions.h"
+#include "expop.h"
/* The syscall's XML filename for i386. */
#define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
@@ -1733,17 +1734,16 @@ amd64_dtrace_disable_probe (struct gdbarch *gdbarch, CORE_ADDR addr)
/* Implementation of `gdbarch_dtrace_parse_probe_argument', as defined
in gdbarch.h. */
-static void
+static expr::operation_up
amd64_dtrace_parse_probe_argument (struct gdbarch *gdbarch,
- struct expr_builder *builder,
int narg)
{
- struct stoken str;
-
/* DTrace probe arguments can be found on the ABI-defined places for
regular arguments at the current PC. The probe abstraction
currently supports up to 12 arguments for probes. */
+ using namespace expr;
+
if (narg < 6)
{
static const int arg_reg_map[6] =
@@ -1757,12 +1757,7 @@ amd64_dtrace_parse_probe_argument (struct gdbarch *gdbarch,
};
int regno = arg_reg_map[narg];
const char *regname = user_reg_map_regnum_to_name (gdbarch, regno);
-
- write_exp_elt_opcode (builder, OP_REGISTER);
- str.ptr = regname;
- str.length = strlen (regname);
- write_exp_string (builder, str);
- write_exp_elt_opcode (builder, OP_REGISTER);
+ return make_operation<register_operation> (regname);
}
else
{
@@ -1770,27 +1765,21 @@ amd64_dtrace_parse_probe_argument (struct gdbarch *gdbarch,
const char *regname = user_reg_map_regnum_to_name (gdbarch, AMD64_RSP_REGNUM);
/* Displacement. */
- write_exp_elt_opcode (builder, OP_LONG);
- write_exp_elt_type (builder, builtin_type (gdbarch)->builtin_long);
- write_exp_elt_longcst (builder, narg - 6);
- write_exp_elt_opcode (builder, OP_LONG);
+ struct type *long_type = builtin_type (gdbarch)->builtin_long;
+ operation_up disp = make_operation<long_const_operation> (long_type,
+ narg - 6);
/* Register: SP. */
- write_exp_elt_opcode (builder, OP_REGISTER);
- str.ptr = regname;
- str.length = strlen (regname);
- write_exp_string (builder, str);
- write_exp_elt_opcode (builder, OP_REGISTER);
+ operation_up reg = make_operation<register_operation> (regname);
- write_exp_elt_opcode (builder, BINOP_ADD);
+ operation_up add = make_operation<add_operation> (std::move (disp),
+ std::move (reg));
/* Cast to long. */
- write_exp_elt_opcode (builder, UNOP_CAST);
- write_exp_elt_type (builder,
- lookup_pointer_type (builtin_type (gdbarch)->builtin_long));
- write_exp_elt_opcode (builder, UNOP_CAST);
+ operation_up cast = make_operation<unop_cast_operation> (std::move (add),
+ long_type);
- write_exp_elt_opcode (builder, UNOP_IND);
+ return make_operation<unop_ind_operation> (std::move (cast));
}
}
diff --git a/gdb/dtrace-probe.c b/gdb/dtrace-probe.c
index f4b6becbf61..3fa02ddaebe 100644
--- a/gdb/dtrace-probe.c
+++ b/gdb/dtrace-probe.c
@@ -32,6 +32,7 @@
#include "language.h"
#include "parser-defs.h"
#include "inferior.h"
+#include "expop.h"
/* The type of the ELF sections where we will find the DOF programs
with information about probes. */
@@ -629,20 +630,18 @@ dtrace_probe::build_arg_exprs (struct gdbarch *gdbarch)
/* The argument value, which is ABI dependent and casted to
`long int'. */
- gdbarch_dtrace_parse_probe_argument (gdbarch, &builder, argc);
+ expr::operation_up op = gdbarch_dtrace_parse_probe_argument (gdbarch,
+ argc);
/* Casting to the expected type, but only if the type was
recognized at probe load time. Otherwise the argument will
be evaluated as the long integer passed to the probe. */
if (arg.type != NULL)
- {
- write_exp_elt_opcode (&builder, UNOP_CAST);
- write_exp_elt_type (&builder, arg.type);
- write_exp_elt_opcode (&builder, UNOP_CAST);
- }
+ op = expr::make_operation<expr::unop_cast_operation> (std::move (op),
+ arg.type);
+ builder.set_operation (std::move (op));
arg.expr = builder.release ();
- prefixify_expression (arg.expr.get ());
++argc;
}
}
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index 43d1c154a7f..a233501f5b2 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -4637,14 +4637,14 @@ gdbarch_dtrace_parse_probe_argument_p (struct gdbarch *gdbarch)
return gdbarch->dtrace_parse_probe_argument != NULL;
}
-void
-gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, struct expr_builder *builder, int narg)
+expr::operation_up
+gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, int narg)
{
gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->dtrace_parse_probe_argument != NULL);
if (gdbarch_debug >= 2)
fprintf_unfiltered (gdb_stdlog, "gdbarch_dtrace_parse_probe_argument called\n");
- gdbarch->dtrace_parse_probe_argument (gdbarch, builder, narg);
+ return gdbarch->dtrace_parse_probe_argument (gdbarch, narg);
}
void
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
index 2fef567c06f..3b9d8da4f61 100644
--- a/gdb/gdbarch.h
+++ b/gdb/gdbarch.h
@@ -1386,8 +1386,8 @@ extern void set_gdbarch_stap_adjust_register (struct gdbarch *gdbarch, gdbarch_s
extern bool gdbarch_dtrace_parse_probe_argument_p (struct gdbarch *gdbarch);
-typedef void (gdbarch_dtrace_parse_probe_argument_ftype) (struct gdbarch *gdbarch, struct expr_builder *builder, int narg);
-extern void gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, struct expr_builder *builder, int narg);
+typedef expr::operation_up (gdbarch_dtrace_parse_probe_argument_ftype) (struct gdbarch *gdbarch, int narg);
+extern expr::operation_up gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, int narg);
extern void set_gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, gdbarch_dtrace_parse_probe_argument_ftype *dtrace_parse_probe_argument);
/* True if the given ADDR does not contain the instruction sequence
diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
index e7c96159241..d68d3b7a425 100755
--- a/gdb/gdbarch.sh
+++ b/gdb/gdbarch.sh
@@ -1025,7 +1025,7 @@ M;std::string;stap_adjust_register;struct stap_parse_info *p, const std::string
# The expression to compute the NARTGth+1 argument to a DTrace USDT probe.
# NARG must be >= 0.
-M;void;dtrace_parse_probe_argument;struct expr_builder *builder, int narg;builder, narg
+M;expr::operation_up;dtrace_parse_probe_argument;int narg;narg
# True if the given ADDR does not contain the instruction sequence
# corresponding to a disabled DTrace is-enabled probe.
More information about the Gdb-cvs
mailing list