X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Ftarget.c;h=18e53aa5d2768638513173243d62ec1ac459a5c8;hb=0d02e70b197c786f26175b9a73f94e01d14abdab;hp=b3b1bbd06b2484a9ab9ab810ea2b2e6cfdacbeb2;hpb=a03743453101edf0badda39f25d30736d184973b;p=binutils-gdb.git diff --git a/gdb/target.c b/gdb/target.c index b3b1bbd06b2..18e53aa5d27 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -26,6 +26,7 @@ #include "symtab.h" #include "inferior.h" #include "infrun.h" +#include "observable.h" #include "bfd.h" #include "symfile.h" #include "objfiles.h" @@ -158,7 +159,7 @@ static void show_targetdebug (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, _("Target debugging is %s.\n"), value); + gdb_printf (file, _("Target debugging is %s.\n"), value); } int @@ -422,7 +423,7 @@ target_extra_thread_info (thread_info *tp) /* See target.h. */ -char * +const char * target_pid_to_exec_file (int pid) { return current_inferior ()->top_target ()->pid_to_exec_file (pid); @@ -846,14 +847,14 @@ open_target (const char *args, int from_tty, struct cmd_list_element *command) target_open_ftype *func = target_factories[ti]; if (targetdebug) - fprintf_unfiltered (gdb_stdlog, "-> %s->open (...)\n", - ti->shortname); + gdb_printf (gdb_stdlog, "-> %s->open (...)\n", + ti->shortname); func (args, from_tty); if (targetdebug) - fprintf_unfiltered (gdb_stdlog, "<- %s->open (%s, %d)\n", - ti->shortname, args, from_tty); + gdb_printf (gdb_stdlog, "<- %s->open (%s, %d)\n", + ti->shortname, args, from_tty); } /* See target.h. */ @@ -1127,7 +1128,7 @@ noprocess (void) static void default_terminal_info (struct target_ops *self, const char *args, int from_tty) { - printf_unfiltered (_("No saved terminal information.\n")); + gdb_printf (_("No saved terminal information.\n")); } /* A default implementation for the to_get_ada_task_ptid target method. @@ -1239,9 +1240,9 @@ unpush_target_and_assert (struct target_ops *target) { if (!current_inferior ()->unpush_target (target)) { - fprintf_unfiltered (gdb_stderr, - "pop_all_targets couldn't find target %s\n", - target->shortname ()); + gdb_printf (gdb_stderr, + "pop_all_targets couldn't find target %s\n", + target->shortname ()); internal_error (__FILE__, __LINE__, _("failed internal consistency check")); } @@ -1295,6 +1296,11 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) struct target_ops *target = current_inferior ()->top_target (); struct gdbarch *gdbarch = target_gdbarch (); + /* If OBJFILE is a separate debug object file, look for the + original object file. */ + if (objfile->separate_debug_objfile_backlink != NULL) + objfile = objfile->separate_debug_objfile_backlink; + if (gdbarch_fetch_tls_load_module_address_p (gdbarch)) { ptid_t ptid = inferior_ptid; @@ -1388,26 +1394,6 @@ target_xfer_status_to_string (enum target_xfer_status status) }; -/* See target.h. */ - -gdb::unique_xmalloc_ptr -target_read_string (CORE_ADDR memaddr, int len, int *bytes_read) -{ - gdb::unique_xmalloc_ptr buffer; - - int ignore; - if (bytes_read == nullptr) - bytes_read = &ignore; - - /* Note that the endian-ness does not matter here. */ - int errcode = read_string (memaddr, -1, 1, len, BFD_ENDIAN_LITTLE, - &buffer, bytes_read); - if (errcode != 0) - return {}; - - return gdb::unique_xmalloc_ptr ((char *) buffer.release ()); -} - const target_section_table * target_get_section_table (struct target_ops *target) { @@ -1748,17 +1734,17 @@ target_xfer_partial (struct target_ops *ops, { const unsigned char *myaddr = NULL; - fprintf_unfiltered (gdb_stdlog, - "%s:target_xfer_partial " - "(%d, %s, %s, %s, %s, %s) = %d, %s", - ops->shortname (), - (int) object, - (annex ? annex : "(null)"), - host_address_to_string (readbuf), - host_address_to_string (writebuf), - core_addr_to_string_nz (offset), - pulongest (len), retval, - pulongest (*xfered_len)); + gdb_printf (gdb_stdlog, + "%s:target_xfer_partial " + "(%d, %s, %s, %s, %s, %s) = %d, %s", + ops->shortname (), + (int) object, + (annex ? annex : "(null)"), + host_address_to_string (readbuf), + host_address_to_string (writebuf), + core_addr_to_string_nz (offset), + pulongest (len), retval, + pulongest (*xfered_len)); if (readbuf) myaddr = readbuf; @@ -1768,24 +1754,24 @@ target_xfer_partial (struct target_ops *ops, { int i; - fputs_unfiltered (", bytes =", gdb_stdlog); + gdb_puts (", bytes =", gdb_stdlog); for (i = 0; i < *xfered_len; i++) { if ((((intptr_t) &(myaddr[i])) & 0xf) == 0) { if (targetdebug < 2 && i > 0) { - fprintf_unfiltered (gdb_stdlog, " ..."); + gdb_printf (gdb_stdlog, " ..."); break; } - fprintf_unfiltered (gdb_stdlog, "\n"); + gdb_printf (gdb_stdlog, "\n"); } - fprintf_unfiltered (gdb_stdlog, " %02x", myaddr[i] & 0xff); + gdb_printf (gdb_stdlog, " %02x", myaddr[i] & 0xff); } } - fputc_unfiltered ('\n', gdb_stdlog); + gdb_putc ('\n', gdb_stdlog); } /* Check implementations of to_xfer_partial update *XFERED_LEN @@ -1961,9 +1947,9 @@ static void show_trust_readonly (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, - _("Mode for reading from readonly sections is %s.\n"), - value); + gdb_printf (file, + _("Mode for reading from readonly sections is %s.\n"), + value); } /* Target vector read/write partial wrapper functions. */ @@ -2444,8 +2430,8 @@ info_target_command (const char *args, int from_tty) if (current_program_space->symfile_object_file != NULL) { objfile *objf = current_program_space->symfile_object_file; - printf_filtered (_("Symbols from \"%s\".\n"), - objfile_name (objf)); + gdb_printf (_("Symbols from \"%s\".\n"), + objfile_name (objf)); } for (target_ops *t = current_inferior ()->top_target (); @@ -2458,9 +2444,9 @@ info_target_command (const char *args, int from_tty) if ((int) (t->stratum ()) <= (int) dummy_stratum) continue; if (has_all_mem) - printf_filtered (_("\tWhile running this, " - "GDB does not access memory from...\n")); - printf_filtered ("%s:\n", t->longname ()); + gdb_printf (_("\tWhile running this, " + "GDB does not access memory from...\n")); + gdb_printf ("%s:\n", t->longname ()); t->files_info (); has_all_mem = t->has_all_memory (); } @@ -2609,7 +2595,18 @@ target_wait (ptid_t ptid, struct target_waitstatus *status, if (!target_can_async_p (target)) gdb_assert ((options & TARGET_WNOHANG) == 0); - return target->wait (ptid, status, options); + try + { + gdb::observers::target_pre_wait.notify (ptid); + ptid_t event_ptid = target->wait (ptid, status, options); + gdb::observers::target_post_wait.notify (event_ptid); + return event_ptid; + } + catch (...) + { + gdb::observers::target_post_wait.notify (null_ptid); + throw; + } } /* See target.h. */ @@ -2658,21 +2655,27 @@ target_thread_info_to_thread_handle (struct thread_info *tip) } void -target_resume (ptid_t ptid, int step, enum gdb_signal signal) +target_resume (ptid_t scope_ptid, int step, enum gdb_signal signal) { process_stratum_target *curr_target = current_inferior ()->process_target (); gdb_assert (!curr_target->commit_resumed_state); + gdb_assert (inferior_ptid != null_ptid); + gdb_assert (inferior_ptid.matches (scope_ptid)); + target_dcache_invalidate (); - current_inferior ()->top_target ()->resume (ptid, step, signal); + current_inferior ()->top_target ()->resume (scope_ptid, step, signal); - registers_changed_ptid (curr_target, ptid); + registers_changed_ptid (curr_target, scope_ptid); /* We only set the internal executing state here. The user/frontend running state is set at a higher level. This also clears the thread's stop_pc as side effect. */ - set_executing (curr_target, ptid, true); - clear_inline_frame_state (curr_target, ptid); + set_executing (curr_target, scope_ptid, true); + clear_inline_frame_state (curr_target, scope_ptid); + + if (target_can_async_p ()) + target_async (1); } /* See target.h. */ @@ -2857,10 +2860,10 @@ static void show_auto_connect_native_target (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (file, - _("Whether GDB may automatically connect to the " - "native target is %s.\n"), - value); + gdb_printf (file, + _("Whether GDB may automatically connect to the " + "native target is %s.\n"), + value); } /* A pointer to the target that can respond to "run" or "attach". @@ -2968,8 +2971,8 @@ target_info_proc (const char *args, enum info_proc_what what) if (t->info_proc (args, what)) { if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_info_proc (\"%s\", %d)\n", args, what); + gdb_printf (gdb_stdlog, + "target_info_proc (\"%s\", %d)\n", args, what); return 1; } @@ -3275,13 +3278,13 @@ target_fileio_open (struct inferior *inf, const char *filename, fd = acquire_fileio_fd (t, fd); if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_fileio_open (%d,%s,0x%x,0%o,%d)" - " = %d (%d)\n", - inf == NULL ? 0 : inf->num, - filename, flags, mode, - warn_if_slow, fd, - fd != -1 ? 0 : *target_errno); + gdb_printf (gdb_stdlog, + "target_fileio_open (%d,%s,0x%x,0%o,%d)" + " = %d (%d)\n", + inf == NULL ? 0 : inf->num, + filename, flags, mode, + warn_if_slow, fd, + fd != -1 ? 0 : *target_errno); return fd; } @@ -3307,11 +3310,11 @@ target_fileio_pwrite (int fd, const gdb_byte *write_buf, int len, len, offset, target_errno); if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_fileio_pwrite (%d,...,%d,%s) " - "= %d (%d)\n", - fd, len, pulongest (offset), - ret, ret != -1 ? 0 : *target_errno); + gdb_printf (gdb_stdlog, + "target_fileio_pwrite (%d,...,%d,%s) " + "= %d (%d)\n", + fd, len, pulongest (offset), + ret, ret != -1 ? 0 : *target_errno); return ret; } @@ -3333,11 +3336,11 @@ target_fileio_pread (int fd, gdb_byte *read_buf, int len, len, offset, target_errno); if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_fileio_pread (%d,...,%d,%s) " - "= %d (%d)\n", - fd, len, pulongest (offset), - ret, ret != -1 ? 0 : *target_errno); + gdb_printf (gdb_stdlog, + "target_fileio_pread (%d,...,%d,%s) " + "= %d (%d)\n", + fd, len, pulongest (offset), + ret, ret != -1 ? 0 : *target_errno); return ret; } @@ -3357,9 +3360,9 @@ target_fileio_fstat (int fd, struct stat *sb, int *target_errno) ret = fh->target->fileio_fstat (fh->target_fd, sb, target_errno); if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_fileio_fstat (%d) = %d (%d)\n", - fd, ret, ret != -1 ? 0 : *target_errno); + gdb_printf (gdb_stdlog, + "target_fileio_fstat (%d) = %d (%d)\n", + fd, ret, ret != -1 ? 0 : *target_errno); return ret; } @@ -3384,9 +3387,9 @@ target_fileio_close (int fd, int *target_errno) } if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_fileio_close (%d) = %d (%d)\n", - fd, ret, ret != -1 ? 0 : *target_errno); + gdb_printf (gdb_stdlog, + "target_fileio_close (%d) = %d (%d)\n", + fd, ret, ret != -1 ? 0 : *target_errno); return ret; } @@ -3404,11 +3407,11 @@ target_fileio_unlink (struct inferior *inf, const char *filename, continue; if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_fileio_unlink (%d,%s)" - " = %d (%d)\n", - inf == NULL ? 0 : inf->num, filename, - ret, ret != -1 ? 0 : *target_errno); + gdb_printf (gdb_stdlog, + "target_fileio_unlink (%d,%s)" + " = %d (%d)\n", + inf == NULL ? 0 : inf->num, filename, + ret, ret != -1 ? 0 : *target_errno); return ret; } @@ -3431,12 +3434,12 @@ target_fileio_readlink (struct inferior *inf, const char *filename, continue; if (targetdebug) - fprintf_unfiltered (gdb_stdlog, - "target_fileio_readlink (%d,%s)" - " = %s (%d)\n", - inf == NULL ? 0 : inf->num, - filename, ret ? ret->c_str () : "(nil)", - ret ? 0 : *target_errno); + gdb_printf (gdb_stdlog, + "target_fileio_readlink (%d,%s)" + " = %s (%d)\n", + inf == NULL ? 0 : inf->num, + filename, ret ? ret->c_str () : "(nil)", + ret ? 0 : *target_errno); return ret; } @@ -3628,13 +3631,32 @@ target_announce_detach (int from_tty) if (!from_tty) return; + pid = inferior_ptid.pid (); exec_file = get_exec_file (0); - if (exec_file == NULL) - exec_file = ""; + if (exec_file == nullptr) + gdb_printf ("Detaching from pid %s\n", + target_pid_to_str (ptid_t (pid)).c_str ()); + else + gdb_printf (_("Detaching from program: %s, %s\n"), exec_file, + target_pid_to_str (ptid_t (pid)).c_str ()); +} - pid = inferior_ptid.pid (); - printf_unfiltered (_("Detaching from program: %s, %s\n"), exec_file, - target_pid_to_str (ptid_t (pid)).c_str ()); +/* See target.h */ + +void +target_announce_attach (int from_tty, int pid) +{ + if (!from_tty) + return; + + const char *exec_file = get_exec_file (0); + + if (exec_file != nullptr) + gdb_printf ("Attaching to program: %s, %s\n", exec_file, + target_pid_to_str (ptid_t (pid)).c_str ()); + else + gdb_printf ("Attaching to %s\n", + target_pid_to_str (ptid_t (pid)).c_str ()); } /* The inferior process has died. Long live the inferior! */ @@ -3759,7 +3781,7 @@ target_close (struct target_ops *targ) targ->close (); if (targetdebug) - fprintf_unfiltered (gdb_stdlog, "target_close ()\n"); + gdb_printf (gdb_stdlog, "target_close ()\n"); } int @@ -4041,9 +4063,9 @@ target_ranged_break_num_registers (void) /* See target.h. */ struct btrace_target_info * -target_enable_btrace (ptid_t ptid, const struct btrace_config *conf) +target_enable_btrace (thread_info *tp, const struct btrace_config *conf) { - return current_inferior ()->top_target ()->enable_btrace (ptid, conf); + return current_inferior ()->top_target ()->enable_btrace (tp, conf); } /* See target.h. */ @@ -4315,7 +4337,7 @@ flash_erase_command (const char *cmd, int from_tty) static void maintenance_print_target_stack (const char *cmd, int from_tty) { - printf_filtered (_("The current target stack is:\n")); + gdb_printf (_("The current target stack is:\n")); for (target_ops *t = current_inferior ()->top_target (); t != NULL; @@ -4323,7 +4345,7 @@ maintenance_print_target_stack (const char *cmd, int from_tty) { if (t->stratum () == debug_stratum) continue; - printf_filtered (" - %s (%s)\n", t->shortname (), t->longname ()); + gdb_printf (" - %s (%s)\n", t->shortname (), t->longname ()); } } @@ -4351,31 +4373,28 @@ target_thread_events (int enable) just for maintainers to use when debugging gdb. */ bool target_async_permitted = true; -/* The set command writes to this variable. If the inferior is - executing, target_async_permitted is *not* updated. */ -static bool target_async_permitted_1 = true; - static void -maint_set_target_async_command (const char *args, int from_tty, - struct cmd_list_element *c) +set_maint_target_async (bool permitted) { if (have_live_inferiors ()) - { - target_async_permitted_1 = target_async_permitted; - error (_("Cannot change this setting while the inferior is running.")); - } + error (_("Cannot change this setting while the inferior is running.")); + + target_async_permitted = permitted; +} - target_async_permitted = target_async_permitted_1; +static bool +get_maint_target_async () +{ + return target_async_permitted; } static void -maint_show_target_async_command (struct ui_file *file, int from_tty, - struct cmd_list_element *c, - const char *value) +show_maint_target_async (ui_file *file, int from_tty, + cmd_list_element *c, const char *value) { - fprintf_filtered (file, - _("Controlling the inferior in " - "asynchronous mode is %s.\n"), value); + gdb_printf (file, + _("Controlling the inferior in " + "asynchronous mode is %s.\n"), value); } /* Return true if the target operates in non-stop mode even with "set @@ -4423,41 +4442,38 @@ exists_non_stop_target () mode. This is just for maintainers to use when debugging gdb. */ enum auto_boolean target_non_stop_enabled = AUTO_BOOLEAN_AUTO; -/* The set command writes to this variable. If the inferior is - executing, target_non_stop_enabled is *not* updated. */ -static enum auto_boolean target_non_stop_enabled_1 = AUTO_BOOLEAN_AUTO; - -/* Implementation of "maint set target-non-stop". */ +/* Set callback for maint target-non-stop setting. */ static void -maint_set_target_non_stop_command (const char *args, int from_tty, - struct cmd_list_element *c) +set_maint_target_non_stop (auto_boolean enabled) { if (have_live_inferiors ()) - { - target_non_stop_enabled_1 = target_non_stop_enabled; - error (_("Cannot change this setting while the inferior is running.")); - } + error (_("Cannot change this setting while the inferior is running.")); - target_non_stop_enabled = target_non_stop_enabled_1; + target_non_stop_enabled = enabled; } -/* Implementation of "maint show target-non-stop". */ +/* Get callback for maint target-non-stop setting. */ + +static auto_boolean +get_maint_target_non_stop () +{ + return target_non_stop_enabled; +} static void -maint_show_target_non_stop_command (struct ui_file *file, int from_tty, - struct cmd_list_element *c, - const char *value) +show_maint_target_non_stop (ui_file *file, int from_tty, + cmd_list_element *c, const char *value) { if (target_non_stop_enabled == AUTO_BOOLEAN_AUTO) - fprintf_filtered (file, - _("Whether the target is always in non-stop mode " - "is %s (currently %s).\n"), value, - target_always_non_stop_p () ? "on" : "off"); + gdb_printf (file, + _("Whether the target is always in non-stop mode " + "is %s (currently %s).\n"), value, + target_always_non_stop_p () ? "on" : "off"); else - fprintf_filtered (file, - _("Whether the target is always in non-stop mode " - "is %s.\n"), value); + gdb_printf (file, + _("Whether the target is always in non-stop mode " + "is %s.\n"), value); } /* Temporary copies of permission settings. */ @@ -4553,22 +4569,24 @@ result in significant performance improvement for remote targets."), &maintenanceprintlist); add_setshow_boolean_cmd ("target-async", no_class, - &target_async_permitted_1, _("\ + _("\ Set whether gdb controls the inferior in asynchronous mode."), _("\ Show whether gdb controls the inferior in asynchronous mode."), _("\ Tells gdb whether to control the inferior in asynchronous mode."), - maint_set_target_async_command, - maint_show_target_async_command, + set_maint_target_async, + get_maint_target_async, + show_maint_target_async, &maintenance_set_cmdlist, &maintenance_show_cmdlist); add_setshow_auto_boolean_cmd ("target-non-stop", no_class, - &target_non_stop_enabled_1, _("\ + _("\ Set whether gdb always controls the inferior in non-stop mode."), _("\ Show whether gdb always controls the inferior in non-stop mode."), _("\ Tells gdb whether to control the inferior in non-stop mode."), - maint_set_target_non_stop_command, - maint_show_target_non_stop_command, + set_maint_target_non_stop, + get_maint_target_non_stop, + show_maint_target_non_stop, &maintenance_set_cmdlist, &maintenance_show_cmdlist);