diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a5d07e64e9..c8f1bcfbc5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,41 @@ +2017-04-12 Sergio Durigan Junior + + * common/common-utils.c (free_vector_argv): New function. + * common/common-utils.h: Include . + (free_vector_argv): New prototype. + * darwin-nat.c (darwin_create_inferior): Rewrite function + prototype in order to constify "exec_file" and accept a + "std::string" for "allargs". + * fork-child.c: Include . + (breakup_args): Rewrite function, using C++. + (fork_inferior): Rewrite function header, constify "exec_file_arg" + and accept "std::string" for "allargs". Update the code to + calculate "argv" based on "allargs". Update calls to "exec_fun" + and "execvp". + * gnu-nat.c (gnu_create_inferior): Rewrite function prototype in + order to constify "exec_file" and accept a "std::string" for + "allargs". + * go32-nat.c (go32_create_inferior): Likewise. + * inf-ptrace.c (inf_ptrace_create_inferior): Likewise. + * infcmd.c (run_command_1): Constify "exec_file". Use + "std::string" for inferior arguments. + * inferior.h (fork_inferior): Update prototype. + * linux-nat.c (linux_nat_create_inferior): Rewrite function + prototype in order to constify "exec_file" and accept a + "std::string" for "allargs". + * nto-procfs.c (procfs_create_inferior): Likewise. + * procfs.c (procfs_create_inferior): Likewise. + * remote-sim.c (gdbsim_create_inferior): Likewise. + * remote.c (extended_remote_run): Update code to accept + "std::string" as argument. + (extended_remote_create_inferior): Rewrite function prototype in + order to constify "exec_file" and accept a "std::string" for + "allargs". + * rs6000-nat.c (super_create_inferior): Likewise. + (rs6000_create_inferior): Likewise. + * target.h (struct target_ops) : Likewise. + * windows-nat.c (windows_create_inferior): Likewise. + 2017-04-11 Pedro Alves * thread.c: Fix whitespace throughout. diff --git a/gdb/common/common-utils.c b/gdb/common/common-utils.c index afc0af9641..e94fdc4cb3 100644 --- a/gdb/common/common-utils.c +++ b/gdb/common/common-utils.c @@ -317,3 +317,14 @@ skip_to_space_const (const char *chp) chp++; return chp; } + +/* See common/common-utils.h. */ + +void +free_vector_argv (std::vector &v) +{ + for (char *el : v) + xfree (el); + + v.clear (); +} diff --git a/gdb/common/common-utils.h b/gdb/common/common-utils.h index 618d2663fa..c331f0d62f 100644 --- a/gdb/common/common-utils.h +++ b/gdb/common/common-utils.h @@ -21,6 +21,7 @@ #define COMMON_UTILS_H #include +#include /* If possible, define FUNCTION_NAME, a macro containing the name of the function being defined. Since this macro may not always be @@ -103,4 +104,8 @@ extern const char *skip_spaces_const (const char *inp); extern const char *skip_to_space_const (const char *inp); +/* Assumes that V is an argv for a program, and iterates through + freeing all the elements. */ +extern void free_vector_argv (std::vector &v); + #endif diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c index e5092401f8..cba84caec3 100644 --- a/gdb/darwin-nat.c +++ b/gdb/darwin-nat.c @@ -102,8 +102,10 @@ static void darwin_ptrace_me (void); static void darwin_ptrace_him (int pid); -static void darwin_create_inferior (struct target_ops *ops, char *exec_file, - char *allargs, char **env, int from_tty); +static void darwin_create_inferior (struct target_ops *ops, + const char *exec_file, + const std::string &allargs, + char **env, int from_tty); static void darwin_files_info (struct target_ops *ops); @@ -1826,8 +1828,10 @@ darwin_execvp (const char *file, char * const argv[], char * const env[]) } static void -darwin_create_inferior (struct target_ops *ops, char *exec_file, - char *allargs, char **env, int from_tty) +darwin_create_inferior (struct target_ops *ops, + const char *exec_file, + const std::string &allargs, + char **env, int from_tty) { /* Do the hard work. */ fork_inferior (exec_file, allargs, env, darwin_ptrace_me, darwin_ptrace_him, diff --git a/gdb/fork-child.c b/gdb/fork-child.c index 04d2cdfbfa..6b7386e07e 100644 --- a/gdb/fork-child.c +++ b/gdb/fork-child.c @@ -34,6 +34,7 @@ #include "top.h" #include "signals-state-save-restore.h" #include +#include /* This just gets used as a default if we can't find SHELL. */ #define SHELL_FILE "/bin/sh" @@ -48,41 +49,32 @@ static char *exec_wrapper; fill in ARGV with the four arguments "a", "b", "c", "d". */ static void -breakup_args (char *scratch, char **argv) +breakup_args (const std::string &scratch, std::vector &argv) { - char *cp = scratch, *tmp; - - for (;;) + for (size_t cur_pos = 0; cur_pos < scratch.size ();) { - /* Scan past leading separators */ - while (*cp == ' ' || *cp == '\t' || *cp == '\n') - cp++; + /* Skip whitespace-like chars. */ + std::size_t pos = scratch.find_first_not_of (" \t\n", cur_pos); - /* Break if at end of string. */ - if (*cp == '\0') - break; + if (pos != std::string::npos) + cur_pos = pos; - /* Take an arg. */ - *argv++ = cp; + /* Find the position of the next separator. */ + std::size_t next_sep = scratch.find_first_of (" \t\n", cur_pos); - /* Scan for next arg separator. */ - tmp = strchr (cp, ' '); - if (tmp == NULL) - tmp = strchr (cp, '\t'); - if (tmp == NULL) - tmp = strchr (cp, '\n'); + /* No separator found, which means this is the last + argument. */ + if (next_sep == std::string::npos) + next_sep = scratch.size (); - /* No separators => end of string => break. */ - if (tmp == NULL) - break; - cp = tmp; + char *arg = savestring (scratch.c_str () + cur_pos, next_sep - cur_pos); + argv.push_back (arg); - /* Replace the separator with a terminator. */ - *cp++ = '\0'; + cur_pos = next_sep; } - /* Null-terminate the vector. */ - *argv = NULL; + /* NULL-terminate the vector. */ + argv.push_back (NULL); } /* When executing a command under the given shell, return non-zero if @@ -145,9 +137,10 @@ trace_start_error_with_name (const char *string) made static to ensure that they survive the vfork call. */ int -fork_inferior (char *exec_file_arg, char *allargs, char **env, - void (*traceme_fun) (void), void (*init_trace_fun) (int), - void (*pre_trace_fun) (void), char *shell_file_arg, +fork_inferior (const char *exec_file_arg, const std::string &allargs, + char **env, void (*traceme_fun) (void), + void (*init_trace_fun) (int), void (*pre_trace_fun) (void), + char *shell_file_arg, void (*exec_fun)(const char *file, char * const *argv, char * const *env)) { @@ -159,10 +152,10 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env, to you in the parent process. It's only used by humans for debugging. */ static int debug_setpgrp = 657473; static char *shell_file; - static char *exec_file; + static const char *exec_file; char **save_our_env; int shell = 0; - static char **argv; + std::vector argv; const char *inferior_io_terminal = get_inferior_io_terminal (); struct inferior *inf; int i; @@ -171,9 +164,10 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env, /* If no exec file handed to us, get it from the exec-file command -- with a good, common error message if none is specified. */ - exec_file = exec_file_arg; - if (exec_file == 0) + if (exec_file_arg == NULL) exec_file = get_exec_file (1); + else + exec_file = exec_file_arg; /* 'startup_with_shell' is declared in inferior.h and bound to the "set startup-with-shell" option. If 0, we'll just do a @@ -191,43 +185,26 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env, if (!shell) { - /* We're going to call execvp. Create argument vector. - Calculate an upper bound on the length of the vector by - assuming that every other character is a separate - argument. */ - int argc = (strlen (allargs) + 1) / 2 + 2; - - argv = XALLOCAVEC (char *, argc); - argv[0] = exec_file; - breakup_args (allargs, &argv[1]); + /* We're going to call execvp. Create argument vector. */ + argv.push_back (xstrdup (exec_file)); + breakup_args (allargs, argv); } else { /* We're going to call a shell. */ - char *shell_command; - int len; - char *p; + std::string shell_command; + const char *p; int need_to_quote; const int escape_bang = escape_bang_in_quoted_argument (shell_file); - /* Multiplying the length of exec_file by 4 is to account for the - fact that it may expand when quoted; it is a worst-case number - based on every character being '. */ - len = 5 + 4 * strlen (exec_file) + 1 + strlen (allargs) + 1 + /*slop */ 12; - if (exec_wrapper) - len += strlen (exec_wrapper) + 1; - - shell_command = (char *) alloca (len); - shell_command[0] = '\0'; - - strcat (shell_command, "exec "); + shell_command = std::string ("exec "); /* Add any exec wrapper. That may be a program name with arguments, so the user must handle quoting. */ if (exec_wrapper) { - strcat (shell_command, exec_wrapper); - strcat (shell_command, " "); + shell_command += exec_wrapper; + shell_command += ' '; } /* Now add exec_file, quoting as necessary. */ @@ -268,33 +245,32 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env, end_scan: if (need_to_quote) { - strcat (shell_command, "'"); + shell_command += '\''; for (p = exec_file; *p != '\0'; ++p) { if (*p == '\'') - strcat (shell_command, "'\\''"); + shell_command += "'\\''"; else if (*p == '!' && escape_bang) - strcat (shell_command, "\\!"); + shell_command += "\\!"; else - strncat (shell_command, p, 1); + shell_command += *p; } - strcat (shell_command, "'"); + shell_command += '\''; } else - strcat (shell_command, exec_file); + shell_command += exec_file; - strcat (shell_command, " "); - strcat (shell_command, allargs); + shell_command += " " + allargs; /* If we decided above to start up with a shell, we exec the shell, "-c" says to interpret the next arg as a shell command to execute, and this command is "exec - ". */ - argv = (char **) alloca (4 * sizeof (char *)); - argv[0] = shell_file; - argv[1] = (char *) "-c"; - argv[2] = shell_command; - argv[3] = (char *) 0; + ". We xstrdup all the strings here because they will + be free'd later in the code. */ + argv.push_back (xstrdup (shell_file)); + argv.push_back (xstrdup ("-c")); + argv.push_back (xstrdup (shell_command.c_str ())); + argv.push_back (NULL); } /* Retain a copy of our environment variables, since the child will @@ -401,9 +377,9 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env, environ = env; if (exec_fun != NULL) - (*exec_fun) (argv[0], argv, env); + (*exec_fun) (argv[0], &argv[0], env); else - execvp (argv[0], argv); + execvp (argv[0], &argv[0]); /* If we get here, it's an error. */ save_errno = errno; @@ -417,6 +393,8 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env, _exit (0177); } + free_vector_argv (argv); + /* Restore our environment in case a vforked child clob'd it. */ environ = save_our_env; diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 8b1adfe270..1f8c5938b7 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,12 @@ +2017-04-12 Sergio Durigan Junior + + * server.c: Include . + : Convert to std::vector. + (start_inferior): Rewrite function to use C++. + (handle_v_run): Likewise. Update code that calculates the argv + based on the vRun packet; use C++. + (captured_main): Likewise. + 2017-04-06 Simon Marchi * server.c (handle_v_cont): Initialize thread_resume::thread diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 9cc6145b05..69fcab128b 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -35,6 +35,7 @@ #include "tracepoint.h" #include "dll.h" #include "hostio.h" +#include /* The thread set with an `Hc' packet. `Hc' is deprecated in favor of `vCont'. Note the multi-process extensions made `vCont' a @@ -78,7 +79,8 @@ static int vCont_supported; space randomization feature before starting an inferior. */ int disable_randomization = 1; -static char **program_argv, **wrapper_argv; +static std::vector program_argv; +static std::vector wrapper_argv; int pass_signals[GDB_SIGNAL_LAST]; int program_signals[GDB_SIGNAL_LAST]; @@ -239,29 +241,21 @@ target_running (void) static int start_inferior (char **argv) { - char **new_argv = argv; + std::vector new_argv; - if (wrapper_argv != NULL) - { - int i, count = 1; + if (!wrapper_argv.empty ()) + new_argv.insert (new_argv.begin (), + wrapper_argv.begin (), + wrapper_argv.end ()); - for (i = 0; wrapper_argv[i] != NULL; i++) - count++; - for (i = 0; argv[i] != NULL; i++) - count++; - new_argv = XALLOCAVEC (char *, count); - count = 0; - for (i = 0; wrapper_argv[i] != NULL; i++) - new_argv[count++] = wrapper_argv[i]; - for (i = 0; argv[i] != NULL; i++) - new_argv[count++] = argv[i]; - new_argv[count] = NULL; - } + for (int i = 0; argv[i] != NULL; ++i) + new_argv.push_back (argv[i]); + + new_argv.push_back (NULL); if (debug_threads) { - int i; - for (i = 0; new_argv[i]; ++i) + for (int i = 0; i < new_argv.size (); ++i) debug_printf ("new_argv[%d] = \"%s\"\n", i, new_argv[i]); debug_flush (); } @@ -271,7 +265,7 @@ start_inferior (char **argv) signal (SIGTTIN, SIG_DFL); #endif - signal_pid = create_inferior (new_argv[0], new_argv); + signal_pid = create_inferior (new_argv[0], &new_argv[0]); /* FIXME: we don't actually know at this point that the create actually succeeded. We won't know that until we wait. */ @@ -288,7 +282,7 @@ start_inferior (char **argv) atexit (restore_old_foreground_pgrp); #endif - if (wrapper_argv != NULL) + if (!wrapper_argv.empty ()) { ptid_t ptid = pid_to_ptid (signal_pid); @@ -2852,7 +2846,8 @@ handle_v_attach (char *own_buf) static int handle_v_run (char *own_buf) { - char *p, *next_p, **new_argv; + char *p, *next_p; + std::vector new_argv; int i, new_argc; new_argc = 0; @@ -2862,62 +2857,51 @@ handle_v_run (char *own_buf) new_argc++; } - new_argv = (char **) calloc (new_argc + 2, sizeof (char *)); - if (new_argv == NULL) - { - write_enn (own_buf); - return 0; - } - - i = 0; - for (p = own_buf + strlen ("vRun;"); *p; p = next_p) + for (i = 0, p = own_buf + strlen ("vRun;"); *p; p = next_p, ++i) { next_p = strchr (p, ';'); if (next_p == NULL) next_p = p + strlen (p); if (i == 0 && p == next_p) - new_argv[i] = NULL; + { + /* No program specified. */ + new_argv.push_back (NULL); + } else { - /* FIXME: Fail request if out of memory instead of dying. */ - new_argv[i] = (char *) xmalloc (1 + (next_p - p) / 2); - hex2bin (p, (gdb_byte *) new_argv[i], (next_p - p) / 2); - new_argv[i][(next_p - p) / 2] = '\0'; + size_t len = (next_p - p) / 2; + char *arg = (char *) xmalloc (len + 1); + + hex2bin (p, (gdb_byte *) arg, len); + arg[len] = '\0'; + new_argv.push_back (arg); } if (*next_p) next_p++; - i++; } - new_argv[i] = NULL; + new_argv.push_back (NULL); if (new_argv[0] == NULL) { /* GDB didn't specify a program to run. Use the program from the last run with the new argument list. */ - - if (program_argv == NULL) + if (program_argv.empty ()) { write_enn (own_buf); - freeargv (new_argv); + free_vector_argv (new_argv); return 0; } - new_argv[0] = strdup (program_argv[0]); - if (new_argv[0] == NULL) - { - write_enn (own_buf); - freeargv (new_argv); - return 0; - } + new_argv.push_back (xstrdup (program_argv[0])); } /* Free the old argv and install the new one. */ - freeargv (program_argv); + free_vector_argv (program_argv); program_argv = new_argv; - start_inferior (program_argv); + start_inferior (&program_argv[0]); if (last_status.kind == TARGET_WAITKIND_STOPPED) { prepare_resume_reply (own_buf, last_ptid, &last_status); @@ -3536,13 +3520,18 @@ captured_main (int argc, char *argv[]) multi_mode = 1; else if (strcmp (*next_arg, "--wrapper") == 0) { + char **tmp; + next_arg++; - wrapper_argv = next_arg; + tmp = next_arg; while (*next_arg != NULL && strcmp (*next_arg, "--") != 0) - next_arg++; + { + wrapper_argv.push_back (*next_arg); + next_arg++; + } - if (next_arg == wrapper_argv || *next_arg == NULL) + if (next_arg == tmp || *next_arg == NULL) { gdbserver_usage (stderr); exit (1); @@ -3692,13 +3681,12 @@ captured_main (int argc, char *argv[]) int i, n; n = argc - (next_arg - argv); - program_argv = XNEWVEC (char *, n + 1); for (i = 0; i < n; i++) - program_argv[i] = xstrdup (next_arg[i]); - program_argv[i] = NULL; + program_argv.push_back (xstrdup (next_arg[i])); + program_argv.push_back (NULL); /* Wait till we are at first instruction in program. */ - start_inferior (program_argv); + start_inferior (&program_argv[0]); /* We are now (hopefully) stopped at the first instruction of the target process. This assumes that the target process was @@ -4313,9 +4301,9 @@ process_serial_event (void) fprintf (stderr, "GDBserver restarting\n"); /* Wait till we are at 1st instruction in prog. */ - if (program_argv != NULL) + if (!program_argv.empty ()) { - start_inferior (program_argv); + start_inferior (&program_argv[0]); if (last_status.kind == TARGET_WAITKIND_STOPPED) { /* Stopped at the first instruction of the target diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c index b2a975dead..6298103e45 100644 --- a/gdb/gnu-nat.c +++ b/gdb/gnu-nat.c @@ -2131,7 +2131,8 @@ gnu_ptrace_me (void) static void gnu_create_inferior (struct target_ops *ops, - char *exec_file, char *allargs, char **env, + const char *exec_file, const std::string &allargs, + char **env, int from_tty) { struct inf *inf = cur_inf (); diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c index a20067e7ef..4e609a87e7 100644 --- a/gdb/go32-nat.c +++ b/gdb/go32-nat.c @@ -631,8 +631,9 @@ go32_kill_inferior (struct target_ops *ops) } static void -go32_create_inferior (struct target_ops *ops, char *exec_file, - char *args, char **env, int from_tty) +go32_create_inferior (struct target_ops *ops, + const char *exec_file, + const std::string &allargs, char **env, int from_tty) { extern char **environ; jmp_buf start_state; @@ -641,6 +642,7 @@ go32_create_inferior (struct target_ops *ops, char *exec_file, size_t cmdlen; struct inferior *inf; 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. */ diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c index c91100134b..b19aaf9e29 100644 --- a/gdb/inf-ptrace.c +++ b/gdb/inf-ptrace.c @@ -90,8 +90,8 @@ inf_ptrace_me (void) static void inf_ptrace_create_inferior (struct target_ops *ops, - char *exec_file, char *allargs, char **env, - int from_tty) + const char *exec_file, const std::string &allargs, + char **env, int from_tty) { int pid; diff --git a/gdb/infcmd.c b/gdb/infcmd.c index f6ffb9ba18..22b2c7aade 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -526,7 +526,7 @@ prepare_execution_command (struct target_ops *target, int background) static void run_command_1 (char *args, int from_tty, int tbreak_at_main) { - char *exec_file; + const char *exec_file; struct cleanup *old_chain; ptid_t ptid; struct ui_out *uiout = current_uiout; @@ -574,7 +574,7 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) if (tbreak_at_main) tbreak_command (main_name (), 0); - exec_file = (char *) get_exec_file (0); + exec_file = get_exec_file (0); /* We keep symbols from add-symbol-file, on the grounds that the user might want to add some symbols before running the program @@ -607,7 +607,8 @@ 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. */ - run_target->to_create_inferior (run_target, exec_file, get_inferior_args (), + run_target->to_create_inferior (run_target, exec_file, + std::string (get_inferior_args ()), environ_vector (current_inferior ()->environment), from_tty); /* to_create_inferior should push the target, so after this point we diff --git a/gdb/inferior.h b/gdb/inferior.h index 7c0ddf37f1..bf06ac1c7e 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -146,7 +146,7 @@ extern void trace_start_error (const char *fmt, ...) extern void trace_start_error_with_name (const char *string) ATTRIBUTE_NORETURN; -extern int fork_inferior (char *, char *, char **, +extern int fork_inferior (const char *, const std::string &, char **, void (*)(void), void (*)(int), void (*)(void), char *, void (*)(const char *, diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 8dececf2c5..b008df0ac0 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1105,8 +1105,8 @@ linux_nat_post_attach_wait (ptid_t ptid, int first, int *signalled) static void linux_nat_create_inferior (struct target_ops *ops, - char *exec_file, char *allargs, char **env, - int from_tty) + const char *exec_file, const std::string &allargs, + char **env, int from_tty) { struct cleanup *restore_personality = maybe_disable_address_space_randomization (disable_randomization); diff --git a/gdb/nto-procfs.c b/gdb/nto-procfs.c index 75f92dcf78..7fb7095745 100644 --- a/gdb/nto-procfs.c +++ b/gdb/nto-procfs.c @@ -1163,8 +1163,9 @@ breakup_args (char *scratch, char **argv) } static void -procfs_create_inferior (struct target_ops *ops, char *exec_file, - char *allargs, char **env, int from_tty) +procfs_create_inferior (struct target_ops *ops, const char *exec_file, + const std::string &allargs, + char **env, int from_tty) { struct inheritance inherit; pid_t pid; @@ -1176,7 +1177,7 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file, const char *inferior_io_terminal = get_inferior_io_terminal (); struct inferior *inf; - argv = xmalloc (((strlen (allargs) + 1) / (unsigned) 2 + 2) * + argv = xmalloc ((allargs.size () / (unsigned) 2 + 2) * sizeof (*argv)); argv[0] = get_exec_file (1); if (!argv[0]) @@ -1187,7 +1188,7 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file, return; } - args = xstrdup (allargs); + args = xstrdup (allargs.c_str ()); breakup_args (args, (exec_file != NULL) ? &argv[1] : &argv[0]); argv = nto_parse_redirection (argv, &in, &out, &err); diff --git a/gdb/procfs.c b/gdb/procfs.c index 87c317f375..5d940ddbae 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -4526,8 +4526,8 @@ procfs_set_exec_trap (void) inf-ptrace? */ static void -procfs_create_inferior (struct target_ops *ops, char *exec_file, - char *allargs, char **env, int from_tty) +procfs_create_inferior (struct target_ops *ops, const char *exec_file, + const std::string &allargs, char **env, int from_tty) { char *shell_file = getenv ("SHELL"); char *tryname; diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c index 4396d4bcfe..fd1bc66642 100644 --- a/gdb/remote-sim.c +++ b/gdb/remote-sim.c @@ -607,13 +607,14 @@ gdbsim_load (struct target_ops *self, const char *args, int fromtty) user types "run" after having attached. */ static void -gdbsim_create_inferior (struct target_ops *target, char *exec_file, char *args, - char **env, int from_tty) +gdbsim_create_inferior (struct target_ops *target, const char *exec_file, + const std::string &allargs, char **env, int from_tty) { struct sim_inferior_data *sim_data = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED); int len; char *arg_buf, **argv; + const char *args = allargs.c_str (); if (exec_file == 0 || exec_bfd == 0) warning (_("No executable file specified.")); @@ -633,7 +634,7 @@ gdbsim_create_inferior (struct target_ops *target, char *exec_file, char *args, if (exec_file != NULL) { - len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10; + len = strlen (exec_file) + 1 + allargs.size () + 1 + /*slop */ 10; arg_buf = (char *) alloca (len); arg_buf[0] = '\0'; strcat (arg_buf, exec_file); diff --git a/gdb/remote.c b/gdb/remote.c index a61469c987..7c5fe87da8 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -9526,7 +9526,7 @@ extended_remote_disable_randomization (int val) } static int -extended_remote_run (char *args) +extended_remote_run (const std::string &args) { struct remote_state *rs = get_remote_state (); int len; @@ -9545,14 +9545,13 @@ extended_remote_run (char *args) len += 2 * bin2hex ((gdb_byte *) remote_exec_file, rs->buf + len, strlen (remote_exec_file)); - gdb_assert (args != NULL); - if (*args) + if (!args.empty ()) { struct cleanup *back_to; int i; char **argv; - argv = gdb_buildargv (args); + argv = gdb_buildargv (args.c_str ()); back_to = make_cleanup_freeargv (argv); for (i = 0; argv[i] != NULL; i++) { @@ -9597,7 +9596,8 @@ extended_remote_run (char *args) static void extended_remote_create_inferior (struct target_ops *ops, - char *exec_file, char *args, + const char *exec_file, + const std::string &args, char **env, int from_tty) { int run_worked; @@ -9622,7 +9622,7 @@ extended_remote_create_inferior (struct target_ops *ops, user requested. */ if (remote_exec_file[0]) error (_("Remote target does not support \"set remote exec-file\"")); - if (args[0]) + if (!args.empty ()) error (_("Remote target does not support \"set args\" or run ")); /* Fall back to "R". */ diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index 8f5d25cdb3..83e0693d98 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -524,11 +524,13 @@ rs6000_wait (struct target_ops *ops, /* Set the current architecture from the host running GDB. Called when starting a child process. */ -static void (*super_create_inferior) (struct target_ops *,char *exec_file, - char *allargs, char **env, int from_tty); +static void (*super_create_inferior) (struct target_ops *, + const char *exec_file, + const std::string &allargs, + char **env, int from_tty); static void -rs6000_create_inferior (struct target_ops * ops, char *exec_file, - char *allargs, char **env, int from_tty) +rs6000_create_inferior (struct target_ops * ops, const char *exec_file, + const std::string &allargs, char **env, int from_tty) { enum bfd_architecture arch; unsigned long mach; diff --git a/gdb/target.h b/gdb/target.h index fac9d51c01..a971adf8c6 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -591,7 +591,8 @@ struct target_ops ENV is the environment vector to pass. Errors reported with error(). On VxWorks and various standalone systems, we ignore exec_file. */ void (*to_create_inferior) (struct target_ops *, - char *, char *, char **, int); + const char *, const std::string &, + char **, int); void (*to_post_startup_inferior) (struct target_ops *, ptid_t) TARGET_DEFAULT_IGNORE (); int (*to_insert_fork_catchpoint) (struct target_ops *, int) diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 21b5ebefd8..dd5cfe4cad 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -2412,8 +2412,9 @@ redirect_inferior_handles (const char *cmd_orig, char *cmd, ENV is the environment vector to pass. Errors reported with error(). */ static void -windows_create_inferior (struct target_ops *ops, char *exec_file, - char *allargs, char **in_env, int from_tty) +windows_create_inferior (struct target_ops *ops, const char *exec_file, + const std::string &origallargs, char **in_env, + int from_tty) { STARTUPINFO si; #ifdef __CYGWIN__ @@ -2432,6 +2433,7 @@ windows_create_inferior (struct target_ops *ops, char *exec_file, char real_path[__PMAX]; char shell[__PMAX]; /* Path to shell */ char *toexec; + const char *allargs = origallargs.c_str (); char *args, *allargs_copy; size_t args_len, allargs_len; int fd_inp = -1, fd_out = -1, fd_err = -1;