| Index: gdb/main.c
|
| diff --git a/gdb/main.c b/gdb/main.c
|
| index 8b45c25b4f4b1e99f2a782e3e55ad4f6212a183a..976f8ae08b37f7b3bf9d1539dc3f105fb7697113 100644
|
| --- a/gdb/main.c
|
| +++ b/gdb/main.c
|
| @@ -41,6 +41,7 @@
|
| #include "cli/cli-cmds.h"
|
| #include "python/python.h"
|
| #include "objfiles.h"
|
| +#include "auto-load.h"
|
|
|
| /* The selected interpreter. This will be used as a set command
|
| variable, so it should always be malloc'ed - since
|
| @@ -84,19 +85,12 @@ int batch_silent = 0;
|
| int return_child_result = 0;
|
| int return_child_result_value = -1;
|
|
|
| -/* Whether to enable writing into executable and core files. */
|
| -extern int write_files;
|
|
|
| /* GDB as it has been invoked from the command line (i.e. argv[0]). */
|
| static char *gdb_program_name;
|
|
|
| static void print_gdb_help (struct ui_file *);
|
|
|
| -/* These two are used to set the external editor commands when gdb is
|
| - farming out files to be edited by another program. */
|
| -
|
| -extern char *external_editor_command;
|
| -
|
| /* Relocate a file or directory. PROGNAME is the name by which gdb
|
| was invoked (i.e., argv[0]). INITIAL is the default value for the
|
| file or directory. FLAG is true if the value is relocatable, false
|
| @@ -237,7 +231,7 @@ captured_command_loop (void *data)
|
| are not that well behaved. do_cleanups should either be replaced
|
| with a do_cleanups call (to cover the problem) or an assertion
|
| check to detect bad FUNCs code. */
|
| - do_cleanups (ALL_CLEANUPS);
|
| + do_cleanups (all_cleanups ());
|
| /* If the command_loop returned, normally (rather than threw an
|
| error) we try to quit. If the quit is aborted, catch_errors()
|
| which called this catch the signal and restart the command
|
| @@ -246,6 +240,31 @@ captured_command_loop (void *data)
|
| return 1;
|
| }
|
|
|
| +/* Arguments of --command option and its counterpart. */
|
| +typedef struct cmdarg {
|
| + /* Type of this option. */
|
| + enum {
|
| + /* Option type -x. */
|
| + CMDARG_FILE,
|
| +
|
| + /* Option type -ex. */
|
| + CMDARG_COMMAND,
|
| +
|
| + /* Option type -ix. */
|
| + CMDARG_INIT_FILE,
|
| +
|
| + /* Option type -iex. */
|
| + CMDARG_INIT_COMMAND
|
| + } type;
|
| +
|
| + /* Value of this option - filename or the GDB command itself. String memory
|
| + is not owned by this structure despite it is 'const'. */
|
| + char *string;
|
| +} cmdarg_s;
|
| +
|
| +/* Define type VEC (cmdarg_s). */
|
| +DEF_VEC_O (cmdarg_s);
|
| +
|
| static int
|
| captured_main (void *data)
|
| {
|
| @@ -270,17 +289,8 @@ captured_main (void *data)
|
| static int print_version;
|
|
|
| /* Pointers to all arguments of --command option. */
|
| - struct cmdarg {
|
| - enum {
|
| - CMDARG_FILE,
|
| - CMDARG_COMMAND
|
| - } type;
|
| - char *string;
|
| - } *cmdarg;
|
| - /* Allocated size of cmdarg. */
|
| - int cmdsize;
|
| - /* Number of elements of cmdarg used. */
|
| - int ncmd;
|
| + VEC (cmdarg_s) *cmdarg_vec = NULL;
|
| + struct cmdarg *cmdarg_p;
|
|
|
| /* Indices of all arguments of --directory option. */
|
| char **dirarg;
|
| @@ -316,9 +326,7 @@ captured_main (void *data)
|
| bindtextdomain (PACKAGE, LOCALEDIR);
|
| textdomain (PACKAGE);
|
|
|
| - cmdsize = 1;
|
| - cmdarg = (struct cmdarg *) xmalloc (cmdsize * sizeof (*cmdarg));
|
| - ncmd = 0;
|
| + make_cleanup (VEC_cleanup (cmdarg_s), &cmdarg_vec);
|
| dirsize = 1;
|
| dirarg = (char **) xmalloc (dirsize * sizeof (*dirarg));
|
| ndir = 0;
|
| @@ -393,7 +401,9 @@ captured_main (void *data)
|
| OPT_STATISTICS,
|
| OPT_TUI,
|
| OPT_NOWINDOWS,
|
| - OPT_WINDOWS
|
| + OPT_WINDOWS,
|
| + OPT_IX,
|
| + OPT_IEX
|
| };
|
| static struct option long_options[] =
|
| {
|
| @@ -433,6 +443,10 @@ captured_main (void *data)
|
| {"version", no_argument, &print_version, 1},
|
| {"x", required_argument, 0, 'x'},
|
| {"ex", required_argument, 0, 'X'},
|
| + {"init-command", required_argument, 0, OPT_IX},
|
| + {"init-eval-command", required_argument, 0, OPT_IEX},
|
| + {"ix", required_argument, 0, OPT_IX},
|
| + {"iex", required_argument, 0, OPT_IEX},
|
| #ifdef GDBTK
|
| {"tclcommand", required_argument, 0, 'z'},
|
| {"enable-external-editor", no_argument, 0, 'y'},
|
| @@ -541,24 +555,32 @@ captured_main (void *data)
|
| pidarg = optarg;
|
| break;
|
| case 'x':
|
| - cmdarg[ncmd].type = CMDARG_FILE;
|
| - cmdarg[ncmd++].string = optarg;
|
| - if (ncmd >= cmdsize)
|
| - {
|
| - cmdsize *= 2;
|
| - cmdarg = xrealloc ((char *) cmdarg,
|
| - cmdsize * sizeof (*cmdarg));
|
| - }
|
| + {
|
| + struct cmdarg cmdarg = { CMDARG_FILE, optarg };
|
| +
|
| + VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
| + }
|
| break;
|
| case 'X':
|
| - cmdarg[ncmd].type = CMDARG_COMMAND;
|
| - cmdarg[ncmd++].string = optarg;
|
| - if (ncmd >= cmdsize)
|
| - {
|
| - cmdsize *= 2;
|
| - cmdarg = xrealloc ((char *) cmdarg,
|
| - cmdsize * sizeof (*cmdarg));
|
| - }
|
| + {
|
| + struct cmdarg cmdarg = { CMDARG_COMMAND, optarg };
|
| +
|
| + VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
| + }
|
| + break;
|
| + case OPT_IX:
|
| + {
|
| + struct cmdarg cmdarg = { CMDARG_INIT_FILE, optarg };
|
| +
|
| + VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
| + }
|
| + break;
|
| + case OPT_IEX:
|
| + {
|
| + struct cmdarg cmdarg = { CMDARG_INIT_COMMAND, optarg };
|
| +
|
| + VEC_safe_push (cmdarg_s, cmdarg_vec, &cmdarg);
|
| + }
|
| break;
|
| case 'B':
|
| batch_flag = batch_silent = 1;
|
| @@ -588,6 +610,10 @@ captured_main (void *data)
|
| break;
|
| case 'w':
|
| {
|
| + /* Set the external editor commands when gdb is farming out files
|
| + to be edited by another program. */
|
| + extern char *external_editor_command;
|
| +
|
| external_editor_command = xstrdup (optarg);
|
| break;
|
| }
|
| @@ -822,6 +848,20 @@ captured_main (void *data)
|
| if (home_gdbinit && !inhibit_gdbinit)
|
| catch_command_errors (source_script, home_gdbinit, 0, RETURN_MASK_ALL);
|
|
|
| + /* Process '-ix' and '-iex' options early. */
|
| + for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++)
|
| + switch (cmdarg_p->type)
|
| + {
|
| + case CMDARG_INIT_FILE:
|
| + catch_command_errors (source_script, cmdarg_p->string,
|
| + !batch_flag, RETURN_MASK_ALL);
|
| + break;
|
| + case CMDARG_INIT_COMMAND:
|
| + catch_command_errors (execute_command, cmdarg_p->string,
|
| + !batch_flag, RETURN_MASK_ALL);
|
| + break;
|
| + }
|
| +
|
| /* Now perform all the actions indicated by the arguments. */
|
| if (cdarg != NULL)
|
| {
|
| @@ -835,8 +875,8 @@ captured_main (void *data)
|
| /* Skip auto-loading section-specified scripts until we've sourced
|
| local_gdbinit (which is often used to augment the source search
|
| path). */
|
| - save_auto_load = gdbpy_global_auto_load;
|
| - gdbpy_global_auto_load = 0;
|
| + save_auto_load = global_auto_load;
|
| + global_auto_load = 0;
|
|
|
| if (execarg != NULL
|
| && symarg != NULL
|
| @@ -898,27 +938,44 @@ captured_main (void *data)
|
|
|
| /* Read the .gdbinit file in the current directory, *if* it isn't
|
| the same as the $HOME/.gdbinit file (it should exist, also). */
|
| - if (local_gdbinit && !inhibit_gdbinit)
|
| - catch_command_errors (source_script, local_gdbinit, 0, RETURN_MASK_ALL);
|
| + if (local_gdbinit)
|
| + {
|
| + auto_load_local_gdbinit_pathname = gdb_realpath (local_gdbinit);
|
| +
|
| + if (!inhibit_gdbinit && auto_load_local_gdbinit
|
| + && file_is_auto_load_safe (local_gdbinit,
|
| + _("auto-load: Loading .gdbinit "
|
| + "file \"%s\".\n"),
|
| + local_gdbinit))
|
| + {
|
| + auto_load_local_gdbinit_loaded = 1;
|
| +
|
| + catch_command_errors (source_script, local_gdbinit, 0,
|
| + RETURN_MASK_ALL);
|
| + }
|
| + }
|
|
|
| /* Now that all .gdbinit's have been read and all -d options have been
|
| processed, we can read any scripts mentioned in SYMARG.
|
| We wait until now because it is common to add to the source search
|
| path in local_gdbinit. */
|
| - gdbpy_global_auto_load = save_auto_load;
|
| + global_auto_load = save_auto_load;
|
| ALL_OBJFILES (objfile)
|
| load_auto_scripts_for_objfile (objfile);
|
|
|
| - for (i = 0; i < ncmd; i++)
|
| + /* Process '-x' and '-ex' options. */
|
| + for (i = 0; VEC_iterate (cmdarg_s, cmdarg_vec, i, cmdarg_p); i++)
|
| + switch (cmdarg_p->type)
|
| {
|
| - if (cmdarg[i].type == CMDARG_FILE)
|
| - catch_command_errors (source_script, cmdarg[i].string,
|
| + case CMDARG_FILE:
|
| + catch_command_errors (source_script, cmdarg_p->string,
|
| !batch_flag, RETURN_MASK_ALL);
|
| - else /* cmdarg[i].type == CMDARG_COMMAND */
|
| - catch_command_errors (execute_command, cmdarg[i].string,
|
| + break;
|
| + case CMDARG_COMMAND:
|
| + catch_command_errors (execute_command, cmdarg_p->string,
|
| !batch_flag, RETURN_MASK_ALL);
|
| + break;
|
| }
|
| - xfree (cmdarg);
|
|
|
| /* Read in the old history after all the command files have been
|
| read. */
|
| @@ -989,6 +1046,8 @@ Options:\n\n\
|
| Execute a single GDB command.\n\
|
| May be used multiple times and in conjunction\n\
|
| with --command.\n\
|
| + --init-command=FILE, -ix Like -x but execute it before loading inferior.\n\
|
| + --init-eval-command=COMMAND, -iex Like -ex but before loading inferior.\n\
|
| --core=COREFILE Analyze the core dump COREFILE.\n\
|
| --pid=PID Attach to running process PID.\n\
|
| "), stream);
|
| @@ -1042,7 +1101,7 @@ At startup, GDB reads the following init files and executes their commands:\n\
|
| "), home_gdbinit);
|
| if (local_gdbinit)
|
| fprintf_unfiltered (stream, _("\
|
| - * local init file: ./%s\n\
|
| + * local init file (see also 'set auto-load local-gdbinit'): ./%s\n\
|
| "), local_gdbinit);
|
| fputs_unfiltered (_("\n\
|
| For more information, type \"help\" from within GDB, or consult the\n\
|
|
|