X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fbreakpoint.h;h=e0eeeaa950e4549f99610ab449ae7599df8a6ad8;hb=3d3e6bc3f438c51ff235d6a454ee1010246e814a;hp=d22e5646ff515d052dda5a115d40638e8456aa87;hpb=cc72b2a2da6d6372cbdb1d14639a5fce84e1a325;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index d22e5646ff..e0eeeaa950 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1,7 +1,5 @@ /* Data structures associated with breakpoints in GDB. - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1992-2004, 2007-2012 Free Software Foundation, Inc. This file is part of GDB. @@ -24,6 +22,7 @@ #include "frame.h" #include "value.h" #include "vec.h" +#include "ax.h" struct value; struct block; @@ -32,6 +31,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 @@ -215,6 +216,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 @@ -249,6 +260,10 @@ 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; }; /* GDB maintains two types of information about each breakpoint (or @@ -315,6 +330,30 @@ 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; + + /* Signals that breakpoint conditions 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. */ @@ -438,9 +477,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. */ @@ -484,6 +528,37 @@ 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 *, + 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 @@ -508,9 +583,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); @@ -560,6 +632,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; @@ -685,6 +762,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); @@ -743,7 +825,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). @@ -1107,6 +1190,16 @@ extern void extern void install_breakpoint (int internal, struct breakpoint *b, int update_gll); +/* Flags that can be passed down to create_breakpoint, etc., to affect + breakpoint creation in several ways. */ + +enum breakpoint_create_flags + { + /* We're adding a breakpoint to our tables that is already + inserted in the target. */ + CREATE_BREAKPOINT_FLAGS_INSERTED = 1 << 0 + }; + extern int create_breakpoint (struct gdbarch *gdbarch, char *arg, char *cond_string, int thread, int parse_condition_and_thread, @@ -1116,7 +1209,7 @@ extern int create_breakpoint (struct gdbarch *gdbarch, char *arg, const struct breakpoint_ops *ops, int from_tty, int enabled, - int internal); + int internal, unsigned flags); extern void insert_breakpoints (void); @@ -1168,6 +1261,9 @@ 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 void enable_overlay_breakpoints (void); extern void disable_overlay_breakpoints (void); @@ -1374,11 +1470,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) */