mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 21:34:46 +08:00
Per-inferior args and tty and environment.
* infcmd.c (inferior_args): Rename to ... (inferior_args_scratch): ... this. (inferior_io_terminal): Rename to ... (inferior_io_terminal_scratch): ... this. (inferior_argc, inferior_argv): Remove. (set_inferior_io_terminal, get_inferior_io_terminal): Store inside current_inferior(). (set_inferior_tty_command, show_inferior_tty_command): New. (get_inferior_args, set_inferior_args): Store inside current_inferior(). (notice_args_set): Likewise and rename to... (set_args_command): ... this. (set_inferior_args_vector): Likewise. (notice_args_read): Rename to... (show_args_command): ...new. (tty_command): Remove. (run_command_1): Don't free old args, as they are freed by set_inferior_arg now. (run_no_args_command): Likewise. (inferior_environ): Remove. (run_command_1): Use environment of the current inferior. (environment_info, set_environment_command) (unset_environment_command, path_info, path_command): Likewise. (_initialize_infcmd): Adjust for function and variable renames. Do not init inferior_environ. * inferior.h (set_inferior_arg): Adjust prototype. (struct inferior): New fields args, argc, argv, terminal, environment. (inferior_environ): Remove declaration. * inferior.c (free_inferior): Free new fields. (add_inferior_silent): Initialize 'environment' field. * main.c (captured_main): Set arguments only after the initial inferior has been created. Set set_inferior_io_terminal, not tty_command. * mi/mi-main.c (mi_cmd_env_path): Use environment of the current inferior. (_initialize_mi_cmd_env): Adjust for disappearance of global inferior_environ. * solib.c (solib_find): Use environment of the current inferior.
This commit is contained in:
161
gdb/infcmd.c
161
gdb/infcmd.c
@ -126,20 +126,17 @@ void _initialize_infcmd (void);
|
||||
#define ERROR_NO_INFERIOR \
|
||||
if (!target_has_execution) error (_("The program is not being run."));
|
||||
|
||||
/* String containing arguments to give to the program, separated by spaces.
|
||||
Empty string (pointer to '\0') means no args. */
|
||||
/* Scratch area where string containing arguments to give to the program will be
|
||||
stored by 'set args'. As soon as anything is stored, notice_args_set will
|
||||
move it into per-inferior storage. Arguments are separated by spaces. Empty
|
||||
string (pointer to '\0') means no args. */
|
||||
|
||||
static char *inferior_args;
|
||||
static char *inferior_args_scratch;
|
||||
|
||||
/* The inferior arguments as a vector. If INFERIOR_ARGC is nonzero,
|
||||
then we must compute INFERIOR_ARGS from this (via the target). */
|
||||
/* Scratch area where 'set inferior-tty' will store user-provided value.
|
||||
We'll immediate copy it into per-inferior storage. */
|
||||
|
||||
static int inferior_argc;
|
||||
static char **inferior_argv;
|
||||
|
||||
/* File name for default use for standard in/out in the inferior. */
|
||||
|
||||
static char *inferior_io_terminal;
|
||||
static char *inferior_io_terminal_scratch;
|
||||
|
||||
/* Pid of our debugged inferior, or 0 if no inferior now.
|
||||
Since various parts of infrun.c test this to see whether there is a program
|
||||
@ -166,80 +163,97 @@ int stop_stack_dummy;
|
||||
|
||||
int stopped_by_random_signal;
|
||||
|
||||
/* Environment to use for running inferior,
|
||||
in format described in environ.h. */
|
||||
|
||||
struct gdb_environ *inferior_environ;
|
||||
|
||||
/* Accessor routines. */
|
||||
|
||||
/* Set the io terminal for the current inferior. Ownership of
|
||||
TERMINAL_NAME is not transferred. */
|
||||
|
||||
void
|
||||
set_inferior_io_terminal (const char *terminal_name)
|
||||
{
|
||||
if (inferior_io_terminal)
|
||||
xfree (inferior_io_terminal);
|
||||
|
||||
if (!terminal_name)
|
||||
inferior_io_terminal = NULL;
|
||||
else
|
||||
inferior_io_terminal = xstrdup (terminal_name);
|
||||
xfree (current_inferior ()->terminal);
|
||||
current_inferior ()->terminal = terminal_name ? xstrdup (terminal_name) : 0;
|
||||
}
|
||||
|
||||
const char *
|
||||
get_inferior_io_terminal (void)
|
||||
{
|
||||
return inferior_io_terminal;
|
||||
return current_inferior ()->terminal;
|
||||
}
|
||||
|
||||
static void
|
||||
set_inferior_tty_command (char *args, int from_tty,
|
||||
struct cmd_list_element *c)
|
||||
{
|
||||
/* CLI has assigned the user-provided value to inferior_io_terminal_scratch.
|
||||
Now route it to current inferior. */
|
||||
set_inferior_io_terminal (inferior_io_terminal_scratch);
|
||||
}
|
||||
|
||||
static void
|
||||
show_inferior_tty_command (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
{
|
||||
/* Note that we ignore the passed-in value in favor of computing it
|
||||
directly. */
|
||||
fprintf_filtered (gdb_stdout,
|
||||
_("argument list to give program being debugged when "
|
||||
"it is started is %s"),
|
||||
get_inferior_io_terminal ());
|
||||
}
|
||||
|
||||
char *
|
||||
get_inferior_args (void)
|
||||
{
|
||||
if (inferior_argc != 0)
|
||||
if (current_inferior ()->argc != 0)
|
||||
{
|
||||
char *n, *old;
|
||||
char *n;
|
||||
|
||||
n = construct_inferior_arguments (inferior_argc, inferior_argv);
|
||||
old = set_inferior_args (n);
|
||||
xfree (old);
|
||||
n = construct_inferior_arguments (current_inferior ()->argc,
|
||||
current_inferior ()->argv);
|
||||
set_inferior_args (n);
|
||||
xfree (n);
|
||||
}
|
||||
|
||||
if (inferior_args == NULL)
|
||||
inferior_args = xstrdup ("");
|
||||
if (current_inferior ()->args == NULL)
|
||||
current_inferior ()->args = xstrdup ("");
|
||||
|
||||
return inferior_args;
|
||||
return current_inferior ()->args;
|
||||
}
|
||||
|
||||
char *
|
||||
/* Set the arguments for the current inferior. Ownership of
|
||||
NEWARGS is not transferred. */
|
||||
|
||||
void
|
||||
set_inferior_args (char *newargs)
|
||||
{
|
||||
char *saved_args = inferior_args;
|
||||
|
||||
inferior_args = newargs;
|
||||
inferior_argc = 0;
|
||||
inferior_argv = 0;
|
||||
|
||||
return saved_args;
|
||||
xfree (current_inferior ()->args);
|
||||
current_inferior ()->args = newargs ? xstrdup (newargs) : NULL;
|
||||
current_inferior ()->argc = 0;
|
||||
current_inferior ()->argv = 0;
|
||||
}
|
||||
|
||||
void
|
||||
set_inferior_args_vector (int argc, char **argv)
|
||||
{
|
||||
inferior_argc = argc;
|
||||
inferior_argv = argv;
|
||||
current_inferior ()->argc = argc;
|
||||
current_inferior ()->argv = argv;
|
||||
}
|
||||
|
||||
/* Notice when `set args' is run. */
|
||||
static void
|
||||
notice_args_set (char *args, int from_tty, struct cmd_list_element *c)
|
||||
set_args_command (char *args, int from_tty, struct cmd_list_element *c)
|
||||
{
|
||||
inferior_argc = 0;
|
||||
inferior_argv = 0;
|
||||
/* CLI has assigned the user-provided value to inferior_args_scratch.
|
||||
Now route it to current inferior. */
|
||||
set_inferior_args (inferior_args_scratch);
|
||||
}
|
||||
|
||||
/* Notice when `show args' is run. */
|
||||
static void
|
||||
notice_args_read (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
show_args_command (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
{
|
||||
/* Note that we ignore the passed-in value in favor of computing it
|
||||
directly. */
|
||||
@ -369,15 +383,6 @@ strip_bg_char (char **args)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
tty_command (char *file, int from_tty)
|
||||
{
|
||||
if (file == 0)
|
||||
error_no_arg (_("terminal name for running target process"));
|
||||
|
||||
set_inferior_io_terminal (file);
|
||||
}
|
||||
|
||||
/* Common actions to take after creating any sort of inferior, by any
|
||||
means (running, attaching, connecting, et cetera). The target
|
||||
should be stopped. */
|
||||
@ -536,10 +541,7 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main)
|
||||
|
||||
/* If there were other args, beside '&', process them. */
|
||||
if (args)
|
||||
{
|
||||
char *old_args = set_inferior_args (xstrdup (args));
|
||||
xfree (old_args);
|
||||
}
|
||||
set_inferior_args (args);
|
||||
}
|
||||
|
||||
if (from_tty)
|
||||
@ -559,7 +561,7 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main)
|
||||
/* We call get_inferior_args() because we might need to compute
|
||||
the value now. */
|
||||
target_create_inferior (exec_file, get_inferior_args (),
|
||||
environ_vector (inferior_environ), from_tty);
|
||||
environ_vector (current_inferior ()->environment), from_tty);
|
||||
|
||||
/* We're starting off a new process. When we get out of here, in
|
||||
non-stop mode, finish the state of all threads of that process,
|
||||
@ -594,8 +596,7 @@ run_command (char *args, int from_tty)
|
||||
static void
|
||||
run_no_args_command (char *args, int from_tty)
|
||||
{
|
||||
char *old_args = set_inferior_args (xstrdup (""));
|
||||
xfree (old_args);
|
||||
set_inferior_args ("");
|
||||
}
|
||||
|
||||
|
||||
@ -1699,7 +1700,7 @@ environment_info (char *var, int from_tty)
|
||||
{
|
||||
if (var)
|
||||
{
|
||||
char *val = get_in_environ (inferior_environ, var);
|
||||
char *val = get_in_environ (current_inferior ()->environment, var);
|
||||
if (val)
|
||||
{
|
||||
puts_filtered (var);
|
||||
@ -1716,7 +1717,7 @@ environment_info (char *var, int from_tty)
|
||||
}
|
||||
else
|
||||
{
|
||||
char **vector = environ_vector (inferior_environ);
|
||||
char **vector = environ_vector (current_inferior ()->environment);
|
||||
while (*vector)
|
||||
{
|
||||
puts_filtered (*vector++);
|
||||
@ -1781,10 +1782,10 @@ set_environment_command (char *arg, int from_tty)
|
||||
printf_filtered (_("\
|
||||
Setting environment variable \"%s\" to null value.\n"),
|
||||
var);
|
||||
set_in_environ (inferior_environ, var, "");
|
||||
set_in_environ (current_inferior ()->environment, var, "");
|
||||
}
|
||||
else
|
||||
set_in_environ (inferior_environ, var, val);
|
||||
set_in_environ (current_inferior ()->environment, var, val);
|
||||
xfree (var);
|
||||
}
|
||||
|
||||
@ -1797,12 +1798,12 @@ unset_environment_command (char *var, int from_tty)
|
||||
Ask for confirmation if reading from the terminal. */
|
||||
if (!from_tty || query (_("Delete all environment variables? ")))
|
||||
{
|
||||
free_environ (inferior_environ);
|
||||
inferior_environ = make_environ ();
|
||||
free_environ (current_inferior ()->environment);
|
||||
current_inferior ()->environment = make_environ ();
|
||||
}
|
||||
}
|
||||
else
|
||||
unset_in_environ (inferior_environ, var);
|
||||
unset_in_environ (current_inferior ()->environment, var);
|
||||
}
|
||||
|
||||
/* Handle the execution path (PATH variable) */
|
||||
@ -1813,7 +1814,7 @@ static void
|
||||
path_info (char *args, int from_tty)
|
||||
{
|
||||
puts_filtered ("Executable and object file path: ");
|
||||
puts_filtered (get_in_environ (inferior_environ, path_var_name));
|
||||
puts_filtered (get_in_environ (current_inferior ()->environment, path_var_name));
|
||||
puts_filtered ("\n");
|
||||
}
|
||||
|
||||
@ -1825,13 +1826,13 @@ path_command (char *dirname, int from_tty)
|
||||
char *exec_path;
|
||||
char *env;
|
||||
dont_repeat ();
|
||||
env = get_in_environ (inferior_environ, path_var_name);
|
||||
env = get_in_environ (current_inferior ()->environment, path_var_name);
|
||||
/* Can be null if path is not set */
|
||||
if (!env)
|
||||
env = "";
|
||||
exec_path = xstrdup (env);
|
||||
mod_path (dirname, &exec_path);
|
||||
set_in_environ (inferior_environ, path_var_name, exec_path);
|
||||
set_in_environ (current_inferior ()->environment, path_var_name, exec_path);
|
||||
xfree (exec_path);
|
||||
if (from_tty)
|
||||
path_info ((char *) NULL, from_tty);
|
||||
@ -2646,19 +2647,22 @@ _initialize_infcmd (void)
|
||||
|
||||
/* add the filename of the terminal connected to inferior I/O */
|
||||
add_setshow_filename_cmd ("inferior-tty", class_run,
|
||||
&inferior_io_terminal, _("\
|
||||
&inferior_io_terminal_scratch, _("\
|
||||
Set terminal for future runs of program being debugged."), _("\
|
||||
Show terminal for future runs of program being debugged."), _("\
|
||||
Usage: set inferior-tty /dev/pts/1"), NULL, NULL, &setlist, &showlist);
|
||||
Usage: set inferior-tty /dev/pts/1"),
|
||||
set_inferior_tty_command,
|
||||
show_inferior_tty_command,
|
||||
&setlist, &showlist);
|
||||
add_com_alias ("tty", "set inferior-tty", class_alias, 0);
|
||||
|
||||
add_setshow_optional_filename_cmd ("args", class_run,
|
||||
&inferior_args, _("\
|
||||
&inferior_args_scratch, _("\
|
||||
Set argument list to give program being debugged when it is started."), _("\
|
||||
Show argument list to give program being debugged when it is started."), _("\
|
||||
Follow this command with any number of args, to be passed to the program."),
|
||||
notice_args_set,
|
||||
notice_args_read,
|
||||
set_args_command,
|
||||
show_args_command,
|
||||
&setlist, &showlist);
|
||||
|
||||
c = add_cmd ("environment", no_class, environment_info, _("\
|
||||
@ -2855,7 +2859,4 @@ Register name as argument means describe only that register."));
|
||||
|
||||
add_info ("vector", vector_info,
|
||||
_("Print the status of the vector unit\n"));
|
||||
|
||||
inferior_environ = make_environ ();
|
||||
init_environ (inferior_environ);
|
||||
}
|
||||
|
Reference in New Issue
Block a user