X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fbreakpoint.h;h=94d93852d3599558c5e3c86c2dcc7c5fff2ca1a2;hb=607685ecee1015d6c37e0d800d40453dc0aadc8c;hp=4a25fb7b80d8ced0ba3c862967e79e736d745244;hpb=349774efe258cff6b365b72df07f6ce2eb76cbd6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 4a25fb7b80..94d93852d3 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1,5 +1,5 @@ /* Data structures associated with breakpoints in GDB. - Copyright (C) 1992-2013 Free Software Foundation, Inc. + Copyright (C) 1992-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -25,10 +25,12 @@ #include "ax.h" #include "command.h" #include "break-common.h" +#include "probe.h" struct value; struct block; -struct breakpoint_object; +struct gdbpy_breakpoint_object; +struct gdbscm_breakpoint_object; struct get_number_or_range_state; struct thread_info; struct bpstats; @@ -45,18 +47,13 @@ struct linespec_sals; /* Type of breakpoint. */ -/* FIXME In the future, we should fold all other breakpoint-like - things into here. This includes: - - * single-step (for machines where we have to simulate single - stepping) (probably, though perhaps it is better for it to look as - much as possible like a single-step to wait_for_inferior). */ enum bptype { bp_none = 0, /* Eventpoint has been deleted */ bp_breakpoint, /* Normal breakpoint */ bp_hardware_breakpoint, /* Hardware assisted breakpoint */ + bp_single_step, /* Software single-step */ bp_until, /* used by until command */ bp_finish, /* used by finish command */ bp_watchpoint, /* Watchpoint */ @@ -196,12 +193,6 @@ enum enable_state automatically enabled and reset when the call "lands" (either completes, or stops at another eventpoint). */ - bp_permanent /* There is a breakpoint instruction - hard-wired into the target's code. Don't - try to write another breakpoint - instruction on top of it, or restore its - value. Step over it using the - architecture's SKIP_INSN macro. */ }; @@ -233,13 +224,16 @@ struct bp_target_info /* Address space at which the breakpoint was placed. */ struct address_space *placed_address_space; - /* Address at which the breakpoint was placed. This is normally the - same as ADDRESS from the bp_location, except when adjustment - happens in gdbarch_breakpoint_from_pc. The most common form of - adjustment is stripping an alternate ISA marker from the PC which - is used to determine the type of breakpoint to insert. */ + /* Address at which the breakpoint was placed. This is normally + the same as REQUESTED_ADDRESS, except when adjustment happens in + gdbarch_breakpoint_from_pc. The most common form of adjustment + is stripping an alternate ISA marker from the PC which is used + to determine the type of breakpoint to insert. */ CORE_ADDR placed_address; + /* Address at which the breakpoint was requested. */ + CORE_ADDR reqstd_address; + /* If this is a ranged breakpoint, then this field contains the length of the range that will be watched for execution. */ int length; @@ -376,6 +370,13 @@ struct bp_location /* Nonzero if this breakpoint is now inserted. */ char inserted; + /* Nonzero if this is a permanent breakpoint. There is a breakpoint + instruction hard-wired into the target's code. Don't try to + write another breakpoint instruction on top of it, or restore its + value. Step over it using the architecture's + gdbarch_skip_permanent_breakpoint method. */ + char permanent; + /* Nonzero if this is not the first breakpoint in the list for the given address. location of tracepoint can _never_ be duplicated with other locations of tracepoints and other @@ -436,7 +437,7 @@ struct bp_location /* If the location comes from a probe point, this is the probe associated with it. */ - struct probe *probe; + struct bound_probe probe; char *function_name; @@ -470,21 +471,25 @@ struct bp_location struct symtab *symtab; }; -/* Return values for bpstat_explains_signal. Note that the order of - the constants is important here; they are compared directly in - bpstat_explains_signal. */ +/* The possible return values for print_bpstat, print_it_normal, + print_it_done, print_it_noop. */ +enum print_stop_action +{ + /* We printed nothing or we need to do some more analysis. */ + PRINT_UNKNOWN = -1, -enum bpstat_signal_value - { - /* bpstat does not explain this signal. */ - BPSTAT_SIGNAL_NO = 0, + /* We printed something, and we *do* desire that something to be + followed by a location. */ + PRINT_SRC_AND_LOC, - /* bpstat explains this signal; signal should not be delivered. */ - BPSTAT_SIGNAL_HIDE, + /* We printed something, and we do *not* desire that something to be + followed by a location. */ + PRINT_SRC_ONLY, - /* bpstat explains this signal; signal should be delivered. */ - BPSTAT_SIGNAL_PASS - }; + /* We already printed all we needed to print, don't print anything + else. */ + PRINT_NOTHING +}; /* This structure is a collection of function pointers that, if available, will be called instead of the performing the default action for this @@ -600,12 +605,9 @@ struct breakpoint_ops void (*decode_linespec) (struct breakpoint *, char **, struct symtabs_and_lines *); - /* Return true if this breakpoint explains a signal, but the signal - should still be delivered to the inferior. This is used to make - 'catch signal' interact properly with 'handle'; see + /* Return true if this breakpoint explains a signal. See bpstat_explains_signal. */ - enum bpstat_signal_value (*explains_signal) (struct breakpoint *, - enum gdb_signal); + int (*explains_signal) (struct breakpoint *, enum gdb_signal); /* Called after evaluating the breakpoint's condition, and only if it evaluated true. */ @@ -756,8 +758,11 @@ struct breakpoint Python object that has been associated with this breakpoint. This is always NULL for a GDB that is not script enabled. It can sometimes be NULL for enabled GDBs as not all breakpoint - types are tracked by the Python scripting API. */ - struct breakpoint_object *py_bp_object; + types are tracked by the scripting language API. */ + struct gdbpy_breakpoint_object *py_bp_object; + + /* Same as py_bp_object, but for Scheme. */ + struct gdbscm_breakpoint_object *scm_bp_object; }; /* An instance of this type is used to represent a watchpoint. It @@ -793,6 +798,11 @@ struct watchpoint then an error occurred reading the value. */ int val_valid; + /* When watching the location of a bitfield, contains the offset and size of + the bitfield. Otherwise contains 0. */ + int val_bitpos; + int val_bitsize; + /* Holds the frame address which identifies the frame this watchpoint should be evaluated in, or `null' if the watchpoint should be evaluated on the outermost frame. */ @@ -815,6 +825,20 @@ struct watchpoint CORE_ADDR hw_wp_mask; }; +/* Given a function FUNC (struct breakpoint *B, void *DATA) and + USER_DATA, call FUNC for every known breakpoint passing USER_DATA + as argument. + + If FUNC returns 1, the loop stops and the current + 'struct breakpoint' being processed is returned. If FUNC returns + zero, the loop continues. + + This function returns either a 'struct breakpoint' pointer or NULL. + It was based on BFD's bfd_sections_find_if function. */ + +extern struct breakpoint *breakpoint_find_if + (int (*func) (struct breakpoint *b, void *d), void *user_data); + /* Return true if BPT is either a software breakpoint or a hardware breakpoint. */ @@ -976,37 +1000,16 @@ struct bpstat_what int is_longjmp; }; -/* The possible return values for print_bpstat, print_it_normal, - print_it_done, print_it_noop. */ -enum print_stop_action - { - /* We printed nothing or we need to do some more analysis. */ - PRINT_UNKNOWN = -1, - - /* We printed something, and we *do* desire that something to be - followed by a location. */ - PRINT_SRC_AND_LOC, - - /* We printed something, and we do *not* desire that something to - be followed by a location. */ - PRINT_SRC_ONLY, - - /* We already printed all we needed to print, don't print anything - else. */ - PRINT_NOTHING - }; - /* Tell what to do about this bpstat. */ struct bpstat_what bpstat_what (bpstat); /* Find the bpstat associated with a breakpoint. NULL otherwise. */ bpstat bpstat_find_breakpoint (bpstat, struct breakpoint *); -/* Nonzero if a signal that we got in wait() was due to circumstances - explained by the bpstat; and the signal should therefore not be - delivered. */ -extern enum bpstat_signal_value bpstat_explains_signal (bpstat, - enum gdb_signal); +/* Nonzero if a signal that we got in target_wait() was due to + circumstances explained by the bpstat; the signal is therefore not + random. */ +extern int bpstat_explains_signal (bpstat, enum gdb_signal); /* Nonzero is this bpstat causes a stop. */ extern int bpstat_causes_stop (bpstat); @@ -1128,6 +1131,11 @@ enum breakpoint_here /* Prototypes for breakpoint-related functions. */ +/* Return 1 if there's a program/permanent breakpoint planted in + memory at ADDRESS, return 0 otherwise. */ + +extern int program_breakpoint_here_p (struct gdbarch *gdbarch, CORE_ADDR address); + extern enum breakpoint_here breakpoint_here_p (struct address_space *, CORE_ADDR); @@ -1141,14 +1149,35 @@ extern int regular_breakpoint_inserted_here_p (struct address_space *, extern int software_breakpoint_inserted_here_p (struct address_space *, CORE_ADDR); +/* Return non-zero iff there is a hardware breakpoint inserted at + PC. */ +extern int hardware_breakpoint_inserted_here_p (struct address_space *, + CORE_ADDR); + +/* Check whether any location of BP is inserted at PC. */ + +extern int breakpoint_has_location_inserted_here (struct breakpoint *bp, + struct address_space *aspace, + CORE_ADDR pc); + +extern int single_step_breakpoint_inserted_here_p (struct address_space *, + CORE_ADDR); + /* Returns true if there's a hardware watchpoint or access watchpoint inserted in the range defined by ADDR and LEN. */ extern int hardware_watchpoint_inserted_in_range (struct address_space *, CORE_ADDR addr, ULONGEST len); -extern int breakpoint_thread_match (struct address_space *, - CORE_ADDR, ptid_t); +/* Returns true if {ASPACE1,ADDR1} and {ASPACE2,ADDR2} represent the + same breakpoint location. In most targets, this can only be true + if ASPACE1 matches ASPACE2. On targets that have global + breakpoints, the address space doesn't really matter. */ + +extern int breakpoint_address_match (struct address_space *aspace1, + CORE_ADDR addr1, + struct address_space *aspace2, + CORE_ADDR addr2); extern void until_break_command (char *, int, int); @@ -1223,8 +1252,7 @@ extern void initialize_breakpoint_ops (void); extern void add_catch_command (char *name, char *docstring, - void (*sfunc) (char *args, int from_tty, - struct cmd_list_element *command), + cmd_sfunc_ftype *sfunc, completer_ftype *completer, void *user_data_catch, void *user_data_tcatch); @@ -1331,7 +1359,7 @@ extern void delete_longjmp_breakpoint (int thread); 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 check_longjmp_breakpoint_for_call_dummy (struct thread_info *tp); extern void enable_overlay_breakpoints (void); extern void disable_overlay_breakpoints (void); @@ -1414,14 +1442,19 @@ extern void breakpoint_set_task (struct breakpoint *b, int task); /* Clear the "inserted" flag in all breakpoints. */ extern void mark_breakpoints_out (void); -extern void make_breakpoint_permanent (struct breakpoint *); - extern struct breakpoint *create_jit_event_breakpoint (struct gdbarch *, CORE_ADDR); extern struct breakpoint *create_solib_event_breakpoint (struct gdbarch *, CORE_ADDR); +/* Create an solib event breakpoint at ADDRESS in the current program + space, and immediately try to insert it. Returns a pointer to the + breakpoint on success. Deletes the new breakpoint and returns NULL + if inserting the breakpoint fails. */ +extern struct breakpoint *create_and_insert_solib_event_breakpoint + (struct gdbarch *gdbarch, CORE_ADDR address); + extern struct breakpoint *create_thread_event_breakpoint (struct gdbarch *, CORE_ADDR); @@ -1429,6 +1462,10 @@ extern void remove_jit_event_breakpoints (void); extern void remove_solib_event_breakpoints (void); +/* Mark solib event breakpoints of the current program space with + delete at next stop disposition. */ +extern void remove_solib_event_breakpoints_at_next_stop (void); + extern void remove_thread_event_breakpoints (void); extern void disable_breakpoints_in_shlibs (void); @@ -1445,23 +1482,13 @@ extern void add_solib_catchpoint (char *arg, int is_load, int is_temp, deletes all breakpoints. */ extern void delete_command (char *arg, int from_tty); -/* Manage a software single step breakpoint (or two). Insert may be - called twice before remove is called. */ +/* Create and insert a new software single step breakpoint for the + current thread. May be called multiple times; each time will add a + new location to the set of potential addresses the next instruction + is at. */ extern void insert_single_step_breakpoint (struct gdbarch *, struct address_space *, CORE_ADDR); -extern int single_step_breakpoints_inserted (void); -extern void remove_single_step_breakpoints (void); -extern void cancel_single_step_breakpoints (void); - -/* Manage manual breakpoints, separate from the normal chain of - breakpoints. These functions are used in murky target-specific - ways. Please do not add more uses! */ -extern void *deprecated_insert_raw_breakpoint (struct gdbarch *, - struct address_space *, - CORE_ADDR); -extern int deprecated_remove_raw_breakpoint (struct gdbarch *, void *); - /* Check if any hardware watchpoints have triggered, according to the target. */ int watchpoints_triggered (struct target_waitstatus *); @@ -1478,7 +1505,17 @@ extern void breakpoint_xfer_memory (gdb_byte *readbuf, gdb_byte *writebuf, const gdb_byte *writebuf_org, ULONGEST memaddr, LONGEST len); -extern int breakpoints_always_inserted_mode (void); +/* Return true if breakpoints should be inserted now. That'll be the + case if either: + + - the target has global breakpoints. + + - "breakpoint always-inserted" is on, and the target has + execution. + + - threads are executing. +*/ +extern int breakpoints_should_be_inserted_now (void); /* Called each time new event from target is processed. Retires previously deleted breakpoint locations that @@ -1486,7 +1523,7 @@ extern int breakpoints_always_inserted_mode (void); extern void breakpoint_retire_moribund (void); /* Set break condition of breakpoint B to EXP. */ -extern void set_breakpoint_condition (struct breakpoint *b, char *exp, +extern void set_breakpoint_condition (struct breakpoint *b, const char *exp, int from_tty); /* Checks if we are catching syscalls or not. @@ -1506,8 +1543,7 @@ extern struct tracepoint *get_tracepoint_by_number_on_target (int num); /* Find a tracepoint by parsing a number in the supplied string. */ extern struct tracepoint * get_tracepoint_by_number (char **arg, - struct get_number_or_range_state *state, - int optional_p); + struct get_number_or_range_state *state); /* Return a vector of all tracepoints currently defined. The vector is newly allocated; the caller should free when done with it. */