diff options
author | Pedro Alves <palves@redhat.com> | 2011-07-25 11:23:03 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2011-07-25 11:23:03 +0000 |
commit | 3a5c3e2258c6ebafc2c53ee006c59314bb95de92 (patch) | |
tree | 8b72f3abe0084c33069e0b7fbf6f1fbd99060b9c /gdb/breakpoint.h | |
parent | 2060206eaf1f2784e57b350612dc6901504b526f (diff) | |
download | gdb-3a5c3e2258c6ebafc2c53ee006c59314bb95de92.zip gdb-3a5c3e2258c6ebafc2c53ee006c59314bb95de92.tar.gz gdb-3a5c3e2258c6ebafc2c53ee006c59314bb95de92.tar.bz2 |
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.h | 112 |
1 files changed, 66 insertions, 46 deletions
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index ecd8007..d318060 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, |