diff options
-rw-r--r-- | gdb/ChangeLog | 31 | ||||
-rw-r--r-- | gdb/break-catch-throw.c | 6 | ||||
-rw-r--r-- | gdb/probe.c | 13 | ||||
-rw-r--r-- | gdb/probe.h | 12 | ||||
-rw-r--r-- | gdb/solib-svr4.c | 8 | ||||
-rw-r--r-- | gdb/stap-probe.c | 30 |
6 files changed, 71 insertions, 29 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6c7fda5..35a1d73 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,34 @@ +2013-12-11 Sergio Durigan Junior <sergiodj@redhat.com> + + * break-catch-throw.c (fetch_probe_arguments): Pass selected frame + to get_probe_argument_count and evaluate_probe_argument. + * probe.c (get_probe_argument_count): Adjust declaration to accept + frame. Pass frame to probe_ops's get_probe_argument_count. + (evaluate_probe_argument): Likewise, for evaluate_probe_argument. + (probe_safe_evaluate_at_pc): Pass frame to + get_probe_argument_count and evaluate_probe_argument. + * probe.h (struct probe_ops) <get_probe_argument_count, + evaluate_probe_argument>: Adjust declarations to accept frame. + (get_probe_argument_count, evaluate_probe_argument): Likewise. + * solib-svr4.c (solib_event_probe_action): Get current frame. + Pass it to get_probe_argument_count. + (svr4_handle_solib_event): Get current frame. Pass it to + get_probe_argument_count and evaluate_probe_argument. + * stap-probe.c (stap_parse_probe_arguments): Adjust declaration to + accept gdbarch. Do not obtain it from the probe's objfile. + (stap_get_probe_argument_count): Adjust declaration to accept + frame. Obtain gdbarch from the frame. Call generic + can_evaluate_probe_arguments. Pass gdbarch to + stap_parse_probe_arguments. + (stap_get_arg): Adjust declaration to accept gdbarch. Pass it to + stap_parse_probe_arguments. + (stap_evaluate_probe_argument): Adjust declaration to accept + frame. Obtain gdbarch from the frame. Pass gdbarch to + stap_get_arg. + (stap_compile_to_ax): Pass agent_expr's gdbarch to stap_get_arg. + (compute_probe_arg): Obtain gdbarch from frame. Pass frame to + get_probe_argument_count and evaluate_probe_argument. + 2013-12-10 Doug Evans <dje@google.com> PR 16286 diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index 76087d3..6a44be3 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -118,13 +118,13 @@ fetch_probe_arguments (struct value **arg0, struct value **arg1) && strcmp (pc_probe->name, "rethrow") != 0)) error (_("not stopped at a C++ exception catchpoint")); - n_args = get_probe_argument_count (pc_probe); + n_args = get_probe_argument_count (pc_probe, frame); if (n_args < 2) error (_("C++ exception catchpoint has too few arguments")); if (arg0 != NULL) - *arg0 = evaluate_probe_argument (pc_probe, 0); - *arg1 = evaluate_probe_argument (pc_probe, 1); + *arg0 = evaluate_probe_argument (pc_probe, 0, frame); + *arg1 = evaluate_probe_argument (pc_probe, 1, frame); if ((arg0 != NULL && *arg0 == NULL) || *arg1 == NULL) error (_("error computing probe argument at c++ exception catchpoint")); diff --git a/gdb/probe.c b/gdb/probe.c index c1e0111..8dad364 100644 --- a/gdb/probe.c +++ b/gdb/probe.c @@ -614,9 +614,9 @@ info_probes_command (char *arg, int from_tty) /* See comments in probe.h. */ unsigned -get_probe_argument_count (struct probe *probe) +get_probe_argument_count (struct probe *probe, struct frame_info *frame) { - return probe->pops->get_probe_argument_count (probe); + return probe->pops->get_probe_argument_count (probe, frame); } /* See comments in probe.h. */ @@ -630,9 +630,10 @@ can_evaluate_probe_arguments (struct probe *probe) /* See comments in probe.h. */ struct value * -evaluate_probe_argument (struct probe *probe, unsigned n) +evaluate_probe_argument (struct probe *probe, unsigned n, + struct frame_info *frame) { - return probe->pops->evaluate_probe_argument (probe, n); + return probe->pops->evaluate_probe_argument (probe, n, frame); } /* See comments in probe.h. */ @@ -647,11 +648,11 @@ probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n) if (!probe) return NULL; - n_args = get_probe_argument_count (probe); + n_args = get_probe_argument_count (probe, frame); if (n >= n_args) return NULL; - return evaluate_probe_argument (probe, n); + return evaluate_probe_argument (probe, n, frame); } /* See comment in probe.h. */ diff --git a/gdb/probe.h b/gdb/probe.h index dd5387b..daf2573 100644 --- a/gdb/probe.h +++ b/gdb/probe.h @@ -71,7 +71,8 @@ struct probe_ops /* Return the number of arguments of PROBE. */ - unsigned (*get_probe_argument_count) (struct probe *probe); + unsigned (*get_probe_argument_count) (struct probe *probe, + struct frame_info *frame); /* Return 1 if the probe interface can evaluate the arguments of probe PROBE, zero otherwise. See the comments on @@ -83,7 +84,8 @@ struct probe_ops corresponding to it. The argument number is represented N. */ struct value *(*evaluate_probe_argument) (struct probe *probe, - unsigned n); + unsigned n, + struct frame_info *frame); /* Compile the Nth argument of the PROBE to an agent expression. The argument number is represented by N. */ @@ -222,7 +224,8 @@ extern struct cmd_list_element **info_probes_cmdlist_get (void); /* Return the argument count of the specified probe. */ -extern unsigned get_probe_argument_count (struct probe *probe); +extern unsigned get_probe_argument_count (struct probe *probe, + struct frame_info *frame); /* Return 1 if the probe interface associated with PROBE can evaluate arguments, zero otherwise. See the comments on the definition of @@ -234,7 +237,8 @@ extern int can_evaluate_probe_arguments (struct probe *probe); inclusive and get_probe_argument_count exclusive. */ extern struct value *evaluate_probe_argument (struct probe *probe, - unsigned n); + unsigned n, + struct frame_info *frame); /* A convenience function that finds a probe at the PC in FRAME and evaluates argument N, with 0 <= N < number_of_args. If there is no diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 9538af6..22c2239 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1651,6 +1651,7 @@ solib_event_probe_action (struct probe_and_action *pa) { enum probe_action action; unsigned probe_argc; + struct frame_info *frame = get_current_frame (); action = pa->action; if (action == DO_NOTHING || action == PROBES_INTERFACE_FAILED) @@ -1663,7 +1664,7 @@ solib_event_probe_action (struct probe_and_action *pa) arg0: Lmid_t lmid (mandatory) arg1: struct r_debug *debug_base (mandatory) arg2: struct link_map *new (optional, for incremental updates) */ - probe_argc = get_probe_argument_count (pa->probe); + probe_argc = get_probe_argument_count (pa->probe, frame); if (probe_argc == 2) action = FULL_RELOAD; else if (probe_argc < 2) @@ -1772,6 +1773,7 @@ svr4_handle_solib_event (void) struct value *val; CORE_ADDR pc, debug_base, lm = 0; int is_initial_ns; + struct frame_info *frame = get_current_frame (); /* Do nothing if not using the probes interface. */ if (info->probes_table == NULL) @@ -1816,7 +1818,7 @@ svr4_handle_solib_event (void) usm_chain = make_cleanup (resume_section_map_updates_cleanup, current_program_space); - val = evaluate_probe_argument (pa->probe, 1); + val = evaluate_probe_argument (pa->probe, 1, frame); if (val == NULL) { do_cleanups (old_chain); @@ -1847,7 +1849,7 @@ svr4_handle_solib_event (void) if (action == UPDATE_OR_RELOAD) { - val = evaluate_probe_argument (pa->probe, 2); + val = evaluate_probe_argument (pa->probe, 2, frame); if (val != NULL) lm = value_as_address (val); diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c index e09d5d6..33d4569 100644 --- a/gdb/stap-probe.c +++ b/gdb/stap-probe.c @@ -914,10 +914,9 @@ stap_parse_argument (const char **arg, struct type *atype, this information. */ static void -stap_parse_probe_arguments (struct stap_probe *probe) +stap_parse_probe_arguments (struct stap_probe *probe, struct gdbarch *gdbarch) { const char *cur; - struct gdbarch *gdbarch = get_objfile_arch (probe->p.objfile); gdb_assert (!probe->args_parsed); cur = probe->args_u.text; @@ -1002,16 +1001,18 @@ stap_parse_probe_arguments (struct stap_probe *probe) argument string. */ static unsigned -stap_get_probe_argument_count (struct probe *probe_generic) +stap_get_probe_argument_count (struct probe *probe_generic, + struct frame_info *frame) { struct stap_probe *probe = (struct stap_probe *) probe_generic; + struct gdbarch *gdbarch = get_frame_arch (frame); gdb_assert (probe_generic->pops == &stap_probe_ops); if (!probe->args_parsed) { - if (probe_generic->pops->can_evaluate_probe_arguments (probe_generic)) - stap_parse_probe_arguments (probe); + if (can_evaluate_probe_arguments (probe_generic)) + stap_parse_probe_arguments (probe, gdbarch); else { static int have_warned_stap_incomplete = 0; @@ -1072,10 +1073,10 @@ stap_is_operator (const char *op) } static struct stap_probe_arg * -stap_get_arg (struct stap_probe *probe, unsigned n) +stap_get_arg (struct stap_probe *probe, unsigned n, struct gdbarch *gdbarch) { if (!probe->args_parsed) - stap_parse_probe_arguments (probe); + stap_parse_probe_arguments (probe, gdbarch); return VEC_index (stap_probe_arg_s, probe->args_u.vec, n); } @@ -1098,15 +1099,17 @@ stap_can_evaluate_probe_arguments (struct probe *probe_generic) corresponding to it. Assertion is thrown if N does not exist. */ static struct value * -stap_evaluate_probe_argument (struct probe *probe_generic, unsigned n) +stap_evaluate_probe_argument (struct probe *probe_generic, unsigned n, + struct frame_info *frame) { struct stap_probe *stap_probe = (struct stap_probe *) probe_generic; + struct gdbarch *gdbarch = get_frame_arch (frame); struct stap_probe_arg *arg; int pos = 0; gdb_assert (probe_generic->pops == &stap_probe_ops); - arg = stap_get_arg (stap_probe, n); + arg = stap_get_arg (stap_probe, n, gdbarch); return evaluate_subexp_standard (arg->atype, arg->aexpr, &pos, EVAL_NORMAL); } @@ -1123,7 +1126,7 @@ stap_compile_to_ax (struct probe *probe_generic, struct agent_expr *expr, gdb_assert (probe_generic->pops == &stap_probe_ops); - arg = stap_get_arg (stap_probe, n); + arg = stap_get_arg (stap_probe, n, expr->gdbarch); pc = arg->aexpr->elts; gen_expr (arg->aexpr, &pc, expr, value); @@ -1177,7 +1180,7 @@ compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar, if (pc_probe == NULL) error (_("No SystemTap probe at PC %s"), core_addr_to_string (pc)); - n_args = get_probe_argument_count (pc_probe); + n_args = get_probe_argument_count (pc_probe, frame); if (sel == -1) return value_from_longest (builtin_type (arch)->builtin_int, n_args); @@ -1185,7 +1188,7 @@ compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar, error (_("Invalid probe argument %d -- probe has %u arguments available"), sel, n_args); - return evaluate_probe_argument (pc_probe, sel); + return evaluate_probe_argument (pc_probe, sel, frame); } /* This is called to compile one of the $_probe_arg* convenience @@ -1200,6 +1203,7 @@ compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr, struct probe *pc_probe; const struct sym_probe_fns *pc_probe_fns; int n_args; + struct frame_info *frame = get_selected_frame (NULL); /* SEL == -1 means "_probe_argc". */ gdb_assert (sel >= -1); @@ -1208,7 +1212,7 @@ compile_probe_arg (struct internalvar *ivar, struct agent_expr *expr, if (pc_probe == NULL) error (_("No SystemTap probe at PC %s"), core_addr_to_string (pc)); - n_args = get_probe_argument_count (pc_probe); + n_args = get_probe_argument_count (pc_probe, frame); if (sel == -1) { |