X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fbreakpoint.h;h=94d93852d3599558c5e3c86c2dcc7c5fff2ca1a2;hb=607685ecee1015d6c37e0d800d40453dc0aadc8c;hp=b4abcb864c5f83b0960d6b383f90e934c0d8b862;hpb=31e77af205cf6564c2bf4c18400b4ca16bdf92cd;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index b4abcb864c..94d93852d3 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1,5 +1,5 @@ /* Data structures associated with breakpoints in GDB. - Copyright (C) 1992-2014 Free Software Foundation, Inc. + Copyright (C) 1992-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -47,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 */ @@ -198,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. */ }; @@ -235,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; @@ -378,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 @@ -472,6 +471,26 @@ struct bp_location struct symtab *symtab; }; +/* 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 +}; + /* This structure is a collection of function pointers that, if available, will be called instead of the performing the default action for this bptype. */ @@ -779,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. */ @@ -801,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. */ @@ -962,26 +1000,6 @@ 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); @@ -1113,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); @@ -1126,15 +1149,26 @@ 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 @@ -1218,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); @@ -1326,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); @@ -1409,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); @@ -1424,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); @@ -1440,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 *); @@ -1473,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 @@ -1481,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.