2003-03-01 Andrew Cagney <cagney@redhat.com>
[external/binutils.git] / gdb / main.c
1 /* Top level stuff for GDB, the GNU debugger.
2
3    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
4    1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
5    Foundation, Inc.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 59 Temple Place - Suite 330,
22    Boston, MA 02111-1307, USA.  */
23
24 #include "defs.h"
25 #include "top.h"
26 #include "target.h"
27 #include "inferior.h"
28 #include "symfile.h"
29 #include "gdbcore.h"
30
31 #include "getopt.h"
32
33 #include <sys/types.h>
34 #include "gdb_stat.h"
35 #include <ctype.h>
36
37 #include "gdb_string.h"
38 #include "event-loop.h"
39 #include "ui-out.h"
40
41 #include "interps.h"
42 #include "main.h"
43
44 /* If nonzero, display time usage both at startup and for each command.  */
45
46 int display_time;
47
48 /* If nonzero, display space usage both at startup and for each command.  */
49
50 int display_space;
51
52 /* Whether this is the async version or not.  The async version is
53    invoked on the command line with the -nw --async options.  In this
54    version, the usual command_loop is substituted by and event loop which
55    processes UI events asynchronously. */
56 int event_loop_p = 1;
57
58 /* The selected interpreter.  This will be used as a set command
59    variable, so it should always be malloc'ed - since
60    do_setshow_command will free it. */
61 char *interpreter_p;
62
63 /* Whether xdb commands will be handled */
64 int xdb_commands = 0;
65
66 /* Whether dbx commands will be handled */
67 int dbx_commands = 0;
68
69 /* System root path, used to find libraries etc.  */
70 char *gdb_sysroot = 0;
71
72 struct ui_file *gdb_stdout;
73 struct ui_file *gdb_stderr;
74 struct ui_file *gdb_stdlog;
75 struct ui_file *gdb_stdtarg;
76
77 /* Used to initialize error() - defined in utils.c */
78
79 extern void error_init (void);
80
81 /* Whether to enable writing into executable and core files */
82 extern int write_files;
83
84 static void print_gdb_help (struct ui_file *);
85
86 /* These two are used to set the external editor commands when gdb is farming
87    out files to be edited by another program. */
88
89 extern char *external_editor_command;
90
91 /* Call command_loop.  If it happens to return, pass that through as a
92    non-zero return status. */
93
94 static int
95 captured_command_loop (void *data)
96 {
97   current_interp_command_loop ();
98   /* FIXME: cagney/1999-11-05: A correct command_loop() implementaton
99      would clean things up (restoring the cleanup chain) to the state
100      they were just prior to the call.  Technically, this means that
101      the do_cleanups() below is redundant.  Unfortunately, many FUNCs
102      are not that well behaved.  do_cleanups should either be replaced
103      with a do_cleanups call (to cover the problem) or an assertion
104      check to detect bad FUNCs code. */
105   do_cleanups (ALL_CLEANUPS);
106   /* If the command_loop returned, normally (rather than threw an
107      error) we try to quit. If the quit is aborted, catch_errors()
108      which called this catch the signal and restart the command
109      loop. */
110   quit_command (NULL, instream == stdin);
111   return 1;
112 }
113
114 static int
115 captured_main (void *data)
116 {
117   struct captured_main_args *context = data;
118   int argc = context->argc;
119   char **argv = context->argv;
120   int count;
121   static int quiet = 0;
122   static int batch = 0;
123   static int set_args = 0;
124
125   /* Pointers to various arguments from command line.  */
126   char *symarg = NULL;
127   char *execarg = NULL;
128   char *corearg = NULL;
129   char *cdarg = NULL;
130   char *ttyarg = NULL;
131
132   /* These are static so that we can take their address in an initializer.  */
133   static int print_help;
134   static int print_version;
135
136   /* Pointers to all arguments of --command option.  */
137   char **cmdarg;
138   /* Allocated size of cmdarg.  */
139   int cmdsize;
140   /* Number of elements of cmdarg used.  */
141   int ncmd;
142
143   /* Indices of all arguments of --directory option.  */
144   char **dirarg;
145   /* Allocated size.  */
146   int dirsize;
147   /* Number of elements used.  */
148   int ndir;
149
150   struct stat homebuf, cwdbuf;
151   char *homedir, *homeinit;
152
153   register int i;
154
155   long time_at_startup = get_run_time ();
156
157 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
158   setlocale (LC_MESSAGES, "");
159 #endif
160 #if defined (HAVE_SETLOCALE)
161   setlocale (LC_CTYPE, "");
162 #endif
163   bindtextdomain (PACKAGE, LOCALEDIR);
164   textdomain (PACKAGE);
165
166   START_PROGRESS (argv[0], 0);
167
168   /* This needs to happen before the first use of malloc.  */
169   init_malloc (NULL);
170
171 #if defined (ALIGN_STACK_ON_STARTUP)
172   i = (int) &count & 0x3;
173   if (i != 0)
174     alloca (4 - i);
175 #endif
176
177   cmdsize = 1;
178   cmdarg = (char **) xmalloc (cmdsize * sizeof (*cmdarg));
179   ncmd = 0;
180   dirsize = 1;
181   dirarg = (char **) xmalloc (dirsize * sizeof (*dirarg));
182   ndir = 0;
183
184   quit_flag = 0;
185   line = (char *) xmalloc (linesize);
186   line[0] = '\0';               /* Terminate saved (now empty) cmd line */
187   instream = stdin;
188
189   getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
190   current_directory = gdb_dirbuf;
191
192   gdb_stdout = stdio_fileopen (stdout);
193   gdb_stderr = stdio_fileopen (stderr);
194   gdb_stdlog = gdb_stderr;      /* for moment */
195   gdb_stdtarg = gdb_stderr;     /* for moment */
196
197   /* initialize error() */
198   error_init ();
199
200   /* Set the sysroot path.  */
201 #ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
202   gdb_sysroot = make_relative_prefix (argv[0], BINDIR, TARGET_SYSTEM_ROOT);
203   if (gdb_sysroot)
204     {
205       struct stat s;
206       int res = 0;
207
208       if (stat (gdb_sysroot, &s) == 0)
209         if (S_ISDIR (s.st_mode))
210           res = 1;
211
212       if (res == 0)
213         {
214           xfree (gdb_sysroot);
215           gdb_sysroot = TARGET_SYSTEM_ROOT;
216         }
217     }
218   else
219     gdb_sysroot = TARGET_SYSTEM_ROOT;
220 #else
221 #if defined (TARGET_SYSTEM_ROOT)
222   gdb_sysroot = TARGET_SYSTEM_ROOT;
223 #else
224   gdb_sysroot = "";
225 #endif
226 #endif
227
228   /* There will always be an interpreter.  Either the one passed into
229      this captured main, or one specified by the user at start up, or
230      the console.  Initialize the interpreter to the one requested by 
231      the application.  */
232   interpreter_p = xstrdup (context->interpreter_p);
233
234   /* Parse arguments and options.  */
235   {
236     int c;
237     /* When var field is 0, use flag field to record the equivalent
238        short option (or arbitrary numbers starting at 10 for those
239        with no equivalent).  */
240     enum {
241       OPT_SE = 10,
242       OPT_CD,
243       OPT_ANNOTATE,
244       OPT_STATISTICS,
245       OPT_TUI,
246       OPT_NOWINDOWS,
247       OPT_WINDOWS
248     };
249     static struct option long_options[] =
250     {
251       {"async", no_argument, &event_loop_p, 1},
252       {"noasync", no_argument, &event_loop_p, 0},
253 #if defined(TUI)
254       {"tui", no_argument, 0, OPT_TUI},
255 #endif
256       {"xdb", no_argument, &xdb_commands, 1},
257       {"dbx", no_argument, &dbx_commands, 1},
258       {"readnow", no_argument, &readnow_symbol_files, 1},
259       {"r", no_argument, &readnow_symbol_files, 1},
260       {"mapped", no_argument, &mapped_symbol_files, 1},
261       {"m", no_argument, &mapped_symbol_files, 1},
262       {"quiet", no_argument, &quiet, 1},
263       {"q", no_argument, &quiet, 1},
264       {"silent", no_argument, &quiet, 1},
265       {"nx", no_argument, &inhibit_gdbinit, 1},
266       {"n", no_argument, &inhibit_gdbinit, 1},
267       {"batch", no_argument, &batch, 1},
268       {"epoch", no_argument, &epoch_interface, 1},
269
270     /* This is a synonym for "--annotate=1".  --annotate is now preferred,
271        but keep this here for a long time because people will be running
272        emacses which use --fullname.  */
273       {"fullname", no_argument, 0, 'f'},
274       {"f", no_argument, 0, 'f'},
275
276       {"annotate", required_argument, 0, OPT_ANNOTATE},
277       {"help", no_argument, &print_help, 1},
278       {"se", required_argument, 0, OPT_SE},
279       {"symbols", required_argument, 0, 's'},
280       {"s", required_argument, 0, 's'},
281       {"exec", required_argument, 0, 'e'},
282       {"e", required_argument, 0, 'e'},
283       {"core", required_argument, 0, 'c'},
284       {"c", required_argument, 0, 'c'},
285       {"pid", required_argument, 0, 'p'},
286       {"p", required_argument, 0, 'p'},
287       {"command", required_argument, 0, 'x'},
288       {"version", no_argument, &print_version, 1},
289       {"x", required_argument, 0, 'x'},
290 #ifdef GDBTK
291       {"tclcommand", required_argument, 0, 'z'},
292       {"enable-external-editor", no_argument, 0, 'y'},
293       {"editor-command", required_argument, 0, 'w'},
294 #endif
295       {"ui", required_argument, 0, 'i'},
296       {"interpreter", required_argument, 0, 'i'},
297       {"i", required_argument, 0, 'i'},
298       {"directory", required_argument, 0, 'd'},
299       {"d", required_argument, 0, 'd'},
300       {"cd", required_argument, 0, OPT_CD},
301       {"tty", required_argument, 0, 't'},
302       {"baud", required_argument, 0, 'b'},
303       {"b", required_argument, 0, 'b'},
304       {"nw", no_argument, NULL, OPT_NOWINDOWS},
305       {"nowindows", no_argument, NULL, OPT_NOWINDOWS},
306       {"w", no_argument, NULL, OPT_WINDOWS},
307       {"windows", no_argument, NULL, OPT_WINDOWS},
308       {"statistics", no_argument, 0, OPT_STATISTICS},
309       {"write", no_argument, &write_files, 1},
310       {"args", no_argument, &set_args, 1},
311       {0, no_argument, 0, 0}
312     };
313
314     while (1)
315       {
316         int option_index;
317
318         c = getopt_long_only (argc, argv, "",
319                               long_options, &option_index);
320         if (c == EOF || set_args)
321           break;
322
323         /* Long option that takes an argument.  */
324         if (c == 0 && long_options[option_index].flag == 0)
325           c = long_options[option_index].val;
326
327         switch (c)
328           {
329           case 0:
330             /* Long option that just sets a flag.  */
331             break;
332           case OPT_SE:
333             symarg = optarg;
334             execarg = optarg;
335             break;
336           case OPT_CD:
337             cdarg = optarg;
338             break;
339           case OPT_ANNOTATE:
340             /* FIXME: what if the syntax is wrong (e.g. not digits)?  */
341             annotation_level = atoi (optarg);
342             break;
343           case OPT_STATISTICS:
344             /* Enable the display of both time and space usage.  */
345             display_time = 1;
346             display_space = 1;
347             break;
348           case OPT_TUI:
349             /* --tui is equivalent to -i=tui.  */
350             xfree (interpreter_p);
351             interpreter_p = xstrdup ("tui");
352             break;
353           case OPT_WINDOWS:
354             /* FIXME: cagney/2003-03-01: Not sure if this option is
355                actually useful, and if it is, what it should do.  */
356             use_windows = 1;
357             break;
358           case OPT_NOWINDOWS:
359             /* -nw is equivalent to -i=console.  */
360             xfree (interpreter_p);
361             interpreter_p = xstrdup (INTERP_CONSOLE);
362             use_windows = 0;
363             break;
364           case 'f':
365             annotation_level = 1;
366 /* We have probably been invoked from emacs.  Disable window interface.  */
367             use_windows = 0;
368             break;
369           case 's':
370             symarg = optarg;
371             break;
372           case 'e':
373             execarg = optarg;
374             break;
375           case 'c':
376             corearg = optarg;
377             break;
378           case 'p':
379             /* "corearg" is shared by "--core" and "--pid" */
380             corearg = optarg;
381             break;
382           case 'x':
383             cmdarg[ncmd++] = optarg;
384             if (ncmd >= cmdsize)
385               {
386                 cmdsize *= 2;
387                 cmdarg = (char **) xrealloc ((char *) cmdarg,
388                                              cmdsize * sizeof (*cmdarg));
389               }
390             break;
391 #ifdef GDBTK
392           case 'z':
393             {
394 extern int gdbtk_test (char *);
395               if (!gdbtk_test (optarg))
396                 {
397                   fprintf_unfiltered (gdb_stderr, _("%s: unable to load tclcommand file \"%s\""),
398                                       argv[0], optarg);
399                   exit (1);
400                 }
401               break;
402             }
403           case 'y':
404             /* Backwards compatibility only.  */
405             break;
406           case 'w':
407             {
408               external_editor_command = xstrdup (optarg);
409               break;
410             }
411 #endif /* GDBTK */
412           case 'i':
413             xfree (interpreter_p);
414             interpreter_p = xstrdup (optarg);
415             break;
416           case 'd':
417             dirarg[ndir++] = optarg;
418             if (ndir >= dirsize)
419               {
420                 dirsize *= 2;
421                 dirarg = (char **) xrealloc ((char *) dirarg,
422                                              dirsize * sizeof (*dirarg));
423               }
424             break;
425           case 't':
426             ttyarg = optarg;
427             break;
428           case 'q':
429             quiet = 1;
430             break;
431           case 'b':
432             {
433               int i;
434               char *p;
435
436               i = strtol (optarg, &p, 0);
437               if (i == 0 && p == optarg)
438
439                 /* Don't use *_filtered or warning() (which relies on
440                    current_target) until after initialize_all_files(). */
441
442                 fprintf_unfiltered
443                   (gdb_stderr,
444                    _("warning: could not set baud rate to `%s'.\n"), optarg);
445               else
446                 baud_rate = i;
447             }
448             break;
449           case 'l':
450             {
451               int i;
452               char *p;
453
454               i = strtol (optarg, &p, 0);
455               if (i == 0 && p == optarg)
456
457                 /* Don't use *_filtered or warning() (which relies on
458                    current_target) until after initialize_all_files(). */
459
460                 fprintf_unfiltered
461                   (gdb_stderr,
462                  _("warning: could not set timeout limit to `%s'.\n"), optarg);
463               else
464                 remote_timeout = i;
465             }
466             break;
467
468           case '?':
469             fprintf_unfiltered (gdb_stderr,
470                         _("Use `%s --help' for a complete list of options.\n"),
471                                 argv[0]);
472             exit (1);
473           }
474       }
475
476     /* If --help or --version, disable window interface.  */
477     if (print_help || print_version)
478       {
479         use_windows = 0;
480       }
481
482     if (set_args)
483       {
484         /* The remaining options are the command-line options for the
485            inferior.  The first one is the sym/exec file, and the rest
486            are arguments.  */
487         if (optind >= argc)
488           {
489             fprintf_unfiltered (gdb_stderr,
490                                 _("%s: `--args' specified but no program specified\n"),
491                                 argv[0]);
492             exit (1);
493           }
494         symarg = argv[optind];
495         execarg = argv[optind];
496         ++optind;
497         set_inferior_args_vector (argc - optind, &argv[optind]);
498       }
499     else
500       {
501         /* OK, that's all the options.  The other arguments are filenames.  */
502         count = 0;
503         for (; optind < argc; optind++)
504           switch (++count)
505             {
506             case 1:
507               symarg = argv[optind];
508               execarg = argv[optind];
509               break;
510             case 2:
511               /* The documentation says this can be a "ProcID" as well. 
512                  We will try it as both a corefile and a pid.  */
513               corearg = argv[optind];
514               break;
515             case 3:
516               fprintf_unfiltered (gdb_stderr,
517                                   _("Excess command line arguments ignored. (%s%s)\n"),
518                                   argv[optind], (optind == argc - 1) ? "" : " ...");
519               break;
520             }
521       }
522     if (batch)
523       quiet = 1;
524   }
525
526   /* Initialize all files.  Give the interpreter a chance to take
527      control of the console via the init_ui_hook()) */
528   gdb_init (argv[0]);
529
530   /* Do these (and anything which might call wrap_here or *_filtered)
531      after initialize_all_files() but before the interpreter has been
532      installed.  Otherwize the help/version messages will be eaten by
533      the interpreter's output handler.  */
534
535   if (print_version)
536     {
537       print_gdb_version (gdb_stdout);
538       wrap_here ("");
539       printf_filtered ("\n");
540       exit (0);
541     }
542
543   if (print_help)
544     {
545       print_gdb_help (gdb_stdout);
546       fputs_unfiltered ("\n", gdb_stdout);
547       exit (0);
548     }
549
550   /* FIXME: cagney/2003-02-03: The big hack (part 1 of 2) that lets
551      GDB retain the old MI1 interpreter startup behavior.  Output the
552      copyright message before the interpreter is installed.  That way
553      it isn't encapsulated in MI output.  */
554   if (!quiet && strcmp (interpreter_p, INTERP_MI1) == 0)
555     {
556       /* Print all the junk at the top, with trailing "..." if we are about
557          to read a symbol file (possibly slowly).  */
558       print_gdb_version (gdb_stdout);
559       if (symarg)
560         printf_filtered ("..");
561       wrap_here ("");
562       gdb_flush (gdb_stdout);   /* Force to screen during slow operations */
563     }
564
565
566   /* Install the default UI.  All the interpreters should have had a
567      look at things by now.  Initialize the default interpreter. */
568
569   {
570     /* Find it.  */
571     struct interp *interp = interp_lookup (interpreter_p);
572     if (interp == NULL)
573       {
574         fprintf_unfiltered (gdb_stderr, "Interpreter `%s' unrecognized.\n",
575                             interpreter_p);
576         exit (1);
577       }
578     /* Install it.  */
579     if (!interp_set (interp))
580       {
581         fprintf_unfiltered (gdb_stderr,
582                             "Interpreter `%s' failed to initialize.\n",
583                             interpreter_p);
584         exit (1);
585       }
586   }
587
588   /* FIXME: cagney/2003-02-03: The big hack (part 2 of 2) that lets
589      GDB retain the old MI1 interpreter startup behavior.  Output the
590      copyright message after the interpreter is installed when it is
591      any sane interpreter.  */
592   if (!quiet && !current_interp_named_p (INTERP_MI1))
593     {
594       /* Print all the junk at the top, with trailing "..." if we are about
595          to read a symbol file (possibly slowly).  */
596       print_gdb_version (gdb_stdout);
597       if (symarg)
598         printf_filtered ("..");
599       wrap_here ("");
600       gdb_flush (gdb_stdout);   /* Force to screen during slow operations */
601     }
602
603   error_pre_print = "\n\n";
604   quit_pre_print = error_pre_print;
605
606   /* We may get more than one warning, don't double space all of them... */
607   warning_pre_print = _("\nwarning: ");
608
609   /* Read and execute $HOME/.gdbinit file, if it exists.  This is done
610      *before* all the command line arguments are processed; it sets
611      global parameters, which are independent of what file you are
612      debugging or what directory you are in.  */
613   homedir = getenv ("HOME");
614   if (homedir)
615     {
616       homeinit = (char *) alloca (strlen (homedir) +
617                                   strlen (gdbinit) + 10);
618       strcpy (homeinit, homedir);
619       strcat (homeinit, "/");
620       strcat (homeinit, gdbinit);
621
622       if (!inhibit_gdbinit)
623         {
624           catch_command_errors (source_command, homeinit, 0, RETURN_MASK_ALL);
625         }
626
627       /* Do stats; no need to do them elsewhere since we'll only
628          need them if homedir is set.  Make sure that they are
629          zero in case one of them fails (this guarantees that they
630          won't match if either exists).  */
631
632       memset (&homebuf, 0, sizeof (struct stat));
633       memset (&cwdbuf, 0, sizeof (struct stat));
634
635       stat (homeinit, &homebuf);
636       stat (gdbinit, &cwdbuf);  /* We'll only need this if
637                                    homedir was set.  */
638     }
639
640   /* Now perform all the actions indicated by the arguments.  */
641   if (cdarg != NULL)
642     {
643       catch_command_errors (cd_command, cdarg, 0, RETURN_MASK_ALL);
644     }
645
646   for (i = 0; i < ndir; i++)
647     catch_command_errors (directory_command, dirarg[i], 0, RETURN_MASK_ALL);
648   xfree (dirarg);
649
650   if (execarg != NULL
651       && symarg != NULL
652       && strcmp (execarg, symarg) == 0)
653     {
654       /* The exec file and the symbol-file are the same.  If we can't
655          open it, better only print one error message.
656          catch_command_errors returns non-zero on success! */
657       if (catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL))
658         catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
659     }
660   else
661     {
662       if (execarg != NULL)
663         catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL);
664       if (symarg != NULL)
665         catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
666     }
667
668   /* After the symbol file has been read, print a newline to get us
669      beyond the copyright line...  But errors should still set off
670      the error message with a (single) blank line.  */
671   if (!quiet)
672     printf_filtered ("\n");
673   error_pre_print = "\n";
674   quit_pre_print = error_pre_print;
675   warning_pre_print = _("\nwarning: ");
676
677   if (corearg != NULL)
678     {
679       /* corearg may be either a corefile or a pid.
680          If its first character is a digit, try attach first
681          and then corefile.  Otherwise try corefile first. */
682
683       if (isdigit (corearg[0]))
684         {
685           if (catch_command_errors (attach_command, corearg, 
686                                     !batch, RETURN_MASK_ALL) == 0)
687             catch_command_errors (core_file_command, corearg, 
688                                   !batch, RETURN_MASK_ALL);
689         }
690       else /* Can't be a pid, better be a corefile. */
691         catch_command_errors (core_file_command, corearg, 
692                               !batch, RETURN_MASK_ALL);
693     }
694
695   if (ttyarg != NULL)
696     catch_command_errors (tty_command, ttyarg, !batch, RETURN_MASK_ALL);
697
698   /* Error messages should no longer be distinguished with extra output. */
699   error_pre_print = NULL;
700   quit_pre_print = NULL;
701   warning_pre_print = _("warning: ");
702
703   /* Read the .gdbinit file in the current directory, *if* it isn't
704      the same as the $HOME/.gdbinit file (it should exist, also).  */
705
706   if (!homedir
707       || memcmp ((char *) &homebuf, (char *) &cwdbuf, sizeof (struct stat)))
708     if (!inhibit_gdbinit)
709       {
710         catch_command_errors (source_command, gdbinit, 0, RETURN_MASK_ALL);
711       }
712
713   for (i = 0; i < ncmd; i++)
714     {
715 #if 0
716       /* NOTE: cagney/1999-11-03: SET_TOP_LEVEL() was a macro that
717          expanded into a call to setjmp().  */
718       if (!SET_TOP_LEVEL ()) /* NB: This is #if 0'd out */
719         {
720           /* NOTE: I am commenting this out, because it is not clear
721              where this feature is used. It is very old and
722              undocumented. ezannoni: 1999-05-04 */
723 #if 0
724           if (cmdarg[i][0] == '-' && cmdarg[i][1] == '\0')
725             read_command_file (stdin);
726           else
727 #endif
728             source_command (cmdarg[i], !batch);
729           do_cleanups (ALL_CLEANUPS);
730         }
731 #endif
732       catch_command_errors (source_command, cmdarg[i], !batch, RETURN_MASK_ALL);
733     }
734   xfree (cmdarg);
735
736   /* Read in the old history after all the command files have been read. */
737   init_history ();
738
739   if (batch)
740     {
741       /* We have hit the end of the batch file.  */
742       exit (0);
743     }
744
745   /* Do any host- or target-specific hacks.  This is used for i960 targets
746      to force the user to set a nindy target and spec its parameters.  */
747
748 #ifdef BEFORE_MAIN_LOOP_HOOK
749   BEFORE_MAIN_LOOP_HOOK;
750 #endif
751
752   END_PROGRESS (argv[0]);
753
754   /* Show time and/or space usage.  */
755
756   if (display_time)
757     {
758       long init_time = get_run_time () - time_at_startup;
759
760       printf_unfiltered (_("Startup time: %ld.%06ld\n"),
761                          init_time / 1000000, init_time % 1000000);
762     }
763
764   if (display_space)
765     {
766 #ifdef HAVE_SBRK
767       extern char **environ;
768       char *lim = (char *) sbrk (0);
769
770       printf_unfiltered (_("Startup size: data size %ld\n"),
771                          (long) (lim - (char *) &environ));
772 #endif
773     }
774
775 #if 0
776   /* FIXME: cagney/1999-11-06: The original main loop was like: */
777   while (1)
778     {
779       if (!SET_TOP_LEVEL ())
780         {
781           do_cleanups (ALL_CLEANUPS);   /* Do complete cleanup */
782           /* GUIs generally have their own command loop, mainloop, or whatever.
783              This is a good place to gain control because many error
784              conditions will end up here via longjmp(). */
785           if (command_loop_hook)
786             command_loop_hook ();
787           else
788             command_loop ();
789           quit_command ((char *) 0, instream == stdin);
790         }
791     }
792   /* NOTE: If the command_loop() returned normally, the loop would
793      attempt to exit by calling the function quit_command().  That
794      function would either call exit() or throw an error returning
795      control to SET_TOP_LEVEL. */
796   /* NOTE: The function do_cleanups() was called once each time round
797      the loop.  The usefulness of the call isn't clear.  If an error
798      was thrown, everything would have already been cleaned up.  If
799      command_loop() returned normally and quit_command() was called,
800      either exit() or error() (again cleaning up) would be called. */
801 #endif
802   /* NOTE: cagney/1999-11-07: There is probably no reason for not
803      moving this loop and the code found in captured_command_loop()
804      into the command_loop() proper.  The main thing holding back that
805      change - SET_TOP_LEVEL() - has been eliminated. */
806   while (1)
807     {
808       catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL);
809     }
810   /* No exit -- exit is through quit_command.  */
811 }
812
813 int
814 gdb_main (struct captured_main_args *args)
815 {
816   use_windows = args->use_windows;
817   catch_errors (captured_main, args, "", RETURN_MASK_ALL);
818   return 0;
819 }
820
821
822 /* Don't use *_filtered for printing help.  We don't want to prompt
823    for continue no matter how small the screen or how much we're going
824    to print.  */
825
826 static void
827 print_gdb_help (struct ui_file *stream)
828 {
829   fputs_unfiltered (_("\
830 This is the GNU debugger.  Usage:\n\n\
831     gdb [options] [executable-file [core-file or process-id]]\n\
832     gdb [options] --args executable-file [inferior-arguments ...]\n\n\
833 Options:\n\n\
834 "), stream);
835   fputs_unfiltered (_("\
836   --args             Arguments after executable-file are passed to inferior\n\
837 "), stream);
838   fputs_unfiltered (_("\
839   --[no]async        Enable (disable) asynchronous version of CLI\n\
840 "), stream);
841   fputs_unfiltered (_("\
842   -b BAUDRATE        Set serial port baud rate used for remote debugging.\n\
843   --batch            Exit after processing options.\n\
844   --cd=DIR           Change current directory to DIR.\n\
845   --command=FILE     Execute GDB commands from FILE.\n\
846   --core=COREFILE    Analyze the core dump COREFILE.\n\
847   --pid=PID          Attach to running process PID.\n\
848 "), stream);
849   fputs_unfiltered (_("\
850   --dbx              DBX compatibility mode.\n\
851   --directory=DIR    Search for source files in DIR.\n\
852   --epoch            Output information used by epoch emacs-GDB interface.\n\
853   --exec=EXECFILE    Use EXECFILE as the executable.\n\
854   --fullname         Output information used by emacs-GDB interface.\n\
855   --help             Print this message.\n\
856 "), stream);
857   fputs_unfiltered (_("\
858   --interpreter=INTERP\n\
859                      Select a specific interpreter / user interface\n\
860 "), stream);
861   fputs_unfiltered (_("\
862   --mapped           Use mapped symbol files if supported on this system.\n\
863   --nw               Do not use a window interface.\n\
864   --nx               Do not read "), stream);
865   fputs_unfiltered (gdbinit, stream);
866   fputs_unfiltered (_(" file.\n\
867   --quiet            Do not print version number on startup.\n\
868   --readnow          Fully read symbol files on first access.\n\
869 "), stream);
870   fputs_unfiltered (_("\
871   --se=FILE          Use FILE as symbol file and executable file.\n\
872   --symbols=SYMFILE  Read symbols from SYMFILE.\n\
873   --tty=TTY          Use TTY for input/output by the program being debugged.\n\
874 "), stream);
875 #if defined(TUI)
876   fputs_unfiltered (_("\
877   --tui              Use a terminal user interface.\n\
878 "), stream);
879 #endif
880   fputs_unfiltered (_("\
881   --version          Print version information and then exit.\n\
882   -w                 Use a window interface.\n\
883   --write            Set writing into executable and core files.\n\
884   --xdb              XDB compatibility mode.\n\
885 "), stream);
886   fputs_unfiltered (_("\n\
887 For more information, type \"help\" from within GDB, or consult the\n\
888 GDB manual (available as on-line info or a printed manual).\n\
889 Report bugs to \"bug-gdb@gnu.org\".\
890 "), stream);
891 }