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