static void default_rcmd (struct target_ops *, char *, struct ui_file *);
+static ptid_t default_get_ada_task_ptid (struct target_ops *self,
+ long lwp, long tid);
+
+static int default_follow_fork (struct target_ops *self, int follow_child,
+ int detach_fork);
+
+static void default_mourn_inferior (struct target_ops *self);
+
static void tcomplain (void) ATTRIBUTE_NORETURN;
static int nomemory (CORE_ADDR, char *, int, int, struct target_ops *);
static int return_zero (void);
-static int return_minus_one (void);
-
-static void *return_null (void);
-
void target_ignore (void);
static void target_command (char *, int);
static struct gdbarch *default_thread_architecture (struct target_ops *ops,
ptid_t ptid);
+static int dummy_find_memory_regions (struct target_ops *self,
+ find_memory_region_ftype ignore1,
+ void *ignore2);
+
+static char *dummy_make_corefile_notes (struct target_ops *self,
+ bfd *ignore1, int *ignore2);
+
static int find_default_can_async_p (struct target_ops *ignore);
static int find_default_is_async_p (struct target_ops *ignore);
+static enum exec_direction_kind default_execution_direction
+ (struct target_ops *self);
+
#include "target-delegates.c"
static void init_dummy_target (void);
void
target_kill (void)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_kill != NULL)
- {
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "target_kill ()\n");
-
- t->to_kill (t);
- return;
- }
+ if (targetdebug)
+ fprintf_unfiltered (gdb_stdlog, "target_kill ()\n");
- noprocess ();
+ current_target.to_kill (¤t_target);
}
void
/* Do not inherit to_pid_to_str. */
/* Do not inherit to_extra_thread_info. */
/* Do not inherit to_thread_name. */
- INHERIT (to_stop, t);
+ /* Do not inherit to_stop. */
/* Do not inherit to_xfer_partial. */
/* Do not inherit to_rcmd. */
/* Do not inherit to_pid_to_exec_file. */
/* Do not inherit to_can_async_p. */
/* Do not inherit to_is_async_p. */
/* Do not inherit to_async. */
- INHERIT (to_find_memory_regions, t);
- INHERIT (to_make_corefile_notes, t);
- INHERIT (to_get_bookmark, t);
- INHERIT (to_goto_bookmark, t);
+ /* Do not inherit to_find_memory_regions. */
+ /* Do not inherit to_make_corefile_notes. */
+ /* Do not inherit to_get_bookmark. */
+ /* Do not inherit to_goto_bookmark. */
/* Do not inherit to_get_thread_local_address. */
- INHERIT (to_can_execute_reverse, t);
- INHERIT (to_execution_direction, t);
- INHERIT (to_thread_architecture, t);
+ /* Do not inherit to_can_execute_reverse. */
+ /* Do not inherit to_execution_direction. */
+ /* Do not inherit to_thread_architecture. */
/* Do not inherit to_read_description. */
- INHERIT (to_get_ada_task_ptid, t);
+ /* Do not inherit to_get_ada_task_ptid. */
/* Do not inherit to_search_memory. */
- INHERIT (to_supports_multi_process, t);
- INHERIT (to_supports_enable_disable_tracepoint, t);
- INHERIT (to_supports_string_tracing, t);
- INHERIT (to_trace_init, t);
- INHERIT (to_download_tracepoint, t);
- INHERIT (to_can_download_tracepoint, t);
- INHERIT (to_download_trace_state_variable, t);
- INHERIT (to_enable_tracepoint, t);
- INHERIT (to_disable_tracepoint, t);
- INHERIT (to_trace_set_readonly_regions, t);
- INHERIT (to_trace_start, t);
- INHERIT (to_get_trace_status, t);
- INHERIT (to_get_tracepoint_status, t);
- INHERIT (to_trace_stop, t);
- INHERIT (to_trace_find, t);
- INHERIT (to_get_trace_state_variable_value, t);
- INHERIT (to_save_trace_data, t);
- INHERIT (to_upload_tracepoints, t);
- INHERIT (to_upload_trace_state_variables, t);
- INHERIT (to_get_raw_trace_data, t);
- INHERIT (to_get_min_fast_tracepoint_insn_len, t);
- INHERIT (to_set_disconnected_tracing, t);
- INHERIT (to_set_circular_trace_buffer, t);
- INHERIT (to_set_trace_buffer_size, t);
- INHERIT (to_set_trace_notes, t);
- INHERIT (to_get_tib_address, t);
- INHERIT (to_set_permissions, t);
- INHERIT (to_static_tracepoint_marker_at, t);
- INHERIT (to_static_tracepoint_markers_by_strid, t);
- INHERIT (to_traceframe_info, t);
- INHERIT (to_use_agent, t);
- INHERIT (to_can_use_agent, t);
- INHERIT (to_augmented_libraries_svr4_read, t);
+ /* Do not inherit to_supports_multi_process. */
+ /* Do not inherit to_supports_enable_disable_tracepoint. */
+ /* Do not inherit to_supports_string_tracing. */
+ /* Do not inherit to_trace_init. */
+ /* Do not inherit to_download_tracepoint. */
+ /* Do not inherit to_can_download_tracepoint. */
+ /* Do not inherit to_download_trace_state_variable. */
+ /* Do not inherit to_enable_tracepoint. */
+ /* Do not inherit to_disable_tracepoint. */
+ /* Do not inherit to_trace_set_readonly_regions. */
+ /* Do not inherit to_trace_start. */
+ /* Do not inherit to_get_trace_status. */
+ /* Do not inherit to_get_tracepoint_status. */
+ /* Do not inherit to_trace_stop. */
+ /* Do not inherit to_trace_find. */
+ /* Do not inherit to_get_trace_state_variable_value. */
+ /* Do not inherit to_save_trace_data. */
+ /* Do not inherit to_upload_tracepoints. */
+ /* Do not inherit to_upload_trace_state_variables. */
+ /* Do not inherit to_get_raw_trace_data. */
+ /* Do not inherit to_get_min_fast_tracepoint_insn_len. */
+ /* Do not inherit to_set_disconnected_tracing. */
+ /* Do not inherit to_set_circular_trace_buffer. */
+ /* Do not inherit to_set_trace_buffer_size. */
+ /* Do not inherit to_set_trace_notes. */
+ /* Do not inherit to_get_tib_address. */
+ /* Do not inherit to_set_permissions. */
+ /* Do not inherit to_static_tracepoint_marker_at. */
+ /* Do not inherit to_static_tracepoint_markers_by_strid. */
+ /* Do not inherit to_traceframe_info. */
+ /* Do not inherit to_use_agent. */
+ /* Do not inherit to_can_use_agent. */
+ /* Do not inherit to_augmented_libraries_svr4_read. */
INHERIT (to_magic, t);
- INHERIT (to_supports_evaluation_of_breakpoint_conditions, t);
- INHERIT (to_can_run_breakpoint_commands, t);
+ /* Do not inherit
+ to_supports_evaluation_of_breakpoint_conditions. */
+ /* Do not inherit to_can_run_breakpoint_commands. */
/* Do not inherit to_memory_map. */
/* Do not inherit to_flash_erase. */
/* Do not inherit to_flash_done. */
de_fault (to_can_run,
(int (*) (struct target_ops *))
return_zero);
- de_fault (to_stop,
- (void (*) (struct target_ops *, ptid_t))
- target_ignore);
- de_fault (to_thread_architecture,
- default_thread_architecture);
current_target.to_read_description = NULL;
- de_fault (to_get_ada_task_ptid,
- (ptid_t (*) (struct target_ops *, long, long))
- default_get_ada_task_ptid);
- de_fault (to_supports_multi_process,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_supports_enable_disable_tracepoint,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_supports_string_tracing,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_trace_init,
- (void (*) (struct target_ops *))
- tcomplain);
- de_fault (to_download_tracepoint,
- (void (*) (struct target_ops *, struct bp_location *))
- tcomplain);
- de_fault (to_can_download_tracepoint,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_download_trace_state_variable,
- (void (*) (struct target_ops *, struct trace_state_variable *))
- tcomplain);
- de_fault (to_enable_tracepoint,
- (void (*) (struct target_ops *, struct bp_location *))
- tcomplain);
- de_fault (to_disable_tracepoint,
- (void (*) (struct target_ops *, struct bp_location *))
- tcomplain);
- de_fault (to_trace_set_readonly_regions,
- (void (*) (struct target_ops *))
- tcomplain);
- de_fault (to_trace_start,
- (void (*) (struct target_ops *))
- tcomplain);
- de_fault (to_get_trace_status,
- (int (*) (struct target_ops *, struct trace_status *))
- return_minus_one);
- de_fault (to_get_tracepoint_status,
- (void (*) (struct target_ops *, struct breakpoint *,
- struct uploaded_tp *))
- tcomplain);
- de_fault (to_trace_stop,
- (void (*) (struct target_ops *))
- tcomplain);
- de_fault (to_trace_find,
- (int (*) (struct target_ops *,
- enum trace_find_type, int, CORE_ADDR, CORE_ADDR, int *))
- return_minus_one);
- de_fault (to_get_trace_state_variable_value,
- (int (*) (struct target_ops *, int, LONGEST *))
- return_zero);
- de_fault (to_save_trace_data,
- (int (*) (struct target_ops *, const char *))
- tcomplain);
- de_fault (to_upload_tracepoints,
- (int (*) (struct target_ops *, struct uploaded_tp **))
- return_zero);
- de_fault (to_upload_trace_state_variables,
- (int (*) (struct target_ops *, struct uploaded_tsv **))
- return_zero);
- de_fault (to_get_raw_trace_data,
- (LONGEST (*) (struct target_ops *, gdb_byte *, ULONGEST, LONGEST))
- tcomplain);
- de_fault (to_get_min_fast_tracepoint_insn_len,
- (int (*) (struct target_ops *))
- return_minus_one);
- de_fault (to_set_disconnected_tracing,
- (void (*) (struct target_ops *, int))
- target_ignore);
- de_fault (to_set_circular_trace_buffer,
- (void (*) (struct target_ops *, int))
- target_ignore);
- de_fault (to_set_trace_buffer_size,
- (void (*) (struct target_ops *, LONGEST))
- target_ignore);
- de_fault (to_set_trace_notes,
- (int (*) (struct target_ops *,
- const char *, const char *, const char *))
- return_zero);
- de_fault (to_get_tib_address,
- (int (*) (struct target_ops *, ptid_t, CORE_ADDR *))
- tcomplain);
- de_fault (to_set_permissions,
- (void (*) (struct target_ops *))
- target_ignore);
- de_fault (to_static_tracepoint_marker_at,
- (int (*) (struct target_ops *,
- CORE_ADDR, struct static_tracepoint_marker *))
- return_zero);
- de_fault (to_static_tracepoint_markers_by_strid,
- (VEC(static_tracepoint_marker_p) * (*) (struct target_ops *,
- const char *))
- tcomplain);
- de_fault (to_traceframe_info,
- (struct traceframe_info * (*) (struct target_ops *))
- return_null);
- de_fault (to_supports_evaluation_of_breakpoint_conditions,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_can_run_breakpoint_commands,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_use_agent,
- (int (*) (struct target_ops *, int))
- tcomplain);
- de_fault (to_can_use_agent,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_augmented_libraries_svr4_read,
- (int (*) (struct target_ops *))
- return_zero);
- de_fault (to_execution_direction, default_execution_direction);
#undef de_fault
void
target_pass_signals (int numsigs, unsigned char *pass_signals)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
+ if (targetdebug)
{
- if (t->to_pass_signals != NULL)
- {
- if (targetdebug)
- {
- int i;
-
- fprintf_unfiltered (gdb_stdlog, "target_pass_signals (%d, {",
- numsigs);
+ int i;
- for (i = 0; i < numsigs; i++)
- if (pass_signals[i])
- fprintf_unfiltered (gdb_stdlog, " %s",
- gdb_signal_to_name (i));
+ fprintf_unfiltered (gdb_stdlog, "target_pass_signals (%d, {",
+ numsigs);
- fprintf_unfiltered (gdb_stdlog, " })\n");
- }
+ for (i = 0; i < numsigs; i++)
+ if (pass_signals[i])
+ fprintf_unfiltered (gdb_stdlog, " %s",
+ gdb_signal_to_name (i));
- (*t->to_pass_signals) (t, numsigs, pass_signals);
- return;
- }
+ fprintf_unfiltered (gdb_stdlog, " })\n");
}
+
+ (*current_target.to_pass_signals) (¤t_target, numsigs, pass_signals);
}
void
target_program_signals (int numsigs, unsigned char *program_signals)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
+ if (targetdebug)
{
- if (t->to_program_signals != NULL)
- {
- if (targetdebug)
- {
- int i;
-
- fprintf_unfiltered (gdb_stdlog, "target_program_signals (%d, {",
- numsigs);
+ int i;
- for (i = 0; i < numsigs; i++)
- if (program_signals[i])
- fprintf_unfiltered (gdb_stdlog, " %s",
- gdb_signal_to_name (i));
+ fprintf_unfiltered (gdb_stdlog, "target_program_signals (%d, {",
+ numsigs);
- fprintf_unfiltered (gdb_stdlog, " })\n");
- }
+ for (i = 0; i < numsigs; i++)
+ if (program_signals[i])
+ fprintf_unfiltered (gdb_stdlog, " %s",
+ gdb_signal_to_name (i));
- (*t->to_program_signals) (t, numsigs, program_signals);
- return;
- }
+ fprintf_unfiltered (gdb_stdlog, " })\n");
}
+
+ (*current_target.to_program_signals) (¤t_target,
+ numsigs, program_signals);
+}
+
+static int
+default_follow_fork (struct target_ops *self, int follow_child,
+ int detach_fork)
+{
+ /* Some target returned a fork event, but did not know how to follow it. */
+ internal_error (__FILE__, __LINE__,
+ _("could not find a target to follow fork"));
}
/* Look through the list of possible targets for a target that can
int
target_follow_fork (int follow_child, int detach_fork)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- {
- if (t->to_follow_fork != NULL)
- {
- int retval = t->to_follow_fork (t, follow_child, detach_fork);
+ int retval = current_target.to_follow_fork (¤t_target,
+ follow_child, detach_fork);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog,
- "target_follow_fork (%d, %d) = %d\n",
- follow_child, detach_fork, retval);
- return retval;
- }
- }
+ if (targetdebug)
+ fprintf_unfiltered (gdb_stdlog,
+ "target_follow_fork (%d, %d) = %d\n",
+ follow_child, detach_fork, retval);
+ return retval;
+}
- /* Some target returned a fork event, but did not know how to follow it. */
+static void
+default_mourn_inferior (struct target_ops *self)
+{
internal_error (__FILE__, __LINE__,
- _("could not find a target to follow fork"));
+ _("could not find a target to follow mourn inferior"));
}
void
target_mourn_inferior (void)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- {
- if (t->to_mourn_inferior != NULL)
- {
- t->to_mourn_inferior (t);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "target_mourn_inferior ()\n");
-
- /* We no longer need to keep handles on any of the object files.
- Make sure to release them to avoid unnecessarily locking any
- of them while we're not actually debugging. */
- bfd_cache_close_all ();
-
- return;
- }
- }
+ current_target.to_mourn_inferior (¤t_target);
+ if (targetdebug)
+ fprintf_unfiltered (gdb_stdlog, "target_mourn_inferior ()\n");
- internal_error (__FILE__, __LINE__,
- _("could not find a target to follow mourn inferior"));
+ /* We no longer need to keep handles on any of the object files.
+ Make sure to release them to avoid unnecessarily locking any
+ of them while we're not actually debugging. */
+ bfd_cache_close_all ();
}
/* Look for a target which can describe architectural features, starting
return 0;
}
-static int
-return_minus_one (void)
-{
- return -1;
-}
-
-static void *
-return_null (void)
-{
- return 0;
-}
-
/*
* Find the next target down the stack from the specified target.
*/
return NULL;
}
-/* Error-catcher for target_get_bookmark. */
-static gdb_byte *
-dummy_get_bookmark (struct target_ops *self, char *ignore1, int ignore2)
-{
- tcomplain ();
- return NULL;
-}
-
-/* Error-catcher for target_goto_bookmark. */
-static void
-dummy_goto_bookmark (struct target_ops *self, gdb_byte *ignore, int from_tty)
-{
- tcomplain ();
-}
-
/* Set up the handful of non-empty slots needed by the dummy target
vector. */
= find_default_supports_disable_randomization;
dummy_target.to_pid_to_str = dummy_pid_to_str;
dummy_target.to_stratum = dummy_stratum;
- dummy_target.to_find_memory_regions = dummy_find_memory_regions;
- dummy_target.to_make_corefile_notes = dummy_make_corefile_notes;
- dummy_target.to_get_bookmark = dummy_get_bookmark;
- dummy_target.to_goto_bookmark = dummy_goto_bookmark;
dummy_target.to_has_all_memory = (int (*) (struct target_ops *)) return_zero;
dummy_target.to_has_memory = (int (*) (struct target_ops *)) return_zero;
dummy_target.to_has_stack = (int (*) (struct target_ops *)) return_zero;
void
target_find_new_threads (void)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- {
- if (t->to_find_new_threads != NULL)
- {
- t->to_find_new_threads (t);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "target_find_new_threads ()\n");
-
- return;
- }
- }
+ current_target.to_find_new_threads (¤t_target);
+ if (targetdebug)
+ fprintf_unfiltered (gdb_stdlog, "target_find_new_threads ()\n");
}
void
void
target_fetch_registers (struct regcache *regcache, int regno)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- {
- if (t->to_fetch_registers != NULL)
- {
- t->to_fetch_registers (t, regcache, regno);
- if (targetdebug)
- debug_print_register ("target_fetch_registers", regcache, regno);
- return;
- }
- }
+ current_target.to_fetch_registers (¤t_target, regcache, regno);
+ if (targetdebug)
+ debug_print_register ("target_fetch_registers", regcache, regno);
}
void
int
target_insert_mask_watchpoint (CORE_ADDR addr, CORE_ADDR mask, int rw)
{
- struct target_ops *t;
+ int ret;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_insert_mask_watchpoint != NULL)
- {
- int ret;
-
- ret = t->to_insert_mask_watchpoint (t, addr, mask, rw);
+ ret = current_target.to_insert_mask_watchpoint (¤t_target,
+ addr, mask, rw);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "\
+ if (targetdebug)
+ fprintf_unfiltered (gdb_stdlog, "\
target_insert_mask_watchpoint (%s, %s, %d) = %d\n",
- core_addr_to_string (addr),
- core_addr_to_string (mask), rw, ret);
-
- return ret;
- }
-
- return 1;
+ core_addr_to_string (addr),
+ core_addr_to_string (mask), rw, ret);
+
+ return ret;
}
/* The documentation for this function is in its prototype declaration in
int
target_remove_mask_watchpoint (CORE_ADDR addr, CORE_ADDR mask, int rw)
{
- struct target_ops *t;
+ int ret;
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_remove_mask_watchpoint != NULL)
- {
- int ret;
-
- ret = t->to_remove_mask_watchpoint (t, addr, mask, rw);
+ ret = current_target.to_remove_mask_watchpoint (¤t_target,
+ addr, mask, rw);
- if (targetdebug)
- fprintf_unfiltered (gdb_stdlog, "\
+ if (targetdebug)
+ fprintf_unfiltered (gdb_stdlog, "\
target_remove_mask_watchpoint (%s, %s, %d) = %d\n",
- core_addr_to_string (addr),
- core_addr_to_string (mask), rw, ret);
-
- return ret;
- }
+ core_addr_to_string (addr),
+ core_addr_to_string (mask), rw, ret);
- return 1;
+ return ret;
}
/* The documentation for this function is in its prototype declaration
int
target_masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_masked_watch_num_registers != NULL)
- return t->to_masked_watch_num_registers (t, addr, mask);
-
- return -1;
+ return current_target.to_masked_watch_num_registers (¤t_target,
+ addr, mask);
}
/* The documentation for this function is in its prototype declaration
int
target_ranged_break_num_registers (void)
{
- struct target_ops *t;
-
- for (t = current_target.beneath; t != NULL; t = t->beneath)
- if (t->to_ranged_break_num_registers != NULL)
- return t->to_ranged_break_num_registers (t);
-
- return -1;
+ return current_target.to_ranged_break_num_registers (¤t_target);
}
/* See target.h. */