mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:54:41 +08:00
gdb: remove get_exec_file
I believe that the get_exec_file function is unnecessary, and the code can be simplified if we remove it. Consider for instance when you "run" a program on Linux with native debugging. 1. run_command_1 obtains the executable file from `current_program_space->exec_filename ()` 2. it passes it to `run_target->create_inferior()`, which is `inf_ptrace_target::create_inferior()` in this case, which then passes it to `fork_inferior()` 3. `fork_inferior()` then has a fallback, where if the passed exec file is nullptr, it gets its from `get_exec_file()`. 4. `get_exec_file()` returns `current_program_space->exec_filename ()` - just like the things we started with - or errors out if the current program space doesn't have a specified executable. If there's no exec filename passed in step 1, there's not going to be any in step 4, so it seems pointless to call `get_exec_file()`, we could just error out when `exec_file` is nullptr. But we can't error out directly in `fork_inferior()`, since the error is GDB-specific, and that function is shared with GDBserver. Speaking of GDBserver, all code paths that lead to `fork_inferior()` provide a non-nullptr exec file. Therefore, to simplify things: - Make `fork_inferior()` assume that the passed exec file is not nullptr, don't call `get_exec_file()` - Change some targets (darwin-nat, go32-nat, gnu-nat, inf-ptrace, nto-procfs, procfs) to error out when the exec file passed to their create_inferior method is nullptr. Some targets are fine with a nullptr exec file, so we can't check that in `run_command_1()`. - Add the `no_executable_specified_error()` function, which re-uses the error message that `get_exec_file()` had. - Change some targets (go32-nat, nto-procfs) to not call `get_exec_file()`, since it's pointless for the same reason as in the example above, if it returns, it's going the be the same value as the `exec_file` parameter. Just rely on `exec_file`. - Remove the final use of `get_exec_file()`, in `load_command()`. - Remove the `get_exec_file()` implementations in GDB and GDBserver and remove the shared declaration. Change-Id: I601c16498e455f7baa1f111a179da2f6c913baa3 Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
parent
449637674f
commit
7831bc9185
@ -76,19 +76,6 @@ validate_files (void)
|
||||
}
|
||||
}
|
||||
|
||||
/* See gdbsupport/common-inferior.h. */
|
||||
|
||||
const char *
|
||||
get_exec_file ()
|
||||
{
|
||||
if (current_program_space->exec_filename () != nullptr)
|
||||
return current_program_space->exec_filename ();
|
||||
|
||||
error (_("No executable file specified.\n\
|
||||
Use the \"file\" or \"exec-file\" command."));
|
||||
}
|
||||
|
||||
|
||||
std::string
|
||||
memory_error_message (enum target_xfer_status err,
|
||||
struct gdbarch *gdbarch, CORE_ADDR memaddr)
|
||||
|
@ -1969,6 +1969,9 @@ darwin_nat_target::create_inferior (const char *exec_file,
|
||||
const std::string &allargs,
|
||||
char **env, int from_tty)
|
||||
{
|
||||
if (exec_file == nullptr)
|
||||
no_executable_specified_error ();
|
||||
|
||||
std::optional<scoped_restore_tmpl<bool>> restore_startup_with_shell;
|
||||
darwin_nat_target *the_target = this;
|
||||
|
||||
|
@ -504,6 +504,15 @@ exec_file_attach (const char *filename, int from_tty)
|
||||
gdb::observers::executable_changed.notify (current_program_space, reload_p);
|
||||
}
|
||||
|
||||
/* See exec.h. */
|
||||
|
||||
void
|
||||
no_executable_specified_error ()
|
||||
{
|
||||
error (_("No executable file specified.\n\
|
||||
Use the \"file\" or \"exec-file\" command."));
|
||||
}
|
||||
|
||||
/* Process the first arg in ARGS as the new exec file.
|
||||
|
||||
Note that we have to explicitly ignore additional args, since we can
|
||||
|
@ -105,4 +105,9 @@ extern void print_section_info (const std::vector<target_section> *table,
|
||||
extern void try_open_exec_file (const char *exec_file_host,
|
||||
struct inferior *inf,
|
||||
symfile_add_flags add_flags);
|
||||
|
||||
/* Report a "No executable file specified" error. */
|
||||
|
||||
extern void no_executable_specified_error ();
|
||||
|
||||
#endif
|
||||
|
@ -2103,6 +2103,9 @@ gnu_nat_target::create_inferior (const char *exec_file,
|
||||
char **env,
|
||||
int from_tty)
|
||||
{
|
||||
if (exec_file == nullptr)
|
||||
no_executable_specified_error ();
|
||||
|
||||
struct inf *inf = cur_inf ();
|
||||
inferior *inferior = current_inferior ();
|
||||
int pid;
|
||||
|
@ -681,10 +681,8 @@ go32_nat_target::create_inferior (const char *exec_file,
|
||||
int result;
|
||||
const char *args = allargs.c_str ();
|
||||
|
||||
/* If no exec file handed to us, get it from the exec-file command -- with
|
||||
a good, common error message if none is specified. */
|
||||
if (exec_file == 0)
|
||||
exec_file = get_exec_file ();
|
||||
if (exec_file == nullptr)
|
||||
no_executable_specified_error ();
|
||||
|
||||
resume_signal = -1;
|
||||
resume_is_step = 0;
|
||||
|
@ -75,6 +75,9 @@ inf_ptrace_target::create_inferior (const char *exec_file,
|
||||
const std::string &allargs,
|
||||
char **env, int from_tty)
|
||||
{
|
||||
if (exec_file == nullptr)
|
||||
no_executable_specified_error ();
|
||||
|
||||
inferior *inf = current_inferior ();
|
||||
|
||||
/* Do not change either targets above or the same target if already present.
|
||||
|
@ -265,26 +265,20 @@ execv_argv::init_for_shell (const char *exec_file,
|
||||
/* See nat/fork-inferior.h. */
|
||||
|
||||
pid_t
|
||||
fork_inferior (const char *exec_file_arg, const std::string &allargs,
|
||||
char **env, traceme_ftype traceme_fun,
|
||||
init_trace_ftype init_trace_fun, pre_trace_ftype pre_trace_fun,
|
||||
const char *shell_file_arg, exec_ftype exec_fun)
|
||||
fork_inferior (const char *exec_file, const std::string &allargs, char **env,
|
||||
traceme_ftype traceme_fun, init_trace_ftype init_trace_fun,
|
||||
pre_trace_ftype pre_trace_fun, const char *shell_file_arg,
|
||||
exec_ftype exec_fun)
|
||||
{
|
||||
pid_t pid;
|
||||
/* Set debug_fork then attach to the child while it sleeps, to debug. */
|
||||
int debug_fork = 0;
|
||||
const char *shell_file;
|
||||
const char *exec_file;
|
||||
char **save_our_env;
|
||||
int i;
|
||||
int save_errno;
|
||||
|
||||
/* If no exec file handed to us, get it from the exec-file command
|
||||
-- with a good, common error message if none is specified. */
|
||||
if (exec_file_arg == NULL)
|
||||
exec_file = get_exec_file ();
|
||||
else
|
||||
exec_file = exec_file_arg;
|
||||
gdb_assert (exec_file != nullptr);
|
||||
|
||||
/* 'startup_with_shell' is declared in inferior.h and bound to the
|
||||
"set startup-with-shell" option. If 0, we'll just do a
|
||||
|
@ -1179,6 +1179,9 @@ nto_procfs_target::create_inferior (const char *exec_file,
|
||||
const std::string &allargs,
|
||||
char **env, int from_tty)
|
||||
{
|
||||
if (exec_file == nullptr)
|
||||
no_executable_specified_error ();
|
||||
|
||||
struct inheritance inherit;
|
||||
pid_t pid;
|
||||
int flags, errn;
|
||||
@ -1190,9 +1193,9 @@ nto_procfs_target::create_inferior (const char *exec_file,
|
||||
|
||||
argv = xmalloc ((allargs.size () / (unsigned) 2 + 2) *
|
||||
sizeof (*argv));
|
||||
argv[0] = const_cast<char *> (get_exec_file ());
|
||||
argv[0] = exec_file;
|
||||
args = xstrdup (allargs.c_str ());
|
||||
breakup_args (args, (exec_file != NULL) ? &argv[1] : &argv[0]);
|
||||
breakup_args (args, &argv[1]);
|
||||
|
||||
argv = nto_parse_redirection (argv, &in, &out, &err);
|
||||
|
||||
|
@ -2760,6 +2760,9 @@ procfs_target::create_inferior (const char *exec_file,
|
||||
const std::string &allargs,
|
||||
char **env, int from_tty)
|
||||
{
|
||||
if (exec_file == nullptr)
|
||||
no_executable_specified_error ();
|
||||
|
||||
const char *shell_file = get_shell ();
|
||||
char *tryname;
|
||||
int pid;
|
||||
|
@ -1835,7 +1835,9 @@ load_command (const char *arg, int from_tty)
|
||||
{
|
||||
const char *parg, *prev;
|
||||
|
||||
arg = get_exec_file ();
|
||||
arg = current_program_space->exec_filename ();
|
||||
if (arg == nullptr)
|
||||
no_executable_specified_error ();
|
||||
|
||||
/* We may need to quote this string so buildargv can pull it
|
||||
apart. */
|
||||
|
@ -282,17 +282,6 @@ get_exec_wrapper ()
|
||||
return !wrapper_argv.empty () ? wrapper_argv.c_str () : NULL;
|
||||
}
|
||||
|
||||
/* See gdbsupport/common-inferior.h. */
|
||||
|
||||
const char *
|
||||
get_exec_file ()
|
||||
{
|
||||
if (program_path.get () == NULL)
|
||||
error (_("No executable file specified."));
|
||||
|
||||
return program_path.get ();
|
||||
}
|
||||
|
||||
/* See server.h. */
|
||||
|
||||
gdb_environ *
|
||||
|
@ -27,11 +27,6 @@
|
||||
otherwise. */
|
||||
extern const char *get_exec_wrapper ();
|
||||
|
||||
/* Return the name of the executable file as a string.
|
||||
|
||||
Error out if no executable is specified. */
|
||||
extern const char *get_exec_file ();
|
||||
|
||||
/* Return the inferior's current working directory.
|
||||
|
||||
If it is not set, the string is empty. */
|
||||
|
Loading…
Reference in New Issue
Block a user