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.
This commit is contained in:
Pedro Alves 2011-07-25 11:23:03 +00:00
parent 2060206eaf
commit 3a5c3e2258
5 changed files with 419 additions and 255 deletions

View file

@ -1,3 +1,54 @@
2011-07-25 Pedro Alves <pedro@codesourcery.com>
* 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.
2011-07-25 Pedro Alves <pedro@codesourcery.com> 2011-07-25 Pedro Alves <pedro@codesourcery.com>
* ada-lang.c (dtor_exception, re_set_exception): Indirect through * ada-lang.c (dtor_exception, re_set_exception): Indirect through

View file

@ -11701,7 +11701,7 @@ create_ada_exception_catchpoint (struct gdbarch *gdbarch,
ops, tempflag, from_tty); ops, tempflag, from_tty);
c->excep_string = excep_string; c->excep_string = excep_string;
create_excep_cond_exprs (c); create_excep_cond_exprs (c);
install_breakpoint (&c->base); install_breakpoint (0, &c->base);
} }
/* Implement the "catch exception" command. */ /* Implement the "catch exception" command. */

File diff suppressed because it is too large Load diff

View file

@ -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 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 */ 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 struct breakpoint
{ {
/* Methods associated with this breakpoint. */
struct breakpoint_ops *ops;
struct breakpoint *next; struct breakpoint *next;
/* Type of breakpoint. */ /* Type of breakpoint. */
enum bptype type; enum bptype type;
@ -580,27 +583,6 @@ struct breakpoint
char *cond_string; char *cond_string;
/* String form of exp to use for displaying to the user /* String form of exp to use for displaying to the user
(malloc'd), or NULL if none. */ (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 /* Holds the address of the related watchpoint_scope breakpoint
when using watchpoints on local variables (might the concept of when using watchpoints on local variables (might the concept of
@ -609,20 +591,6 @@ struct breakpoint
FIXME). */ FIXME). */
struct breakpoint *related_breakpoint; 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, /* Thread number for thread-specific breakpoint,
or -1 if don't care. */ or -1 if don't care. */
int thread; int thread;
@ -637,9 +605,6 @@ struct breakpoint
aborting, so you can back up to just before the abort. */ aborting, so you can back up to just before the abort. */
int hit_count; int hit_count;
/* Methods associated with this breakpoint. */
struct breakpoint_ops *ops;
/* Is breakpoint's condition not yet parsed because we found /* Is breakpoint's condition not yet parsed because we found
no location initially so had no context to parse no location initially so had no context to parse
the condition in. */ the condition in. */
@ -674,14 +639,67 @@ struct breakpoint
can sometimes be NULL for enabled GDBs as not all breakpoint can sometimes be NULL for enabled GDBs as not all breakpoint
types are tracked by the Python scripting API. */ types are tracked by the Python scripting API. */
struct breakpoint_object *py_bp_object; struct breakpoint_object *py_bp_object;
/* Whether this watchpoint is exact (see target_exact_watchpoints). */
int exact;
/* The mask address for a masked hardware watchpoint. */
CORE_ADDR hw_wp_mask;
}; };
/* 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. */
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; typedef struct breakpoint *breakpoint_p;
DEF_VEC_P(breakpoint_p); DEF_VEC_P(breakpoint_p);
@ -1062,9 +1080,11 @@ extern void
int from_tty); int from_tty);
/* Add breakpoint B on the breakpoint list, and notify the user, the /* 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, extern int create_breakpoint (struct gdbarch *gdbarch, char *arg,
char *cond_string, int thread, char *cond_string, int thread,

View file

@ -399,16 +399,16 @@ bppy_get_expression (PyObject *self, void *closure)
{ {
char *str; char *str;
breakpoint_object *obj = (breakpoint_object *) self; breakpoint_object *obj = (breakpoint_object *) self;
struct watchpoint *wp;
BPPY_REQUIRE_VALID (obj); BPPY_REQUIRE_VALID (obj);
if (obj->bp->type != bp_watchpoint if (!is_watchpoint (obj->bp))
&& obj->bp->type != bp_hardware_watchpoint
&& obj->bp->type != bp_read_watchpoint
&& obj->bp->type != bp_access_watchpoint)
Py_RETURN_NONE; Py_RETURN_NONE;
str = obj->bp->exp_string; wp = (struct watchpoint *) obj->bp;
str = wp->exp_string;
if (! str) if (! str)
str = ""; str = "";