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