X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftarget.h;h=3c8c017489cefc893f3fd61b91ac0144959b67b5;hb=0cf6dd1543299e30c82397ef49d00b32af911a63;hp=d4bd00759b0fcdf65b2cf1b6084366139dfcc077;hpb=c2fb7f985330fd2666f36b960f33d181f6f5c9a4;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/target.h b/gdb/target.h index d4bd00759b..3c8c017489 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -35,6 +35,9 @@ struct trace_state_variable; struct trace_status; struct uploaded_tsv; struct uploaded_tp; +struct static_tracepoint_marker; + +struct expression; /* This include file defines the interface between the main part of the debugger, and the part which is target-specific, or @@ -261,6 +264,8 @@ enum target_object TARGET_OBJECT_SIGNAL_INFO, /* The list of threads that are being debugged. */ TARGET_OBJECT_THREADS, + /* Collected static trace data. */ + TARGET_OBJECT_STATIC_TRACE_DATA, /* Possible future objects: TARGET_OBJECT_FILE, ... */ }; @@ -276,6 +281,9 @@ enum trace_find_type tfind_outside, }; +typedef struct static_tracepoint_marker *static_tracepoint_marker_p; +DEF_VEC_P(static_tracepoint_marker_p); + /* Request that OPS transfer up to LEN 8-bit bytes of the target's OBJECT. The OFFSET, for a seekable object, specifies the starting point. The ANNEX can be used to provide additional @@ -420,8 +428,12 @@ struct target_ops int (*to_can_use_hw_breakpoint) (int, int, int); int (*to_insert_hw_breakpoint) (struct gdbarch *, struct bp_target_info *); int (*to_remove_hw_breakpoint) (struct gdbarch *, struct bp_target_info *); - int (*to_remove_watchpoint) (CORE_ADDR, int, int); - int (*to_insert_watchpoint) (CORE_ADDR, int, int); + + /* Documentation of what the two routines below are expected to do is + provided with the corresponding target_* macros. */ + int (*to_remove_watchpoint) (CORE_ADDR, int, int, struct expression *); + int (*to_insert_watchpoint) (CORE_ADDR, int, int, struct expression *); + int (*to_stopped_by_watchpoint) (void); int to_have_steppable_watchpoint; int to_have_continuable_watchpoint; @@ -429,6 +441,8 @@ struct target_ops int (*to_watchpoint_addr_within_range) (struct target_ops *, CORE_ADDR, CORE_ADDR, int); int (*to_region_ok_for_hw_watchpoint) (CORE_ADDR, int); + int (*to_can_accel_watchpoint_condition) (CORE_ADDR, int, int, + struct expression *); void (*to_terminal_init) (void); void (*to_terminal_inferior) (void); void (*to_terminal_ours_for_output) (void); @@ -686,6 +700,19 @@ struct target_ops a Windows OS specific feature. */ int (*to_get_tib_address) (ptid_t ptid, CORE_ADDR *addr); + /* Send the new settings of write permission variables. */ + void (*to_set_permissions) (void); + + /* Look for a static tracepoint marker at ADDR, and fill in MARKER + with its details. Return 1 on success, 0 on failure. */ + int (*to_static_tracepoint_marker_at) (CORE_ADDR, + struct static_tracepoint_marker *marker); + + /* Return a vector of all tracepoints markers string id ID, or all + markers if ID is NULL. */ + VEC(static_tracepoint_marker_p) *(*to_static_tracepoint_markers_by_strid) + (const char *id); + int to_magic; /* Need sub-structure for target machine related rather than comm related? */ @@ -889,14 +916,14 @@ extern int inferior_has_called_syscall (ptid_t pid, int *syscall_number); /* Insert a breakpoint at address BP_TGT->placed_address in the target machine. Result is 0 for success, or an errno value. */ -#define target_insert_breakpoint(gdbarch, bp_tgt) \ - (*current_target.to_insert_breakpoint) (gdbarch, bp_tgt) +extern int target_insert_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt); /* Remove a breakpoint at address BP_TGT->placed_address in the target machine. Result is 0 for success, or an errno value. */ -#define target_remove_breakpoint(gdbarch, bp_tgt) \ - (*current_target.to_remove_breakpoint) (gdbarch, bp_tgt) +extern int target_remove_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt); /* Initialize the terminal settings we record for the inferior, before we actually run the inferior. */ @@ -1091,7 +1118,7 @@ extern void target_find_new_threads (void); Unix, this should act like SIGSTOP). This function is normally used by GUIs to implement a stop button. */ -#define target_stop(ptid) (*current_target.to_stop) (ptid) +extern void target_stop (ptid_t ptid); /* Send the specified COMMAND to the target's monitor (shell,interpreter) for execution. The result of the query is @@ -1279,14 +1306,15 @@ extern char *normal_pid_to_str (ptid_t ptid); /* Set/clear a hardware watchpoint starting at ADDR, for LEN bytes. TYPE is 0 for write, 1 for read, and 2 for read/write accesses. + COND is the expression for its condition, or NULL if there's none. Returns 0 for success, 1 if the watchpoint type is not supported, -1 for failure. */ -#define target_insert_watchpoint(addr, len, type) \ - (*current_target.to_insert_watchpoint) (addr, len, type) +#define target_insert_watchpoint(addr, len, type, cond) \ + (*current_target.to_insert_watchpoint) (addr, len, type, cond) -#define target_remove_watchpoint(addr, len, type) \ - (*current_target.to_remove_watchpoint) (addr, len, type) +#define target_remove_watchpoint(addr, len, type, cond) \ + (*current_target.to_remove_watchpoint) (addr, len, type, cond) #define target_insert_hw_breakpoint(gdbarch, bp_tgt) \ (*current_target.to_insert_hw_breakpoint) (gdbarch, bp_tgt) @@ -1303,6 +1331,19 @@ extern char *normal_pid_to_str (ptid_t ptid); #define target_watchpoint_addr_within_range(target, addr, start, length) \ (*target.to_watchpoint_addr_within_range) (target, addr, start, length) +/* Return non-zero if the target is capable of using hardware to evaluate + the condition expression. In this case, if the condition is false when + the watched memory location changes, execution may continue without the + debugger being notified. + + Due to limitations in the hardware implementation, it may be capable of + avoiding triggering the watchpoint in some cases where the condition + expression is false, but may report some false positives as well. + For this reason, GDB will still evaluate the condition expression when + the watchpoint triggers. */ +#define target_can_accel_watchpoint_condition(addr, len, type, cond) \ + (*current_target.to_can_accel_watchpoint_condition) (addr, len, type, cond) + /* Target can execute in reverse? */ #define target_can_execute_reverse \ (current_target.to_can_execute_reverse ? \ @@ -1378,6 +1419,15 @@ extern int target_search_memory (CORE_ADDR start_addr, #define target_get_tib_address(ptid, addr) \ (*current_target.to_get_tib_address) ((ptid), (addr)) +#define target_set_permissions() \ + (*current_target.to_set_permissions) () + +#define target_static_tracepoint_marker_at(addr, marker) \ + (*current_target.to_static_tracepoint_marker_at) (addr, marker) + +#define target_static_tracepoint_markers_by_strid(marker_id) \ + (*current_target.to_static_tracepoint_markers_by_strid) (marker_id) + /* Command logging facility. */ #define target_log_command(p) \ @@ -1414,7 +1464,7 @@ int target_verify_memory (const gdb_byte *data, extern void add_target (struct target_ops *); -extern int push_target (struct target_ops *); +extern void push_target (struct target_ops *); extern int unpush_target (struct target_ops *); @@ -1540,6 +1590,15 @@ extern enum target_signal target_signal_from_command (int); to restore it back to the current value. */ extern struct cleanup *make_show_memory_breakpoints_cleanup (int show); +extern int may_write_registers; +extern int may_write_memory; +extern int may_insert_breakpoints; +extern int may_insert_tracepoints; +extern int may_insert_fast_tracepoints; +extern int may_stop; + +extern void update_target_permissions (void); + /* Imported from machine dependent code */