summaryrefslogtreecommitdiff
path: root/gdb/breakpoint.h
diff options
context:
space:
mode:
authorPedro Alves <pedro@codesourcery.com>2011-07-25 11:23:02 +0000
committerPedro Alves <pedro@codesourcery.com>2011-07-25 11:23:02 +0000
commit52b95297981e1243abe1bcc1b32c3a480a1a7f5e (patch)
tree62f6af793dd905f1609162f9919b6abbe9368434 /gdb/breakpoint.h
parentf3f5948c78cb2115fe021593e6583b6d459c0e29 (diff)
downloadgdb-52b95297981e1243abe1bcc1b32c3a480a1a7f5e.tar.gz
2011-07-25 Pedro Alves <pedro@codesourcery.com>
gdb/ * breakpoint.h (struct breakpoint): Move ops as first field. Move exp_string, exp_string_reparse, exp, exp_valid_block, cond_exp, cond_exp_valid_block, val, val_valid, watchpoint_frame, watchpoint_thread, watchpoint_triggered ... (struct watchpoint): ... to this new struct. (is_watchpoint): Declare. (install_breakpoint): Add new `internal' parameter. * breakpoint.c (is_watchpoint): Delete declaration. (set_breakpoint_condition): Handle watchpoints. (is_watchpoint): Make public. (watchpoint_in_thread_scope): Change parameter type to struct watchpoint. (watchpoint_del_at_next_stop): Change parameter type to struct watchpoint. Remove assertion. Adjust. (update_watchpoint): Ditto. (insert_breakpoints, breakpoint_init_inferior) (watchpoints_triggered, watchpoint_check) (bpstat_check_watchpoint, bpstat_check_breakpoint_conditions) (bpstat_stop_status, print_one_breakpoint_location) (print_one_breakpoint_location, watchpoint_locations_match): Cast to struct watchpoint as necessary, and adjust. (install_breakpoint): Add `internal' argument. If true, don't mention the new breakpoint. Use set_breakpoint_number. (create_fork_vfork_event_catchpoint) (create_syscall_event_catchpoint): Adjust. (dtor_watchpoint): New. (re_set_watchpoint, insert_watchpoint, remove_watchpoint) (breakpoint_hit_watchpoint, resources_needed_watchpoint) (print_it_watchpoint, print_mention_watchpoint) (print_recreate_watchpoint, insert_masked_watchpoint) (remove_masked_watchpoint, resources_needed_masked_watchpoint) (print_one_detail_masked_watchpoint) (print_mention_masked_watchpoint) (print_recreate_masked_watchpoint): Cast to struct watchpoint as necessary, and adjust. (watch_command_1): Allocate and initialize a struct watchpoint instead of a struct breakpoint. Use install_breakpoint. (catch_exec_command_1): Adjust. (base_breakpoint_dtor): Delete accesses to watchpoint specific fields. (delete_breakpoint, enable_breakpoint_disp) (invalidate_bp_value_on_memory_change): Cast to struct watchpoint as necessary, and adjust. (initialize_breakpoint_ops): Install dtor_watchpoint as watchpoints' dtor method. * ada-lang.c (create_ada_exception_catchpoint): Adjust. * python/py-breakpoint.c (bppy_get_expression): Use is_watchpoint. to struct watchpoint as necessary, and adjust.
Diffstat (limited to 'gdb/breakpoint.h')
-rw-r--r--gdb/breakpoint.h112
1 files changed, 66 insertions, 46 deletions
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index ecd8007d56d..d3180607370 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -519,10 +519,13 @@ extern int target_exact_watchpoints;
useful for a hack I had to put in; I'm going to leave it in because
I can see how there might be times when it would indeed be useful */
-/* This is for a breakpoint or a watchpoint. */
+/* This is for all kinds of breakpoints. */
struct breakpoint
{
+ /* Methods associated with this breakpoint. */
+ struct breakpoint_ops *ops;
+
struct breakpoint *next;
/* Type of breakpoint. */
enum bptype type;
@@ -580,27 +583,6 @@ struct breakpoint
char *cond_string;
/* String form of exp to use for displaying to the user
(malloc'd), or NULL if none. */
- char *exp_string;
- /* String form to use for reparsing of EXP (malloc'd) or NULL. */
- char *exp_string_reparse;
-
- /* The expression we are watching, or NULL if not a watchpoint. */
- struct expression *exp;
- /* The largest block within which it is valid, or NULL if it is
- valid anywhere (e.g. consists just of global symbols). */
- struct block *exp_valid_block;
- /* The conditional expression if any. NULL if not a watchpoint. */
- struct expression *cond_exp;
- /* The largest block within which it is valid, or NULL if it is
- valid anywhere (e.g. consists just of global symbols). */
- struct block *cond_exp_valid_block;
- /* Value of the watchpoint the last time we checked it, or NULL
- when we do not know the value yet or the value was not
- readable. VAL is never lazy. */
- struct value *val;
- /* Nonzero if VAL is valid. If VAL_VALID is set but VAL is NULL,
- then an error occurred reading the value. */
- int val_valid;
/* Holds the address of the related watchpoint_scope breakpoint
when using watchpoints on local variables (might the concept of
@@ -609,20 +591,6 @@ struct breakpoint
FIXME). */
struct breakpoint *related_breakpoint;
- /* 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. */
- struct frame_id watchpoint_frame;
-
- /* Holds the thread which identifies the frame this watchpoint
- should be considered in scope for, or `null_ptid' if the
- watchpoint should be evaluated in all threads. */
- ptid_t watchpoint_thread;
-
- /* For hardware watchpoints, the triggered status according to the
- hardware. */
- enum watchpoint_triggered watchpoint_triggered;
-
/* Thread number for thread-specific breakpoint,
or -1 if don't care. */
int thread;
@@ -637,9 +605,6 @@ struct breakpoint
aborting, so you can back up to just before the abort. */
int hit_count;
- /* Methods associated with this breakpoint. */
- struct breakpoint_ops *ops;
-
/* Is breakpoint's condition not yet parsed because we found
no location initially so had no context to parse
the condition in. */
@@ -674,13 +639,66 @@ struct breakpoint
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;
+ };
- /* Whether this watchpoint is exact (see target_exact_watchpoints). */
- int exact;
+/* An instance of this type is used to represent a watchpoint. It
+ includes a "struct breakpoint" as a kind of base class; users
+ downcast to "struct breakpoint *" when needed. */
- /* The mask address for a masked hardware watchpoint. */
- CORE_ADDR hw_wp_mask;
- };
+struct watchpoint
+{
+ /* The base class. */
+ struct breakpoint base;
+
+ /* String form of exp to use for displaying to the user (malloc'd),
+ or NULL if none. */
+ char *exp_string;
+ /* String form to use for reparsing of EXP (malloc'd) or NULL. */
+ char *exp_string_reparse;
+
+ /* The expression we are watching, or NULL if not a watchpoint. */
+ struct expression *exp;
+ /* The largest block within which it is valid, or NULL if it is
+ valid anywhere (e.g. consists just of global symbols). */
+ struct block *exp_valid_block;
+ /* The conditional expression if any. */
+ struct expression *cond_exp;
+ /* The largest block within which it is valid, or NULL if it is
+ valid anywhere (e.g. consists just of global symbols). */
+ struct block *cond_exp_valid_block;
+ /* Value of the watchpoint the last time we checked it, or NULL when
+ we do not know the value yet or the value was not readable. VAL
+ is never lazy. */
+ struct value *val;
+ /* Nonzero if VAL is valid. If VAL_VALID is set but VAL is NULL,
+ then an error occurred reading the value. */
+ int val_valid;
+
+ /* 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. */
+ struct frame_id watchpoint_frame;
+
+ /* Holds the thread which identifies the frame this watchpoint
+ should be considered in scope for, or `null_ptid' if the
+ watchpoint should be evaluated in all threads. */
+ ptid_t watchpoint_thread;
+
+ /* For hardware watchpoints, the triggered status according to the
+ hardware. */
+ enum watchpoint_triggered watchpoint_triggered;
+
+ /* Whether this watchpoint is exact (see
+ target_exact_watchpoints). */
+ int exact;
+
+ /* The mask address for a masked hardware watchpoint. */
+ CORE_ADDR hw_wp_mask;
+};
+
+/* Returns true if BPT is really a watchpoint. */
+
+extern int is_watchpoint (const struct breakpoint *bpt);
typedef struct breakpoint *breakpoint_p;
DEF_VEC_P(breakpoint_p);
@@ -1062,9 +1080,11 @@ extern void
int from_tty);
/* Add breakpoint B on the breakpoint list, and notify the user, the
- target and breakpoint_created observers of its existence. */
+ target and breakpoint_created observers of its existence. If
+ INTERNAL is non-zero, the breakpoint number will be allocated from
+ the internal breakpoint count. */
-extern void install_breakpoint (struct breakpoint *b);
+extern void install_breakpoint (int internal, struct breakpoint *b);
extern int create_breakpoint (struct gdbarch *gdbarch, char *arg,
char *cond_string, int thread,