X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbreakpoint.h;h=9b79e3ec6738512b08dd6cecf85281d9ea925ca6;hb=c0a91b2b1432c7ecd7dfb558f9c37b6798b234d0;hp=ecd8007d56d272447ddab0a3493768502aa0d1b4;hpb=2060206eaf1f2784e57b350612dc6901504b526f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index ecd8007d56..9b79e3ec67 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -482,6 +482,15 @@ struct breakpoint_ops void (*print_recreate) (struct breakpoint *, struct ui_file *fp); }; +/* Helper for breakpoint_ops->print_recreate implementations. Prints + the "thread" or "task" condition of B, and then a newline. + + Necessary because most breakpoint implementations accept + thread/task conditions at the end of the spec line, like "break foo + thread 1", which needs outputting before any breakpoint-type + specific extra command necessary for B's recreation. */ +extern void print_recreate_thread (struct breakpoint *b, struct ui_file *fp); + enum watchpoint_triggered { /* This watchpoint definitely did not trigger. */ @@ -519,10 +528,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. */ + const struct breakpoint_ops *ops; + struct breakpoint *next; /* Type of breakpoint. */ enum bptype type; @@ -580,27 +592,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 +600,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,50 +614,109 @@ 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. */ int condition_not_parsed; - /* Number of times this tracepoint should single-step - and collect additional data. */ - long step_count; - - /* Number of times this tracepoint should be hit before - disabling/ending. */ - int pass_count; - - /* The number of the tracepoint on the target. */ - int number_on_target; - - /* The static tracepoint marker id, if known. */ - char *static_trace_marker_id; - - /* LTTng/UST allow more than one marker with the same ID string, - although it unadvised because it confuses tools. When setting - static tracepoints by marker ID, this will record the index in - the array of markers we found for the given marker ID for which - this static tracepoint corresponds. When resetting - breakpoints, we will use this index to try to find the same - marker again. */ - int static_trace_marker_id_idx; - /* With a Python scripting enabled GDB, store a reference to the Python object that has been associated with this breakpoint. This is always NULL for a GDB that is not script enabled. It 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); + +/* An instance of this type is used to represent all kinds of + tracepoints. It includes a "struct breakpoint" as a kind of base + class; users downcast to "struct breakpoint *" when needed. */ + +struct tracepoint +{ + /* The base class. */ + struct breakpoint base; + + /* Number of times this tracepoint should single-step and collect + additional data. */ + long step_count; + + /* Number of times this tracepoint should be hit before + disabling/ending. */ + int pass_count; + + /* The number of the tracepoint on the target. */ + int number_on_target; + + /* The static tracepoint marker id, if known. */ + char *static_trace_marker_id; + + /* LTTng/UST allow more than one marker with the same ID string, + although it unadvised because it confuses tools. When setting + static tracepoints by marker ID, this will record the index in + the array of markers we found for the given marker ID for which + this static tracepoint corresponds. When resetting breakpoints, + we will use this index to try to find the same marker again. */ + int static_trace_marker_id_idx; +}; typedef struct breakpoint *breakpoint_p; DEF_VEC_P(breakpoint_p); @@ -1057,14 +1093,16 @@ extern void struct gdbarch *gdbarch, struct symtab_and_line sal, char *addr_string, - struct breakpoint_ops *ops, + const struct breakpoint_ops *ops, int tempflag, 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, @@ -1072,7 +1110,7 @@ extern int create_breakpoint (struct gdbarch *gdbarch, char *arg, int tempflag, enum bptype wanted_type, int ignore_count, enum auto_boolean pending_break_support, - struct breakpoint_ops *ops, + const struct breakpoint_ops *ops, int from_tty, int enabled, int internal); @@ -1281,12 +1319,12 @@ extern int catch_syscall_enabled (void); extern int catching_syscall_number (int syscall_number); /* Return a tracepoint with the given number if found. */ -extern struct breakpoint *get_tracepoint (int num); +extern struct tracepoint *get_tracepoint (int num); -extern struct breakpoint *get_tracepoint_by_number_on_target (int num); +extern struct tracepoint *get_tracepoint_by_number_on_target (int num); /* Find a tracepoint by parsing a number in the supplied string. */ -extern struct breakpoint * +extern struct tracepoint * get_tracepoint_by_number (char **arg, struct get_number_or_range_state *state, int optional_p);