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:
parent
2060206eaf
commit
3a5c3e2258
5 changed files with 419 additions and 255 deletions
|
@ -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
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
437
gdb/breakpoint.c
437
gdb/breakpoint.c
File diff suppressed because it is too large
Load diff
104
gdb/breakpoint.h
104
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
|
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). */
|
/* 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;
|
int exact;
|
||||||
|
|
||||||
/* The mask address for a masked hardware watchpoint. */
|
/* The mask address for a masked hardware watchpoint. */
|
||||||
CORE_ADDR hw_wp_mask;
|
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,
|
||||||
|
|
|
@ -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 = "";
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue