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.
This commit is contained in:
Tom Tromey 2021-03-08 07:27:57 -07:00
parent 8227d9e2f4
commit 482ddd69c5
6 changed files with 36 additions and 38 deletions

View File

@ -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> 2021-03-08 Tom Tromey <tom@tromey.com>
* parser-defs.h (struct parser_state) <push, push_new, * parser-defs.h (struct parser_state) <push, push_new,

View File

@ -41,6 +41,7 @@
#include "glibc-tdep.h" #include "glibc-tdep.h"
#include "arch/amd64.h" #include "arch/amd64.h"
#include "target-descriptions.h" #include "target-descriptions.h"
#include "expop.h"
/* The syscall's XML filename for i386. */ /* The syscall's XML filename for i386. */
#define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml" #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 /* Implementation of `gdbarch_dtrace_parse_probe_argument', as defined
in gdbarch.h. */ in gdbarch.h. */
static void static expr::operation_up
amd64_dtrace_parse_probe_argument (struct gdbarch *gdbarch, amd64_dtrace_parse_probe_argument (struct gdbarch *gdbarch,
struct expr_builder *builder,
int narg) int narg)
{ {
struct stoken str;
/* DTrace probe arguments can be found on the ABI-defined places for /* DTrace probe arguments can be found on the ABI-defined places for
regular arguments at the current PC. The probe abstraction regular arguments at the current PC. The probe abstraction
currently supports up to 12 arguments for probes. */ currently supports up to 12 arguments for probes. */
using namespace expr;
if (narg < 6) if (narg < 6)
{ {
static const int arg_reg_map[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]; int regno = arg_reg_map[narg];
const char *regname = user_reg_map_regnum_to_name (gdbarch, regno); const char *regname = user_reg_map_regnum_to_name (gdbarch, regno);
return make_operation<register_operation> (regname);
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);
} }
else 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); const char *regname = user_reg_map_regnum_to_name (gdbarch, AMD64_RSP_REGNUM);
/* Displacement. */ /* Displacement. */
write_exp_elt_opcode (builder, OP_LONG); struct type *long_type = builtin_type (gdbarch)->builtin_long;
write_exp_elt_type (builder, builtin_type (gdbarch)->builtin_long); operation_up disp = make_operation<long_const_operation> (long_type,
write_exp_elt_longcst (builder, narg - 6); narg - 6);
write_exp_elt_opcode (builder, OP_LONG);
/* Register: SP. */ /* Register: SP. */
write_exp_elt_opcode (builder, OP_REGISTER); operation_up reg = make_operation<register_operation> (regname);
str.ptr = regname;
str.length = strlen (regname);
write_exp_string (builder, str);
write_exp_elt_opcode (builder, OP_REGISTER);
write_exp_elt_opcode (builder, BINOP_ADD); operation_up add = make_operation<add_operation> (std::move (disp),
std::move (reg));
/* Cast to long. */ /* Cast to long. */
write_exp_elt_opcode (builder, UNOP_CAST); operation_up cast = make_operation<unop_cast_operation> (std::move (add),
write_exp_elt_type (builder, long_type);
lookup_pointer_type (builtin_type (gdbarch)->builtin_long));
write_exp_elt_opcode (builder, UNOP_CAST);
write_exp_elt_opcode (builder, UNOP_IND); return make_operation<unop_ind_operation> (std::move (cast));
} }
} }

View File

@ -32,6 +32,7 @@
#include "language.h" #include "language.h"
#include "parser-defs.h" #include "parser-defs.h"
#include "inferior.h" #include "inferior.h"
#include "expop.h"
/* The type of the ELF sections where we will find the DOF programs /* The type of the ELF sections where we will find the DOF programs
with information about probes. */ 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 /* The argument value, which is ABI dependent and casted to
`long int'. */ `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 /* Casting to the expected type, but only if the type was
recognized at probe load time. Otherwise the argument will recognized at probe load time. Otherwise the argument will
be evaluated as the long integer passed to the probe. */ be evaluated as the long integer passed to the probe. */
if (arg.type != NULL) if (arg.type != NULL)
{ op = expr::make_operation<expr::unop_cast_operation> (std::move (op),
write_exp_elt_opcode (&builder, UNOP_CAST); arg.type);
write_exp_elt_type (&builder, arg.type);
write_exp_elt_opcode (&builder, UNOP_CAST);
}
builder.set_operation (std::move (op));
arg.expr = builder.release (); arg.expr = builder.release ();
prefixify_expression (arg.expr.get ());
++argc; ++argc;
} }
} }

View File

@ -4637,14 +4637,14 @@ gdbarch_dtrace_parse_probe_argument_p (struct gdbarch *gdbarch)
return gdbarch->dtrace_parse_probe_argument != NULL; return gdbarch->dtrace_parse_probe_argument != NULL;
} }
void expr::operation_up
gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, struct expr_builder *builder, int narg) gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, int narg)
{ {
gdb_assert (gdbarch != NULL); gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->dtrace_parse_probe_argument != NULL); gdb_assert (gdbarch->dtrace_parse_probe_argument != NULL);
if (gdbarch_debug >= 2) if (gdbarch_debug >= 2)
fprintf_unfiltered (gdb_stdlog, "gdbarch_dtrace_parse_probe_argument called\n"); 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 void

View File

@ -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); 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); typedef expr::operation_up (gdbarch_dtrace_parse_probe_argument_ftype) (struct gdbarch *gdbarch, int narg);
extern void gdbarch_dtrace_parse_probe_argument (struct gdbarch *gdbarch, struct expr_builder *builder, 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); 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 /* True if the given ADDR does not contain the instruction sequence

View File

@ -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. # The expression to compute the NARTGth+1 argument to a DTrace USDT probe.
# NARG must be >= 0. # 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 # True if the given ADDR does not contain the instruction sequence
# corresponding to a disabled DTrace is-enabled probe. # corresponding to a disabled DTrace is-enabled probe.