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:
parent
8227d9e2f4
commit
482ddd69c5
@ -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,
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user