diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/amd64-linux-tdep.c | 39 | ||||
-rw-r--r-- | gdb/dtrace-probe.c | 13 | ||||
-rw-r--r-- | gdb/gdbarch.c | 6 | ||||
-rw-r--r-- | gdb/gdbarch.h | 4 | ||||
-rwxr-xr-x | gdb/gdbarch.sh | 2 |
6 files changed, 36 insertions, 38 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 060b9a1..87c5615 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 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, push_c_string, push_symbol, push_dollar, pop, pop_vector, wrap, wrap2>: New methods. diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index 00d19be..ac6843c 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 f4b6bec..3fa02dd 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 43d1c15..a233501 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 2fef567..3b9d8da 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 e7c9615..d68d3b7 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. |