X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmain.c;h=3c9c26894c0e5e1eeeca48f17de8eda0a7841008;hb=8a5a3c829873c2ec9f0504afbb0b2704da39498a;hp=74208de753a7a92902309e5a6b9252d07da9bad6;hpb=021e7609055e94c3b2f0ac757c9640d393ed2000;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/main.c b/gdb/main.c index 74208de753..3c9c26894c 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -1,8 +1,8 @@ /* Top level stuff for GDB, the GNU debugger. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, - 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software - Foundation, Inc. + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. This file is part of GDB. @@ -28,6 +28,7 @@ #include "symfile.h" #include "gdbcore.h" +#include "exceptions.h" #include "getopt.h" #include @@ -49,12 +50,6 @@ int display_time; int display_space; -/* Whether this is the async version or not. The async version is - invoked on the command line with the -nw --async options. In this - version, the usual command_loop is substituted by and event loop which - processes UI events asynchronously. */ -int event_loop_p = 1; - /* The selected interpreter. This will be used as a set command variable, so it should always be malloc'ed - since do_setshow_command will free it. */ @@ -72,11 +67,20 @@ char *gdb_sysroot = 0; struct ui_file *gdb_stdout; struct ui_file *gdb_stderr; struct ui_file *gdb_stdlog; +struct ui_file *gdb_stdin; +/* target IO streams */ +struct ui_file *gdb_stdtargin; struct ui_file *gdb_stdtarg; +struct ui_file *gdb_stdtargerr; -/* Used to initialize error() - defined in utils.c */ +/* Support for the --batch-silent option. */ +int batch_silent = 0; -extern void error_init (void); +/* Support for --return-child-result option. + Set the default to -1 to return error in the case + that the program does not run or does not complete. */ +int return_child_result = 0; +int return_child_result_value = -1; /* Whether to enable writing into executable and core files */ extern int write_files; @@ -134,7 +138,13 @@ captured_main (void *data) static int print_version; /* Pointers to all arguments of --command option. */ - char **cmdarg; + struct cmdarg { + enum { + CMDARG_FILE, + CMDARG_COMMAND + } type; + char *string; + } *cmdarg; /* Allocated size of cmdarg. */ int cmdsize; /* Number of elements of cmdarg used. */ @@ -148,9 +158,9 @@ captured_main (void *data) int ndir; struct stat homebuf, cwdbuf; - char *homedir, *homeinit; + char *homedir; - register int i; + int i; long time_at_startup = get_run_time (); @@ -163,10 +173,9 @@ captured_main (void *data) bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); - START_PROGRESS (argv[0], 0); - - /* This needs to happen before the first use of malloc. */ - init_malloc (NULL); +#ifdef HAVE_SBRK + lim_at_start = (char *) sbrk (0); +#endif #if defined (ALIGN_STACK_ON_STARTUP) i = (int) &count & 0x3; @@ -175,7 +184,7 @@ captured_main (void *data) #endif cmdsize = 1; - cmdarg = (char **) xmalloc (cmdsize * sizeof (*cmdarg)); + cmdarg = (struct cmdarg *) xmalloc (cmdsize * sizeof (*cmdarg)); ncmd = 0; dirsize = 1; dirarg = (char **) xmalloc (dirsize * sizeof (*dirarg)); @@ -193,9 +202,9 @@ captured_main (void *data) gdb_stderr = stdio_fileopen (stderr); gdb_stdlog = gdb_stderr; /* for moment */ gdb_stdtarg = gdb_stderr; /* for moment */ - - /* initialize error() */ - error_init (); + gdb_stdin = stdio_fileopen (stdin); + gdb_stdtargerr = gdb_stderr; /* for moment */ + gdb_stdtargin = gdb_stdin; /* for moment */ /* Set the sysroot path. */ #ifdef TARGET_SYSTEM_ROOT_RELOCATABLE @@ -237,24 +246,30 @@ captured_main (void *data) /* When var field is 0, use flag field to record the equivalent short option (or arbitrary numbers starting at 10 for those with no equivalent). */ + enum { + OPT_SE = 10, + OPT_CD, + OPT_ANNOTATE, + OPT_STATISTICS, + OPT_TUI, + OPT_NOWINDOWS, + OPT_WINDOWS + }; static struct option long_options[] = { - {"async", no_argument, &event_loop_p, 1}, - {"noasync", no_argument, &event_loop_p, 0}, #if defined(TUI) - {"tui", no_argument, 0, 14}, + {"tui", no_argument, 0, OPT_TUI}, #endif {"xdb", no_argument, &xdb_commands, 1}, {"dbx", no_argument, &dbx_commands, 1}, {"readnow", no_argument, &readnow_symbol_files, 1}, {"r", no_argument, &readnow_symbol_files, 1}, - {"mapped", no_argument, &mapped_symbol_files, 1}, - {"m", no_argument, &mapped_symbol_files, 1}, {"quiet", no_argument, &quiet, 1}, {"q", no_argument, &quiet, 1}, {"silent", no_argument, &quiet, 1}, {"nx", no_argument, &inhibit_gdbinit, 1}, {"n", no_argument, &inhibit_gdbinit, 1}, + {"batch-silent", no_argument, 0, 'B'}, {"batch", no_argument, &batch, 1}, {"epoch", no_argument, &epoch_interface, 1}, @@ -264,9 +279,9 @@ captured_main (void *data) {"fullname", no_argument, 0, 'f'}, {"f", no_argument, 0, 'f'}, - {"annotate", required_argument, 0, 12}, + {"annotate", required_argument, 0, OPT_ANNOTATE}, {"help", no_argument, &print_help, 1}, - {"se", required_argument, 0, 10}, + {"se", required_argument, 0, OPT_SE}, {"symbols", required_argument, 0, 's'}, {"s", required_argument, 0, 's'}, {"exec", required_argument, 0, 'e'}, @@ -276,8 +291,10 @@ captured_main (void *data) {"pid", required_argument, 0, 'p'}, {"p", required_argument, 0, 'p'}, {"command", required_argument, 0, 'x'}, + {"eval-command", required_argument, 0, 'X'}, {"version", no_argument, &print_version, 1}, {"x", required_argument, 0, 'x'}, + {"ex", required_argument, 0, 'X'}, #ifdef GDBTK {"tclcommand", required_argument, 0, 'z'}, {"enable-external-editor", no_argument, 0, 'y'}, @@ -288,17 +305,19 @@ captured_main (void *data) {"i", required_argument, 0, 'i'}, {"directory", required_argument, 0, 'd'}, {"d", required_argument, 0, 'd'}, - {"cd", required_argument, 0, 11}, + {"cd", required_argument, 0, OPT_CD}, {"tty", required_argument, 0, 't'}, {"baud", required_argument, 0, 'b'}, {"b", required_argument, 0, 'b'}, - {"nw", no_argument, &use_windows, 0}, - {"nowindows", no_argument, &use_windows, 0}, - {"w", no_argument, &use_windows, 1}, - {"windows", no_argument, &use_windows, 1}, - {"statistics", no_argument, 0, 13}, + {"nw", no_argument, NULL, OPT_NOWINDOWS}, + {"nowindows", no_argument, NULL, OPT_NOWINDOWS}, + {"w", no_argument, NULL, OPT_WINDOWS}, + {"windows", no_argument, NULL, OPT_WINDOWS}, + {"statistics", no_argument, 0, OPT_STATISTICS}, {"write", no_argument, &write_files, 1}, {"args", no_argument, &set_args, 1}, + {"l", required_argument, 0, 'l'}, + {"return-child-result", no_argument, &return_child_result, 1}, {0, no_argument, 0, 0} }; @@ -320,26 +339,42 @@ captured_main (void *data) case 0: /* Long option that just sets a flag. */ break; - case 10: + case OPT_SE: symarg = optarg; execarg = optarg; break; - case 11: + case OPT_CD: cdarg = optarg; break; - case 12: + case OPT_ANNOTATE: /* FIXME: what if the syntax is wrong (e.g. not digits)? */ annotation_level = atoi (optarg); break; - case 13: + case OPT_STATISTICS: /* Enable the display of both time and space usage. */ display_time = 1; display_space = 1; break; - case 14: + case OPT_TUI: /* --tui is equivalent to -i=tui. */ xfree (interpreter_p); - interpreter_p = xstrdup ("tui"); + interpreter_p = xstrdup (INTERP_TUI); + break; + case OPT_WINDOWS: + /* FIXME: cagney/2003-03-01: Not sure if this option is + actually useful, and if it is, what it should do. */ +#ifdef GDBTK + /* --windows is equivalent to -i=insight. */ + xfree (interpreter_p); + interpreter_p = xstrdup (INTERP_INSIGHT); +#endif + use_windows = 1; + break; + case OPT_NOWINDOWS: + /* -nw is equivalent to -i=console. */ + xfree (interpreter_p); + interpreter_p = xstrdup (INTERP_CONSOLE); + use_windows = 0; break; case 'f': annotation_level = 1; @@ -360,14 +395,29 @@ captured_main (void *data) corearg = optarg; break; case 'x': - cmdarg[ncmd++] = optarg; + cmdarg[ncmd].type = CMDARG_FILE; + cmdarg[ncmd++].string = optarg; + if (ncmd >= cmdsize) + { + cmdsize *= 2; + cmdarg = xrealloc ((char *) cmdarg, + cmdsize * sizeof (*cmdarg)); + } + break; + case 'X': + cmdarg[ncmd].type = CMDARG_COMMAND; + cmdarg[ncmd++].string = optarg; if (ncmd >= cmdsize) { cmdsize *= 2; - cmdarg = (char **) xrealloc ((char *) cmdarg, - cmdsize * sizeof (*cmdarg)); + cmdarg = xrealloc ((char *) cmdarg, + cmdsize * sizeof (*cmdarg)); } break; + case 'B': + batch = batch_silent = 1; + gdb_stdout = ui_file_new(); + break; #ifdef GDBTK case 'z': { @@ -504,7 +554,7 @@ extern int gdbtk_test (char *); } /* Initialize all files. Give the interpreter a chance to take - control of the console via the init_ui_hook()) */ + control of the console via the deprecated_init_ui_hook (). */ gdb_init (argv[0]); /* Do these (and anything which might call wrap_here or *_filtered) @@ -550,11 +600,7 @@ extern int gdbtk_test (char *); /* Find it. */ struct interp *interp = interp_lookup (interpreter_p); if (interp == NULL) - { - fprintf_unfiltered (gdb_stderr, "Interpreter `%s' unrecognized.\n", - interpreter_p); - exit (1); - } + error (_("Interpreter `%s' unrecognized"), interpreter_p); /* Install it. */ if (!interp_set (interp)) { @@ -593,11 +639,7 @@ extern int gdbtk_test (char *); homedir = getenv ("HOME"); if (homedir) { - homeinit = (char *) alloca (strlen (homedir) + - strlen (gdbinit) + 10); - strcpy (homeinit, homedir); - strcat (homeinit, "/"); - strcat (homeinit, gdbinit); + char *homeinit = xstrprintf ("%s/%s", homedir, gdbinit); if (!inhibit_gdbinit) { @@ -615,6 +657,7 @@ extern int gdbtk_test (char *); stat (homeinit, &homebuf); stat (gdbinit, &cwdbuf); /* We'll only need this if homedir was set. */ + xfree (homeinit); } /* Now perform all the actions indicated by the arguments. */ @@ -709,7 +752,12 @@ extern int gdbtk_test (char *); do_cleanups (ALL_CLEANUPS); } #endif - catch_command_errors (source_command, cmdarg[i], !batch, RETURN_MASK_ALL); + if (cmdarg[i].type == CMDARG_FILE) + catch_command_errors (source_command, cmdarg[i].string, + !batch, RETURN_MASK_ALL); + else /* cmdarg[i].type == CMDARG_COMMAND */ + catch_command_errors (execute_command, cmdarg[i].string, + !batch, RETURN_MASK_ALL); } xfree (cmdarg); @@ -719,7 +767,7 @@ extern int gdbtk_test (char *); if (batch) { /* We have hit the end of the batch file. */ - exit (0); + quit_force (NULL, 0); } /* Do any host- or target-specific hacks. This is used for i960 targets @@ -729,8 +777,6 @@ extern int gdbtk_test (char *); BEFORE_MAIN_LOOP_HOOK; #endif - END_PROGRESS (argv[0]); - /* Show time and/or space usage. */ if (display_time) @@ -759,13 +805,13 @@ extern int gdbtk_test (char *); if (!SET_TOP_LEVEL ()) { do_cleanups (ALL_CLEANUPS); /* Do complete cleanup */ - /* GUIs generally have their own command loop, mainloop, or whatever. - This is a good place to gain control because many error - conditions will end up here via longjmp(). */ - if (command_loop_hook) - command_loop_hook (); + /* GUIs generally have their own command loop, mainloop, or + whatever. This is a good place to gain control because + many error conditions will end up here via longjmp(). */ + if (deprecated_command_loop_hook) + deprecated_command_loop_hook (); else - command_loop (); + deprecated_command_loop (); quit_command ((char *) 0, instream == stdin); } } @@ -795,7 +841,9 @@ gdb_main (struct captured_main_args *args) { use_windows = args->use_windows; catch_errors (captured_main, args, "", RETURN_MASK_ALL); - return 0; + /* The only way to end up here is by an error (normal exit is + handled by quit_force()), hence always return an error status. */ + return 1; } @@ -814,15 +862,19 @@ Options:\n\n\ "), stream); fputs_unfiltered (_("\ --args Arguments after executable-file are passed to inferior\n\ -"), stream); - fputs_unfiltered (_("\ - --[no]async Enable (disable) asynchronous version of CLI\n\ "), stream); fputs_unfiltered (_("\ -b BAUDRATE Set serial port baud rate used for remote debugging.\n\ --batch Exit after processing options.\n\ + --batch-silent As for --batch, but suppress all gdb stdout output.\n\ + --return-child-result\n\ + GDB exit code will be the child's exit code.\n\ --cd=DIR Change current directory to DIR.\n\ - --command=FILE Execute GDB commands from FILE.\n\ + --command=FILE, -x Execute GDB commands from FILE.\n\ + --eval-command=COMMAND, -ex\n\ + Execute a single GDB command.\n\ + May be used multiple times and in conjunction\n\ + with --command.\n\ --core=COREFILE Analyze the core dump COREFILE.\n\ --pid=PID Attach to running process PID.\n\ "), stream); @@ -839,7 +891,7 @@ Options:\n\n\ Select a specific interpreter / user interface\n\ "), stream); fputs_unfiltered (_("\ - --mapped Use mapped symbol files if supported on this system.\n\ + -l TIMEOUT Set timeout in seconds for remote debugging.\n\ --nw Do not use a window interface.\n\ --nx Do not read "), stream); fputs_unfiltered (gdbinit, stream);