X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmain.c;h=540738e543d5e0b77126a7d2bd04ce2b72ae0254;hb=268a13a5a3f7c6b9b6ffc5ac2d1b24eb41f3fbdc;hp=77d2bf7467cdd614968616b2feacf141c9cef000;hpb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/main.c b/gdb/main.c index 77d2bf7467..540738e543 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -1,6 +1,6 @@ /* Top level stuff for GDB, the GNU debugger. - Copyright (C) 1986-2018 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -40,12 +40,14 @@ #include "maint.h" #include "filenames.h" -#include "filestuff.h" +#include "gdbsupport/filestuff.h" #include #include "event-top.h" #include "infrun.h" -#include "signals-state-save-restore.h" +#include "gdbsupport/signals-state-save-restore.h" #include +#include "gdbsupport/pathstuff.h" +#include "cli/cli-style.h" /* The selected interpreter. This will be used as a set command variable, so it should always be malloc'ed - since @@ -207,7 +209,7 @@ get_init_files (const char **system_gdbinit, if (!initialized) { struct stat homebuf, cwdbuf, s; - char *homedir; + const char *homedir; if (SYSTEM_GDBINIT[0]) { @@ -328,14 +330,6 @@ captured_command_loop () /* Now it's time to start the event loop. */ start_event_loop (); - /* FIXME: cagney/1999-11-05: A correct command_loop() implementaton - would clean things up (restoring the cleanup chain) to the state - they were just prior to the call. Technically, this means that - the do_cleanups() below is redundant. Unfortunately, many FUNCs - are not that well behaved. do_cleanups should either be replaced - with a do_cleanups call (to cover the problem) or an assertion - check to detect bad FUNCs code. */ - do_cleanups (all_cleanups ()); /* If the command_loop returned, normally (rather than threw an error) we try to quit. If the quit is aborted, our caller catches the signal and restarts the command loop. */ @@ -345,7 +339,7 @@ captured_command_loop () /* Handle command errors thrown from within catch_command_errors. */ static int -handle_command_errors (struct gdb_exception e) +handle_command_errors (const struct gdb_exception &e) { if (e.reason < 0) { @@ -371,7 +365,7 @@ static int catch_command_errors (catch_command_errors_const_ftype command, const char *arg, int from_tty) { - TRY + try { int was_sync = current_ui->prompt_state == PROMPT_BLOCKED; @@ -379,11 +373,10 @@ catch_command_errors (catch_command_errors_const_ftype command, maybe_wait_sync_command_done (was_sync); } - CATCH (e, RETURN_MASK_ALL) + catch (const gdb_exception &e) { return handle_command_errors (e); } - END_CATCH return 1; } @@ -484,9 +477,9 @@ captured_main_1 (struct captured_main_args *context) int i; int save_auto_load; - struct objfile *objfile; + int ret = 1; -#ifdef HAVE_SBRK +#ifdef HAVE_USEFUL_SBRK /* Set this before constructing scoped_command_stats. */ lim_at_start = (char *) sbrk (0); #endif @@ -504,11 +497,7 @@ captured_main_1 (struct captured_main_args *context) textdomain (PACKAGE); #endif - bfd_init (); notice_open_fds (); - save_original_signals_state (); - - saved_command_line = (char *) xstrdup (""); #ifdef __MINGW32__ /* Ensure stderr is unbuffered. A Cygwin pty or pipe is implemented @@ -516,12 +505,17 @@ captured_main_1 (struct captured_main_args *context) setvbuf (stderr, NULL, _IONBF, BUFSIZ); #endif + /* Note: `error' cannot be called before this point, because the + caller will crash when trying to print the exception. */ main_ui = new ui (stdin, stdout, stderr); current_ui = main_ui; gdb_stdtargerr = gdb_stderr; /* for moment */ gdb_stdtargin = gdb_stdin; /* for moment */ + if (bfd_init () != BFD_INIT_MAGIC) + error (_("fatal error: libbfd ABI mismatch")); + #ifdef __MINGW32__ /* On Windows, argv[0] is not necessarily set to absolute form when GDB is found along PATH, without which relocation doesn't work. */ @@ -800,28 +794,28 @@ captured_main_1 (struct captured_main_args *context) break; case 'b': { - int i; + int rate; char *p; - i = strtol (optarg, &p, 0); - if (i == 0 && p == optarg) + rate = strtol (optarg, &p, 0); + if (rate == 0 && p == optarg) warning (_("could not set baud rate to `%s'."), optarg); else - baud_rate = i; + baud_rate = rate; } break; case 'l': { - int i; + int timeout; char *p; - i = strtol (optarg, &p, 0); - if (i == 0 && p == optarg) + timeout = strtol (optarg, &p, 0); + if (timeout == 0 && p == optarg) warning (_("could not set timeout limit to `%s'."), optarg); else - remote_timeout = i; + remote_timeout = timeout; } break; @@ -846,9 +840,16 @@ captured_main_1 (struct captured_main_args *context) } if (batch_flag) - quiet = 1; + { + quiet = 1; + + /* Disable all output styling when running in batch mode. */ + cli_styling = 0; + } } + save_original_signals_state (quiet); + /* Try to set up an alternate signal stack for SIGSEGV handlers. */ setup_alternate_signal_stack (); @@ -916,7 +917,7 @@ captured_main_1 (struct captured_main_args *context) if (print_version) { - print_gdb_version (gdb_stdout); + print_gdb_version (gdb_stdout, false); wrap_here (""); printf_filtered ("\n"); exit (0); @@ -945,7 +946,7 @@ captured_main_1 (struct captured_main_args *context) { /* Print all the junk at the top, with trailing "..." if we are about to read a symbol file (possibly slowly). */ - print_gdb_version (gdb_stdout); + print_gdb_version (gdb_stdout, true); if (symarg) printf_filtered (".."); wrap_here (""); @@ -966,7 +967,7 @@ captured_main_1 (struct captured_main_args *context) { /* Print all the junk at the top, with trailing "..." if we are about to read a symbol file (possibly slowly). */ - print_gdb_version (gdb_stdout); + print_gdb_version (gdb_stdout, true); if (symarg) printf_filtered (".."); wrap_here (""); @@ -984,7 +985,7 @@ captured_main_1 (struct captured_main_args *context) processed; it sets global parameters, which are independent of what file you are debugging or what directory you are in. */ if (system_gdbinit && !inhibit_gdbinit) - catch_command_errors (source_script, system_gdbinit, 0); + ret = catch_command_errors (source_script, system_gdbinit, 0); /* Read and execute $HOME/.gdbinit file, if it exists. This is done *before* all the command line arguments are processed; it sets @@ -992,7 +993,7 @@ captured_main_1 (struct captured_main_args *context) debugging or what directory you are in. */ if (home_gdbinit && !inhibit_gdbinit && !inhibit_home_gdbinit) - catch_command_errors (source_script, home_gdbinit, 0); + ret = catch_command_errors (source_script, home_gdbinit, 0); /* Process '-ix' and '-iex' options early. */ for (i = 0; i < cmdarg_vec.size (); i++) @@ -1002,12 +1003,12 @@ captured_main_1 (struct captured_main_args *context) switch (cmdarg_p.type) { case CMDARG_INIT_FILE: - catch_command_errors (source_script, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (source_script, cmdarg_p.string, + !batch_flag); break; case CMDARG_INIT_COMMAND: - catch_command_errors (execute_command, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (execute_command, cmdarg_p.string, + !batch_flag); break; } } @@ -1015,11 +1016,11 @@ captured_main_1 (struct captured_main_args *context) /* Now perform all the actions indicated by the arguments. */ if (cdarg != NULL) { - catch_command_errors (cd_command, cdarg, 0); + ret = catch_command_errors (cd_command, cdarg, 0); } for (i = 0; i < dirarg.size (); i++) - catch_command_errors (directory_switch, dirarg[i], 0); + ret = catch_command_errors (directory_switch, dirarg[i], 0); /* Skip auto-loading section-specified scripts until we've sourced local_gdbinit (which is often used to augment the source search @@ -1034,19 +1035,20 @@ captured_main_1 (struct captured_main_args *context) /* The exec file and the symbol-file are the same. If we can't open it, better only print one error message. catch_command_errors returns non-zero on success! */ - if (catch_command_errors (exec_file_attach, execarg, - !batch_flag)) - catch_command_errors (symbol_file_add_main_adapter, symarg, - !batch_flag); + ret = catch_command_errors (exec_file_attach, execarg, + !batch_flag); + if (ret != 0) + ret = catch_command_errors (symbol_file_add_main_adapter, + symarg, !batch_flag); } else { if (execarg != NULL) - catch_command_errors (exec_file_attach, execarg, - !batch_flag); + ret = catch_command_errors (exec_file_attach, execarg, + !batch_flag); if (symarg != NULL) - catch_command_errors (symbol_file_add_main_adapter, symarg, - !batch_flag); + ret = catch_command_errors (symbol_file_add_main_adapter, + symarg, !batch_flag); } if (corearg && pidarg) @@ -1054,9 +1056,14 @@ captured_main_1 (struct captured_main_args *context) "a core file at the same time.")); if (corearg != NULL) - catch_command_errors (core_file_command, corearg, !batch_flag); + { + ret = catch_command_errors (core_file_command, corearg, + !batch_flag); + } else if (pidarg != NULL) - catch_command_errors (attach_command, pidarg, !batch_flag); + { + ret = catch_command_errors (attach_command, pidarg, !batch_flag); + } else if (pid_or_core_arg) { /* The user specified 'gdb program pid' or gdb program core'. @@ -1065,14 +1072,20 @@ captured_main_1 (struct captured_main_args *context) if (isdigit (pid_or_core_arg[0])) { - if (catch_command_errors (attach_command, pid_or_core_arg, - !batch_flag) == 0) - catch_command_errors (core_file_command, pid_or_core_arg, - !batch_flag); + ret = catch_command_errors (attach_command, pid_or_core_arg, + !batch_flag); + if (ret == 0) + ret = catch_command_errors (core_file_command, + pid_or_core_arg, + !batch_flag); + } + else + { + /* Can't be a pid, better be a corefile. */ + ret = catch_command_errors (core_file_command, + pid_or_core_arg, + !batch_flag); } - else /* Can't be a pid, better be a corefile. */ - catch_command_errors (core_file_command, pid_or_core_arg, - !batch_flag); } if (ttyarg != NULL) @@ -1096,7 +1109,7 @@ captured_main_1 (struct captured_main_args *context) { auto_load_local_gdbinit_loaded = 1; - catch_command_errors (source_script, local_gdbinit, 0); + ret = catch_command_errors (source_script, local_gdbinit, 0); } } @@ -1105,7 +1118,7 @@ captured_main_1 (struct captured_main_args *context) We wait until now because it is common to add to the source search path in local_gdbinit. */ global_auto_load = save_auto_load; - ALL_OBJFILES (objfile) + for (objfile *objfile : current_program_space->objfiles ()) load_auto_scripts_for_objfile (objfile); /* Process '-x' and '-ex' options. */ @@ -1116,12 +1129,12 @@ captured_main_1 (struct captured_main_args *context) switch (cmdarg_p.type) { case CMDARG_FILE: - catch_command_errors (source_script, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (source_script, cmdarg_p.string, + !batch_flag); break; case CMDARG_COMMAND: - catch_command_errors (execute_command, cmdarg_p.string, - !batch_flag); + ret = catch_command_errors (execute_command, cmdarg_p.string, + !batch_flag); break; } } @@ -1132,8 +1145,11 @@ captured_main_1 (struct captured_main_args *context) if (batch_flag) { + int error_status = EXIT_FAILURE; + int *exit_arg = ret == 0 ? &error_status : NULL; + /* We have hit the end of the batch file. */ - quit_force (NULL, 0); + quit_force (exit_arg, 0); } } @@ -1150,15 +1166,14 @@ captured_main (void *data) change - SET_TOP_LEVEL() - has been eliminated. */ while (1) { - TRY + try { captured_command_loop (); } - CATCH (ex, RETURN_MASK_ALL) + catch (const gdb_exception &ex) { exception_print (gdb_stderr, ex); } - END_CATCH } /* No exit -- exit is through quit_command. */ } @@ -1166,15 +1181,14 @@ captured_main (void *data) int gdb_main (struct captured_main_args *args) { - TRY + try { captured_main (args); } - CATCH (ex, RETURN_MASK_ALL) + catch (const gdb_exception &ex) { exception_print (gdb_stderr, ex); } - END_CATCH /* The only way to end up here is by an error (normal exit is handled by quit_force()), hence always return an error status. */