mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
Sanitize access to gdbarch on the SDT probe API (and fix ARM bug)
This patch sanitizes the access to gdbarch made by various functions of the SDT probe API. Before this patch, gdbarch was being accessed via the probe's objfile; however, this proved to cause a bug on 32-bit ARM targets because during the parsing of the probe's arguments the code needed to access some pseudo-registers of the architecture, and this information is not fully correct on the objfile's gdbarch. Basically, the approach taken was to instead pass the current/selected frame to the parsing and evaluation functions, so that they can extract the gdbarch directly from the frame. It solved the ARM bug reported above, and also contributed to make the API cleaner. Tested on x86_64 and 32-bit ARM. 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.
This commit is contained in:
12
gdb/probe.h
12
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
|
||||
|
Reference in New Issue
Block a user