| Index: gdb/breakpoint.h
|
| diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
|
| index 3548d13a675edd5e0d080c468213cf535dc07c7b..4e4f875d14c917bf3c971c87ea0ac9b41b00c31a 100644
|
| --- a/gdb/breakpoint.h
|
| +++ b/gdb/breakpoint.h
|
| @@ -22,6 +22,8 @@
|
| #include "frame.h"
|
| #include "value.h"
|
| #include "vec.h"
|
| +#include "ax.h"
|
| +#include "command.h"
|
|
|
| struct value;
|
| struct block;
|
| @@ -30,6 +32,8 @@ struct get_number_or_range_state;
|
| struct thread_info;
|
| struct bpstats;
|
| struct bp_location;
|
| +struct linespec_result;
|
| +struct linespec_sals;
|
|
|
| /* This is the maximum number of bytes a breakpoint instruction can
|
| take. Feel free to increase it. It's just used in a few places to
|
| @@ -61,6 +65,12 @@ enum bptype
|
| bp_longjmp, /* secret breakpoint to find longjmp() */
|
| bp_longjmp_resume, /* secret breakpoint to escape longjmp() */
|
|
|
| + /* Breakpoint placed to the same location(s) like bp_longjmp but used to
|
| + protect against stale DUMMY_FRAME. Multiple bp_longjmp_call_dummy and
|
| + one bp_call_dummy are chained together by related_breakpoint for each
|
| + DUMMY_FRAME. */
|
| + bp_longjmp_call_dummy,
|
| +
|
| /* An internal breakpoint that is installed on the unwinder's
|
| debug hook. */
|
| bp_exception,
|
| @@ -90,14 +100,8 @@ enum bptype
|
| 3) It can never be disabled. */
|
| bp_watchpoint_scope,
|
|
|
| - /* The breakpoint at the end of a call dummy. */
|
| - /* FIXME: What if the function we are calling longjmp()s out of
|
| - the call, or the user gets out with the "return" command? We
|
| - currently have no way of cleaning up the breakpoint in these
|
| - (obscure) situations. (Probably can solve this by noticing
|
| - longjmp, "return", etc., it's similar to noticing when a
|
| - watchpoint on a local variable goes out of scope (with hardware
|
| - support for watchpoints)). */
|
| + /* The breakpoint at the end of a call dummy. See bp_longjmp_call_dummy it
|
| + is chained with by related_breakpoint. */
|
| bp_call_dummy,
|
|
|
| /* A breakpoint set on std::terminate, that is used to catch
|
| @@ -151,6 +155,13 @@ enum bptype
|
| bp_fast_tracepoint,
|
| bp_static_tracepoint,
|
|
|
| + /* A dynamic printf stops at the given location, does a formatted
|
| + print, then automatically continues. (Although this is sort of
|
| + like a macro packaging up standard breakpoint functionality,
|
| + GDB doesn't have a way to construct types of breakpoint from
|
| + elements of behavior.) */
|
| + bp_dprintf,
|
| +
|
| /* Event for JIT compiled code generation or deletion. */
|
| bp_jit_event,
|
|
|
| @@ -213,6 +224,16 @@ enum target_hw_bp_type
|
| };
|
|
|
|
|
| +/* Status of breakpoint conditions used when synchronizing
|
| + conditions with the target. */
|
| +
|
| +enum condition_status
|
| + {
|
| + condition_unchanged = 0,
|
| + condition_modified,
|
| + condition_updated
|
| + };
|
| +
|
| /* Information used by targets to insert and remove breakpoints. */
|
|
|
| struct bp_target_info
|
| @@ -247,6 +268,18 @@ struct bp_target_info
|
| (e.g. if a remote stub handled the details). We may still need
|
| the size to remove the breakpoint safely. */
|
| int placed_size;
|
| +
|
| + /* Vector of conditions the target should evaluate if it supports target-side
|
| + breakpoint conditions. */
|
| + VEC(agent_expr_p) *conditions;
|
| +
|
| + /* Vector of commands the target should evaluate if it supports
|
| + target-side breakpoint commands. */
|
| + VEC(agent_expr_p) *tcommands;
|
| +
|
| + /* Flag that is true if the breakpoint should be left in place even
|
| + when GDB is not connected. */
|
| + int persist;
|
| };
|
|
|
| /* GDB maintains two types of information about each breakpoint (or
|
| @@ -313,6 +346,33 @@ struct bp_location
|
| the owner breakpoint object. */
|
| struct expression *cond;
|
|
|
| + /* Conditional expression in agent expression
|
| + bytecode form. This is used for stub-side breakpoint
|
| + condition evaluation. */
|
| + struct agent_expr *cond_bytecode;
|
| +
|
| + /* Signals that the condition has changed since the last time
|
| + we updated the global location list. This means the condition
|
| + needs to be sent to the target again. This is used together
|
| + with target-side breakpoint conditions.
|
| +
|
| + condition_unchanged: It means there has been no condition changes.
|
| +
|
| + condition_modified: It means this location had its condition modified.
|
| +
|
| + condition_updated: It means we already marked all the locations that are
|
| + duplicates of this location and thus we don't need to call
|
| + force_breakpoint_reinsertion (...) for this location. */
|
| +
|
| + enum condition_status condition_changed;
|
| +
|
| + struct agent_expr *cmd_bytecode;
|
| +
|
| + /* Signals that breakpoint conditions and/or commands need to be
|
| + re-synched with the target. This has no use other than
|
| + target-side breakpoints. */
|
| + char needs_update;
|
| +
|
| /* This location's address is in an unloaded solib, and so this
|
| location should not be inserted. It will be automatically
|
| enabled when that solib is loaded. */
|
| @@ -377,6 +437,15 @@ struct bp_location
|
| processor's architectual constraints. */
|
| CORE_ADDR requested_address;
|
|
|
| + /* An additional address assigned with this location. This is currently
|
| + only used by STT_GNU_IFUNC resolver breakpoints to hold the address
|
| + of the resolver function. */
|
| + CORE_ADDR related_address;
|
| +
|
| + /* If the location comes from a probe point, this is the probe associated
|
| + with it. */
|
| + struct probe *probe;
|
| +
|
| char *function_name;
|
|
|
| /* Details of the placed breakpoint, when inserted. */
|
| @@ -436,9 +505,14 @@ struct breakpoint_ops
|
|
|
| /* Return true if it the target has stopped due to hitting
|
| breakpoint location BL. This function does not check if we
|
| - should stop, only if BL explains the stop. */
|
| - int (*breakpoint_hit) (const struct bp_location *bl, struct address_space *,
|
| - CORE_ADDR);
|
| + should stop, only if BL explains the stop. ASPACE is the address
|
| + space in which the event occurred, BP_ADDR is the address at
|
| + which the inferior stopped, and WS is the target_waitstatus
|
| + describing the event. */
|
| + int (*breakpoint_hit) (const struct bp_location *bl,
|
| + struct address_space *aspace,
|
| + CORE_ADDR bp_addr,
|
| + const struct target_waitstatus *ws);
|
|
|
| /* Check internal conditions of the breakpoint referred to by BS.
|
| If we should not stop for this breakpoint, set BS->stop to 0. */
|
| @@ -482,6 +556,38 @@ struct breakpoint_ops
|
|
|
| /* Print to FP the CLI command that recreates this breakpoint. */
|
| void (*print_recreate) (struct breakpoint *, struct ui_file *fp);
|
| +
|
| + /* Create SALs from address string, storing the result in linespec_result.
|
| +
|
| + For an explanation about the arguments, see the function
|
| + `create_sals_from_address_default'.
|
| +
|
| + This function is called inside `create_breakpoint'. */
|
| + void (*create_sals_from_address) (char **, struct linespec_result *,
|
| + enum bptype, char *, char **);
|
| +
|
| + /* This method will be responsible for creating a breakpoint given its SALs.
|
| + Usually, it just calls `create_breakpoints_sal' (for ordinary
|
| + breakpoints). However, there may be some special cases where we might
|
| + need to do some tweaks, e.g., see
|
| + `strace_marker_create_breakpoints_sal'.
|
| +
|
| + This function is called inside `create_breakpoint'. */
|
| + void (*create_breakpoints_sal) (struct gdbarch *,
|
| + struct linespec_result *,
|
| + struct linespec_sals *, char *,
|
| + char *,
|
| + enum bptype, enum bpdisp, int, int,
|
| + int, const struct breakpoint_ops *,
|
| + int, int, int, unsigned);
|
| +
|
| + /* Given the address string (second parameter), this method decodes it
|
| + and provides the SAL locations related to it. For ordinary breakpoints,
|
| + it calls `decode_line_full'.
|
| +
|
| + This function is called inside `addr_string_to_sals'. */
|
| + void (*decode_linespec) (struct breakpoint *, char **,
|
| + struct symtabs_and_lines *);
|
| };
|
|
|
| /* Helper for breakpoint_ops->print_recreate implementations. Prints
|
| @@ -506,9 +612,6 @@ enum watchpoint_triggered
|
| watch_triggered_yes
|
| };
|
|
|
| -/* This is used to declare the VEC syscalls_to_be_caught. */
|
| -DEF_VEC_I(int);
|
| -
|
| typedef struct bp_location *bp_location_p;
|
| DEF_VEC_P(bp_location_p);
|
|
|
| @@ -558,6 +661,11 @@ struct breakpoint
|
| /* Number of stops at this breakpoint that should
|
| be continued automatically before really stopping. */
|
| int ignore_count;
|
| +
|
| + /* Number of stops at this breakpoint before it will be
|
| + disabled. */
|
| + int enable_count;
|
| +
|
| /* Chain of command lines to execute when this breakpoint is
|
| hit. */
|
| struct counted_command_line *commands;
|
| @@ -591,8 +699,9 @@ struct breakpoint
|
| /* String form of the breakpoint condition (malloc'd), or NULL if
|
| there is no condition. */
|
| char *cond_string;
|
| - /* String form of exp to use for displaying to the user
|
| - (malloc'd), or NULL if none. */
|
| +
|
| + /* String form of extra parameters, or NULL if there are none. */
|
| + char *extra_string;
|
|
|
| /* Holds the address of the related watchpoint_scope breakpoint
|
| when using watchpoints on local variables (might the concept of
|
| @@ -683,6 +792,11 @@ struct watchpoint
|
| CORE_ADDR hw_wp_mask;
|
| };
|
|
|
| +/* Return true if BPT is either a software breakpoint or a hardware
|
| + breakpoint. */
|
| +
|
| +extern int is_breakpoint (const struct breakpoint *bpt);
|
| +
|
| /* Returns true if BPT is really a watchpoint. */
|
|
|
| extern int is_watchpoint (const struct breakpoint *bpt);
|
| @@ -741,7 +855,8 @@ extern void bpstat_clear (bpstat *);
|
| extern bpstat bpstat_copy (bpstat);
|
|
|
| extern bpstat bpstat_stop_status (struct address_space *aspace,
|
| - CORE_ADDR pc, ptid_t ptid);
|
| + CORE_ADDR pc, ptid_t ptid,
|
| + const struct target_waitstatus *ws);
|
|
|
| /* This bpstat_what stuff tells wait_for_inferior what to do with a
|
| breakpoint (a challenging task).
|
| @@ -1046,6 +1161,10 @@ extern void delete_breakpoint (struct breakpoint *);
|
|
|
| extern void breakpoint_auto_delete (bpstat);
|
|
|
| +typedef void (*walk_bp_location_callback) (struct bp_location *, void *);
|
| +
|
| +extern void iterate_over_bp_locations (walk_bp_location_callback);
|
| +
|
| /* Return the chain of command lines to execute when this breakpoint
|
| is hit. */
|
| extern struct command_line *breakpoint_commands (struct breakpoint *b);
|
| @@ -1080,8 +1199,7 @@ extern void
|
| add_catch_command (char *name, char *docstring,
|
| void (*sfunc) (char *args, int from_tty,
|
| struct cmd_list_element *command),
|
| - char **(*completer) (struct cmd_list_element *cmd,
|
| - char *text, char *word),
|
| + completer_ftype *completer,
|
| void *user_data_catch,
|
| void *user_data_tcatch);
|
|
|
| @@ -1117,6 +1235,7 @@ enum breakpoint_create_flags
|
|
|
| extern int create_breakpoint (struct gdbarch *gdbarch, char *arg,
|
| char *cond_string, int thread,
|
| + char *extra_string,
|
| int parse_condition_and_thread,
|
| int tempflag, enum bptype wanted_type,
|
| int ignore_count,
|
| @@ -1176,6 +1295,12 @@ extern void set_longjmp_breakpoint (struct thread_info *tp,
|
| struct frame_id frame);
|
| extern void delete_longjmp_breakpoint (int thread);
|
|
|
| +/* Mark all longjmp breakpoints from THREAD for later deletion. */
|
| +extern void delete_longjmp_breakpoint_at_next_stop (int thread);
|
| +
|
| +extern struct breakpoint *set_longjmp_breakpoint_for_call_dummy (void);
|
| +extern void check_longjmp_breakpoint_for_call_dummy (int thread);
|
| +
|
| extern void enable_overlay_breakpoints (void);
|
| extern void disable_overlay_breakpoints (void);
|
|
|
| @@ -1277,7 +1402,7 @@ extern void remove_thread_event_breakpoints (void);
|
| extern void disable_breakpoints_in_shlibs (void);
|
|
|
| /* This function returns TRUE if ep is a catchpoint. */
|
| -extern int ep_is_catchpoint (struct breakpoint *);
|
| +extern int is_catchpoint (struct breakpoint *);
|
|
|
| /* Enable breakpoints and delete when hit. Called with ARG == NULL
|
| deletes all breakpoints. */
|
| @@ -1382,11 +1507,14 @@ extern struct breakpoint *iterate_over_breakpoints (int (*) (struct breakpoint *
|
| have been inlined. */
|
|
|
| extern int pc_at_non_inline_function (struct address_space *aspace,
|
| - CORE_ADDR pc);
|
| + CORE_ADDR pc,
|
| + const struct target_waitstatus *ws);
|
|
|
| extern int user_breakpoint_p (struct breakpoint *);
|
|
|
| /* Attempt to determine architecture of location identified by SAL. */
|
| extern struct gdbarch *get_sal_arch (struct symtab_and_line sal);
|
|
|
| +extern void handle_solib_event (void);
|
| +
|
| #endif /* !defined (BREAKPOINT_H) */
|
|
|