X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Finfcmd.c;h=2bf21e26f1924e0af1b3c94ff88e677a3be80909;hb=f4ec508eaed65ad7555858498c1cbbf420bce90a;hp=178f89e95207f9da1ec229f7f1974305e329face;hpb=e242fd1249ae85a97f08f95d5c61f4cbe3b906e0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 178f89e952..2bf21e26f1 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1,6 +1,6 @@ /* Memory-access and commands for "inferior" process, for GDB. - Copyright (C) 1986-2019 Free Software Foundation, Inc. + Copyright (C) 1986-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -19,13 +19,12 @@ #include "defs.h" #include "arch-utils.h" -#include #include "symtab.h" #include "gdbtypes.h" #include "frame.h" #include "inferior.h" #include "infrun.h" -#include "common/environ.h" +#include "gdbsupport/environ.h" #include "value.h" #include "gdbcmd.h" #include "symfile.h" @@ -35,8 +34,6 @@ #include "objfiles.h" #include "completer.h" #include "ui-out.h" -#include "event-top.h" -#include "parser-defs.h" #include "regcache.h" #include "reggroups.h" #include "block.h" @@ -45,7 +42,6 @@ #include "observable.h" #include "target-descriptions.h" #include "user-regs.h" -#include "cli/cli-decode.h" #include "gdbthread.h" #include "valprint.h" #include "inline-frame.h" @@ -53,13 +49,13 @@ #include "inf-loop.h" #include "continuations.h" #include "linespec.h" -#include "cli/cli-utils.h" -#include "infcall.h" #include "thread-fsm.h" #include "top.h" #include "interps.h" -#include "common/gdb_optional.h" +#include "skip.h" +#include "gdbsupport/gdb_optional.h" #include "source.h" +#include "cli/cli-style.h" /* Local functions: */ @@ -103,10 +99,6 @@ enum stop_stack_kind stop_stack_dummy; int stopped_by_random_signal; -/* See inferior.h. */ - -int startup_with_shell = 1; - /* Accessor routines. */ @@ -213,7 +205,7 @@ show_args_command (struct ui_file *file, int from_tty, deprecated_show_value_hack (file, from_tty, c, get_inferior_args ()); } -/* See common/common-inferior.h. */ +/* See gdbsupport/common-inferior.h. */ void set_inferior_cwd (const char *cwd) @@ -228,7 +220,7 @@ set_inferior_cwd (const char *cwd) inf->cwd.reset (xstrdup (cwd)); } -/* See common/common-inferior.h. */ +/* See gdbsupport/common-inferior.h. */ const char * get_inferior_cwd () @@ -421,7 +413,7 @@ strip_bg_char (const char *args, int *bg_char_p) } *bg_char_p = 0; - return gdb::unique_xmalloc_ptr (xstrdup (args)); + return make_unique_xstrdup (args); } /* Common actions to take after creating any sort of inferior, by any @@ -653,10 +645,19 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how) events --- the frontend shouldn't see them as stopped. In all-stop, always finish the state of all threads, as we may be resuming more than just the new process. */ - ptid_t finish_ptid = (non_stop - ? ptid_t (current_inferior ()->pid) - : minus_one_ptid); - scoped_finish_thread_state finish_state (finish_ptid); + process_stratum_target *finish_target; + ptid_t finish_ptid; + if (non_stop) + { + finish_target = current_inferior ()->process_target (); + finish_ptid = ptid_t (current_inferior ()->pid); + } + else + { + finish_target = nullptr; + finish_ptid = minus_one_ptid; + } + scoped_finish_thread_state finish_state (finish_target, finish_ptid); /* Pass zero for FROM_TTY, because at this point the "run" command has done its thing; now we are setting up the running program. */ @@ -726,6 +727,9 @@ proceed_thread_callback (struct thread_info *thread, void *arg) if (thread->state != THREAD_STOPPED) return 0; + if (!thread->inf->has_execution ()) + return 0; + switch_to_thread (thread); clear_proceed_status (0); proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT); @@ -819,7 +823,7 @@ static void continue_command (const char *args, int from_tty) { int async_exec; - int all_threads = 0; + bool all_threads_p = false; ERROR_NO_INFERIOR; @@ -831,17 +835,17 @@ continue_command (const char *args, int from_tty) { if (startswith (args, "-a")) { - all_threads = 1; + all_threads_p = true; args += sizeof ("-a") - 1; if (*args == '\0') args = NULL; } } - if (!non_stop && all_threads) + if (!non_stop && all_threads_p) error (_("`-a' is meaningless in all-stop mode.")); - if (args != NULL && all_threads) + if (args != NULL && all_threads_p) error (_("Can't resume all threads and specify " "proceed count simultaneously.")); @@ -858,11 +862,11 @@ continue_command (const char *args, int from_tty) tp = inferior_thread (); else { + process_stratum_target *last_target; ptid_t last_ptid; - struct target_waitstatus ws; - get_last_target_status (&last_ptid, &ws); - tp = find_thread_ptid (last_ptid); + get_last_target_status (&last_target, &last_ptid, nullptr); + tp = find_thread_ptid (last_target, last_ptid); } if (tp != NULL) bs = tp->control.stop_bpstat; @@ -890,7 +894,7 @@ continue_command (const char *args, int from_tty) ERROR_NO_INFERIOR; ensure_not_tfind_mode (); - if (!non_stop || !all_threads) + if (!non_stop || !all_threads_p) { ensure_valid_thread (); ensure_not_running (); @@ -901,7 +905,7 @@ continue_command (const char *args, int from_tty) if (from_tty) printf_filtered (_("Continuing.\n")); - continue_1 (all_threads); + continue_1 (all_threads_p); } /* Record the starting point of a "step" or "next" command. */ @@ -1115,14 +1119,29 @@ prepare_one_step (struct step_command_fsm *sm) && inline_skipped_frames (tp)) { ptid_t resume_ptid; + const char *fn = NULL; + symtab_and_line sal; + struct symbol *sym; /* Pretend that we've ran. */ resume_ptid = user_visible_resume_ptid (1); - set_running (resume_ptid, 1); + set_running (tp->inf->process_target (), resume_ptid, true); step_into_inline_frame (tp); - sm->count--; - return prepare_one_step (sm); + + frame = get_current_frame (); + sal = find_frame_sal (frame); + sym = get_frame_function (frame); + + if (sym != NULL) + fn = sym->print_name (); + + if (sal.line == 0 + || !function_name_is_marked_for_skip (fn, sal)) + { + sm->count--; + return prepare_one_step (sm); + } } pc = get_frame_pc (frame); @@ -1219,7 +1238,7 @@ jump_command (const char *arg, int from_tty) if (fn != NULL && sfn != fn) { if (!query (_("Line %d is not in `%s'. Jump anyway? "), sal.line, - SYMBOL_PRINT_NAME (fn))) + fn->print_name ())) { error (_("Not confirmed.")); /* NOTREACHED */ @@ -1310,10 +1329,14 @@ signal_command (const char *signum_exp, int from_tty) /* This indicates what will be resumed. Either a single thread, a whole process, or all threads of all processes. */ ptid_t resume_ptid = user_visible_resume_ptid (0); + process_stratum_target *resume_target + = user_visible_resume_target (resume_ptid); + + thread_info *current = inferior_thread (); - for (thread_info *tp : all_non_exited_threads (resume_ptid)) + for (thread_info *tp : all_non_exited_threads (resume_target, resume_ptid)) { - if (tp->ptid == inferior_ptid) + if (tp == current) continue; if (tp->suspend.stop_signal != GDB_SIGNAL_0 @@ -1621,10 +1644,15 @@ print_return_value_1 (struct ui_out *uiout, struct return_value_info *rv) uiout->text (" = "); get_user_print_options (&opts); - string_file stb; - - value_print (rv->value, &stb, &opts); - uiout->field_stream ("return-value", stb); + if (opts.finish_print) + { + string_file stb; + value_print (rv->value, &stb, &opts); + uiout->field_stream ("return-value", stb); + } + else + uiout->field_string ("return-value", _(""), + metadata_style.style ()); uiout->text ("\n"); } else @@ -1943,7 +1971,7 @@ finish_command (const char *arg, int from_tty) if (sm->function != NULL && TYPE_NO_RETURN (sm->function->type) && !query (_("warning: Function %s does not return normally.\n" "Try to finish anyway? "), - SYMBOL_PRINT_NAME (sm->function))) + sm->function->print_name ())) error (_("Not confirmed.")); printf_filtered (_("Run till exit from ")); } @@ -1971,6 +1999,7 @@ info_program_command (const char *args, int from_tty) bpstat bs; int num, stat; ptid_t ptid; + process_stratum_target *proc_target; if (!target_has_execution) { @@ -1979,18 +2008,17 @@ info_program_command (const char *args, int from_tty) } if (non_stop) - ptid = inferior_ptid; - else { - struct target_waitstatus ws; - - get_last_target_status (&ptid, &ws); + ptid = inferior_ptid; + proc_target = current_inferior ()->process_target (); } + else + get_last_target_status (&proc_target, &ptid, nullptr); if (ptid == null_ptid || ptid == minus_one_ptid) error (_("No selected thread.")); - thread_info *tp = find_thread_ptid (ptid); + thread_info *tp = find_thread_ptid (proc_target, ptid); if (tp->state == THREAD_EXITED) error (_("Invalid selected thread.")); @@ -2077,7 +2105,7 @@ set_environment_command (const char *arg, int from_tty) if (arg == 0) error_no_arg (_("environment variable and value")); - /* Find seperation between variable name and value. */ + /* Find separation between variable name and value. */ p = (char *) strchr (arg, '='); val = (char *) strchr (arg, ' '); @@ -2174,7 +2202,7 @@ path_command (const char *dirname, int from_tty) current_inferior ()->environment.set (path_var_name, exec_path); xfree (exec_path); if (from_tty) - path_info ((char *) NULL, from_tty); + path_info (NULL, from_tty); } @@ -2220,7 +2248,7 @@ default_print_one_register_info (struct ui_file *file, { struct value_print_options opts; const gdb_byte *valaddr = value_contents_for_printing (val); - enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (regtype)); + enum bfd_endian byte_order = type_byte_order (regtype); get_user_print_options (&opts); opts.deref_ref = 1; @@ -2499,20 +2527,6 @@ kill_command (const char *arg, int from_tty) printf_unfiltered (_("[Inferior %d (%s) killed]\n"), infnum, pid_str.c_str ()); - /* If we still have other inferiors to debug, then don't mess with - with their threads. */ - if (!have_inferiors ()) - { - init_thread_list (); /* Destroy thread info. */ - - /* Killing off the inferior can leave us with a core file. If - so, print the state we are left in. */ - if (target_has_stack) - { - printf_filtered (_("In %s,\n"), target_longname); - print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); - } - } bfd_cache_close_all (); } @@ -2793,12 +2807,16 @@ attach_command (const char *args, int from_tty) add_inferior_continuation (attach_command_continuation, a, attach_command_continuation_free_args); + /* Let infrun consider waiting for events out of this + target. */ + inferior->process_target ()->threads_executing = true; + if (!target_is_async_p ()) mark_infrun_async_event_handler (); return; } - - attach_post_wait (args, from_tty, mode); + else + attach_post_wait (args, from_tty, mode); } /* We had just found out that the target was already attached to an @@ -2915,20 +2933,15 @@ disconnect_command (const char *args, int from_tty) deprecated_detach_hook (); } -void -interrupt_target_1 (int all_threads) -{ - ptid_t ptid; - - if (all_threads) - ptid = minus_one_ptid; - else - ptid = inferior_ptid; +/* Stop PTID in the current target, and tag the PTID threads as having + been explicitly requested to stop. PTID can be a thread, a + process, or minus_one_ptid, meaning all threads of all inferiors of + the current target. */ - if (non_stop) - target_stop (ptid); - else - target_interrupt (); +static void +stop_current_target_threads_ns (ptid_t ptid) +{ + target_stop (ptid); /* Tag the thread as having been explicitly requested to stop, so other parts of gdb know not to resume this thread automatically, @@ -2936,8 +2949,32 @@ interrupt_target_1 (int all_threads) non-stop mode, as when debugging a multi-threaded application in all-stop mode, we will only get one stop event --- it's undefined which thread will report the event. */ + set_stop_requested (current_inferior ()->process_target (), + ptid, 1); +} + +/* See inferior.h. */ + +void +interrupt_target_1 (bool all_threads) +{ if (non_stop) - set_stop_requested (ptid, 1); + { + if (all_threads) + { + scoped_restore_current_thread restore_thread; + + for (inferior *inf : all_inferiors ()) + { + switch_to_inferior_no_thread (inf); + stop_current_target_threads_ns (minus_one_ptid); + } + } + else + stop_current_target_threads_ns (inferior_ptid); + } + else + target_interrupt (); } /* interrupt [-a] @@ -3024,7 +3061,7 @@ info_proc_cmd_1 (const char *args, enum info_proc_what what, int from_tty) } } -/* Implement `info proc' when given without any futher parameters. */ +/* Implement `info proc' when given without any further parameters. */ static void info_proc_cmd (const char *args, int from_tty) @@ -3096,6 +3133,19 @@ info_proc_cmd_all (const char *args, int from_tty) info_proc_cmd_1 (args, IP_ALL, from_tty); } +/* Implement `show print finish'. */ + +static void +show_print_finish (struct ui_file *file, int from_tty, + struct cmd_list_element *c, + const char *value) +{ + fprintf_filtered (file, _("\ +Printing of return value after `finish' is %s.\n"), + value); +} + + /* This help string is used for the run, start, and starti commands. It is defined as a macro to prevent duplication. */ @@ -3302,6 +3352,7 @@ reason).")); add_com_alias ("s", "step", class_run, 1); c = add_com ("until", class_run, until_command, _("\ +Execute until past the current line or past a LOCATION.\n\ Execute until the program reaches a source line greater than the current\n\ or a specified location (same args as break command) within the current \ frame.")); @@ -3377,10 +3428,10 @@ in the named register groups.")); _("Execution status of the program.")); add_info ("float", info_float_command, - _("Print the status of the floating point unit\n")); + _("Print the status of the floating point unit.")); add_info ("vector", info_vector_command, - _("Print the status of the vector unit\n")); + _("Print the status of the vector unit.")); add_prefix_cmd ("proc", class_info, info_proc_cmd, _("\ @@ -3420,4 +3471,12 @@ List files opened by the specified process."), add_cmd ("all", class_info, info_proc_cmd_all, _("\ List all available info about the specified process."), &info_proc_cmdlist); + + add_setshow_boolean_cmd ("finish", class_support, + &user_print_options.finish_print, _("\ +Set whether `finish' prints the return value."), _("\ +Show whether `finish' prints the return value."), NULL, + NULL, + show_print_finish, + &setprintlist, &showprintlist); }