From: Jim Kingdon Date: Sun, 13 Jun 1993 18:16:42 +0000 (+0000) Subject: * defs.h, main.c (catch_errors): Add return_mask arg. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9748446f533aef6d3a568667e37b55c74f078f4d;p=binutils-gdb.git * defs.h, main.c (catch_errors): Add return_mask arg. stack.c (print_frame_info): Pass RETURN_MASK_ERROR. other callers: Pass RETURN_MASK_ALL. (return_to_top_level), callers: Add return_reason arg. * utils.c (quit): Use return_to_top_level (RETURN_QUIT) instead of error (). * main.c (main), tm-nindy960.h (ADDITIONAL_OPTION_HANDLER): Use SET_TOP_LEVEL not setjmp (to_top_level). * remote-nindy.c: Use catch_errors not setjmp (to_top_level). --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b69e5b77b0e..e886fe4a1e5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +Sun Jun 13 09:17:48 1993 Jim Kingdon (kingdon@cygnus.com) + + * defs.h, main.c (catch_errors): Add return_mask arg. + stack.c (print_frame_info): Pass RETURN_MASK_ERROR. + other callers: Pass RETURN_MASK_ALL. + (return_to_top_level), callers: Add return_reason arg. + * utils.c (quit): + Use return_to_top_level (RETURN_QUIT) instead of error (). + * main.c (main), tm-nindy960.h (ADDITIONAL_OPTION_HANDLER): + Use SET_TOP_LEVEL not setjmp (to_top_level). + * remote-nindy.c: Use catch_errors not setjmp (to_top_level). + Sat Jun 12 14:40:54 1993 Jim Kingdon (kingdon@cygnus.com) * solib.c (solib_create_inferior_hook) [SVR4_SHARED_LIBS]: diff --git a/gdb/config/i960/tm-nindy960.h b/gdb/config/i960/tm-nindy960.h index c6410d01682..dba88e0894e 100644 --- a/gdb/config/i960/tm-nindy960.h +++ b/gdb/config/i960/tm-nindy960.h @@ -57,9 +57,9 @@ extern char *nindy_ttyname; /* Name of serial port to talk to nindy */ and download the executable file if one was specified. */ #define ADDITIONAL_OPTION_HANDLER \ - if (!setjmp (to_top_level) && nindy_ttyname) { \ + if (!SET_TOP_LEVEL () && nindy_ttyname) { \ nindy_open (nindy_ttyname, !batch); \ - if ( !setjmp(to_top_level) && execarg ) { \ + if (!SET_TOP_LEVEL () && execarg) { \ target_load (execarg, !batch); \ } \ } diff --git a/gdb/corelow.c b/gdb/corelow.c index 75f64d54eaa..de9af10b8f3 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -160,7 +160,8 @@ core_open (filename, from_tty) /* Add symbols and section mappings for any shared libraries */ #ifdef SOLIB_ADD - catch_errors (solib_add_stub, (char *)from_tty, (char *)0); + catch_errors (solib_add_stub, (char *)from_tty, (char *)0, + RETURN_MASK_ALL); #endif /* Now, set up the frame cache, and print the top of stack */ diff --git a/gdb/language.c b/gdb/language.c index 4f88b0a264b..4881aa18c27 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1022,7 +1022,7 @@ type_error (va_alist) fprintf (stderr, "\n"); va_end (args); if (type_check==type_check_on) - return_to_top_level(); + return_to_top_level (RETURN_ERROR); } void @@ -1043,7 +1043,7 @@ range_error (va_alist) fprintf (stderr, "\n"); va_end (args); if (range_check==range_check_on) - return_to_top_level(); + return_to_top_level (RETURN_ERROR); } diff --git a/gdb/main.c b/gdb/main.c index 9c274bb82ff..cccf6697cc5 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -337,33 +337,63 @@ static void stop_sig PARAMS ((int)); #define sigsetmask(n) #endif -/* This is how `error' returns to command level. */ +/* Where to go for return_to_top_level (RETURN_ERROR). */ +static jmp_buf error_return; +/* Where to go for return_to_top_level (RETURN_QUIT). */ +static jmp_buf quit_return; -jmp_buf to_top_level; +/* Temporary variable for SET_TOP_LEVEL. */ +static int top_level_val; + +/* Do a setjmp on error_return and quit_return. catch_errors is + generally a cleaner way to do this, but main() would look pretty + ugly if it had to use catch_errors each time. */ + +#define SET_TOP_LEVEL() \ + (((top_level_val = setjmp (error_return)) \ + ? (PTR) 0 : (PTR) memcpy (quit_return, error_return, sizeof (jmp_buf))) \ + , top_level_val) + +/* Return for reason REASON. This generally gets back to the command + loop, but can be caught via catch_errors. */ NORETURN void -return_to_top_level () +return_to_top_level (reason) + enum return_reason reason; { quit_flag = 0; immediate_quit = 0; bpstat_clear_actions(stop_bpstat); /* Clear queued breakpoint commands */ disable_current_display (); do_cleanups (ALL_CLEANUPS); - (NORETURN void) longjmp (to_top_level, 1); + (NORETURN void) longjmp + (reason == RETURN_ERROR ? error_return : quit_return, 1); } -/* Call FUNC with arg ARGS, catching any errors. - If there is no error, return the value returned by FUNC. - If there is an error, print ERRSTRING, print the specific error message, - then return zero. */ +/* Call FUNC with arg ARGS, catching any errors. If there is no + error, return the value returned by FUNC. If there is an error, + print ERRSTRING, print the specific error message, then return + zero. + + MASK specifies what to catch; it is normally set to + RETURN_MASK_ALL, if for no other reason than that the code which + calls catch_errors might not be set up to deal with a quit which + isn't caught. But if the code can deal with it, it generally + should be RETURN_MASK_ERROR, unless for some reason it is more + useful to abort only the portion of the operation inside the + catch_errors. Note that quit should return to the command line + fairly quickly, even if some further processing is being done. */ int -catch_errors (func, args, errstring) +catch_errors (func, args, errstring, mask) int (*func) PARAMS ((char *)); - char *args; + PTR args; char *errstring; + return_mask mask; { - jmp_buf saved; + jmp_buf saved_error; + jmp_buf saved_quit; + jmp_buf tmp_jmp; int val; struct cleanup *saved_cleanup_chain; char *saved_error_pre_print; @@ -371,18 +401,30 @@ catch_errors (func, args, errstring) saved_cleanup_chain = save_cleanups (); saved_error_pre_print = error_pre_print; - memcpy ((char *)saved, (char *)to_top_level, sizeof (jmp_buf)); + if (mask & RETURN_MASK_ERROR) + memcpy ((char *)saved_error, (char *)error_return, sizeof (jmp_buf)); + if (mask & RETURN_MASK_QUIT) + memcpy (saved_quit, quit_return, sizeof (jmp_buf)); error_pre_print = errstring; - if (setjmp (to_top_level) == 0) - val = (*func) (args); + if (setjmp (tmp_jmp) == 0) + { + if (mask & RETURN_MASK_ERROR) + memcpy (error_return, tmp_jmp, sizeof (jmp_buf)); + if (mask & RETURN_MASK_QUIT) + memcpy (quit_return, tmp_jmp, sizeof (jmp_buf)); + val = (*func) (args); + } else val = 0; restore_cleanups (saved_cleanup_chain); error_pre_print = saved_error_pre_print; - memcpy ((char *)to_top_level, (char *)saved, sizeof (jmp_buf)); + if (mask & RETURN_MASK_ERROR) + memcpy (error_return, saved_error, sizeof (jmp_buf)); + if (mask & RETURN_MASK_QUIT) + memcpy (quit_return, saved_quit, sizeof (jmp_buf)); return val; } @@ -393,7 +435,7 @@ disconnect (signo) int signo; { catch_errors (quit_cover, NULL, - "Could not kill the program being debugged"); + "Could not kill the program being debugged", RETURN_MASK_ALL); signal (SIGHUP, SIG_DFL); kill (getpid (), SIGHUP); } @@ -479,7 +521,7 @@ main (argc, argv) #endif /* If error() is called from initialization code, just exit */ - if (setjmp (to_top_level)) { + if (SET_TOP_LEVEL ()) { exit(1); } @@ -728,7 +770,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); strcat (homeinit, gdbinit); if (!inhibit_gdbinit && access (homeinit, R_OK) == 0) { - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) source_command (homeinit, 0); } do_cleanups (ALL_CLEANUPS); @@ -749,7 +791,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); /* Now perform all the actions indicated by the arguments. */ if (cdarg != NULL) { - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) { cd_command (cdarg, 0); init_source_path (); @@ -758,7 +800,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); do_cleanups (ALL_CLEANUPS); for (i = 0; i < ndir; i++) - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) directory_command (dirarg[i], 0); free ((PTR)dirarg); do_cleanups (ALL_CLEANUPS); @@ -769,7 +811,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); { /* The exec file and the symbol-file are the same. If we can't open it, better only print one error message. */ - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) { exec_file_command (execarg, !batch); symbol_file_command (symarg, 0); @@ -778,10 +820,10 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); else { if (execarg != NULL) - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) exec_file_command (execarg, !batch); if (symarg != NULL) - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) symbol_file_command (symarg, 0); } do_cleanups (ALL_CLEANUPS); @@ -795,14 +837,14 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); warning_pre_print = "\nwarning: "; if (corearg != NULL) - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) core_file_command (corearg, !batch); - else if (isdigit (corearg[0]) && !setjmp (to_top_level)) + else if (isdigit (corearg[0]) && !SET_TOP_LEVEL ()) attach_command (corearg, !batch); do_cleanups (ALL_CLEANUPS); if (ttyarg != NULL) - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) tty_command (ttyarg, !batch); do_cleanups (ALL_CLEANUPS); @@ -821,14 +863,14 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); || memcmp ((char *) &homebuf, (char *) &cwdbuf, sizeof (struct stat))) if (!inhibit_gdbinit && access (gdbinit, R_OK) == 0) { - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) source_command (gdbinit, 0); } do_cleanups (ALL_CLEANUPS); for (i = 0; i < ncmd; i++) { - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) { if (cmdarg[i][0] == '-' && cmdarg[i][1] == '\0') read_command_file (stdin); @@ -859,7 +901,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr); while (1) { - if (!setjmp (to_top_level)) + if (!SET_TOP_LEVEL ()) { do_cleanups (ALL_CLEANUPS); /* Do complete cleanup */ command_loop (); diff --git a/gdb/remote-hms.c b/gdb/remote-hms.c index cb290579f7d..454631079fb 100644 --- a/gdb/remote-hms.c +++ b/gdb/remote-hms.c @@ -1215,7 +1215,6 @@ hms_before_main_loop () char ttyname[100]; char *p, *p2; extern FILE *instream; - extern jmp_buf to_top_level; push_target (&hms_ops); } diff --git a/gdb/remote-mips.c b/gdb/remote-mips.c index eb86ebfd080..ccc2bad020e 100644 --- a/gdb/remote-mips.c +++ b/gdb/remote-mips.c @@ -855,7 +855,9 @@ mips_initialize () mips_receive_wait = 3; tries = 0; - while (catch_errors (mips_receive_packet, buff, (char *) NULL) == 0) + while (catch_errors (mips_receive_packet, buff, (char *) NULL, + RETURN_MASK_ALL) + == 0) { char cc; diff --git a/gdb/remote-nindy.c b/gdb/remote-nindy.c index e28fe8adcff..033306bfe83 100644 --- a/gdb/remote-nindy.c +++ b/gdb/remote-nindy.c @@ -125,7 +125,6 @@ extern char *mktemp(); extern void generic_mourn_inferior (); extern struct target_ops nindy_ops; -extern jmp_buf to_top_level; extern FILE *instream; extern struct ext_format ext_format_i960; /* i960-tdep.c */ @@ -840,6 +839,23 @@ nindy_mourn_inferior () generic_mourn_inferior (); /* Do all the proper things now */ } +/* Pass the args the way catch_errors wants them. */ +static int +nindy_open_stub (arg) + char *arg; +{ + nindy_open (arg, 1); + return 1; +} + +static int +load_stub (arg) + char *arg; +{ + target_load (arg, 1); + return 1; +} + /* This routine is run as a hook, just before the main command loop is entered. If gdb is configured for the i960, but has not had its nindy target specified yet, this will loop prompting the user to do so. @@ -854,7 +870,6 @@ nindy_before_main_loop () char ttyname[100]; char *p, *p2; - setjmp(to_top_level); while (current_target != &nindy_ops) { /* remote tty not specified yet */ if ( instream == stdin ){ printf("\nAttach /dev/ttyNN -- specify NN, or \"quit\" to quit: "); @@ -877,13 +892,16 @@ nindy_before_main_loop () exit(1); } - nindy_open( p, 1 ); - - /* Now that we have a tty open for talking to the remote machine, - download the executable file if one was specified. */ - if ( !setjmp(to_top_level) && exec_bfd ) { - target_load (bfd_get_filename (exec_bfd), 1); - } + if (catch_errors (nindy_open_stub, p, "", RETURN_MASK_ALL)) + { + /* Now that we have a tty open for talking to the remote machine, + download the executable file if one was specified. */ + if (exec_bfd) + { + catch_errors (load_stub, bfd_get_filename (exec_bfd), "", + RETURN_MASK_ALL); + } + } } } diff --git a/gdb/remote-vx.c b/gdb/remote-vx.c index bb621a546d5..34f1fa2b9df 100644 --- a/gdb/remote-vx.c +++ b/gdb/remote-vx.c @@ -1031,8 +1031,9 @@ vx_open (args, from_tty) { if (*bootFile) { printf_filtered ("\t%s: ", bootFile); - if (catch_errors (symbol_stub, bootFile, - "Error while reading symbols from boot file:\n")) + if (catch_errors + (symbol_stub, bootFile, + "Error while reading symbols from boot file:\n", RETURN_MASK_ALL)) puts_filtered ("ok\n"); } else if (from_tty) printf ("VxWorks kernel symbols not loaded.\n"); @@ -1068,7 +1069,8 @@ vx_open (args, from_tty) /* Botches, FIXME: (1) Searches the PATH, not the source path. (2) data and bss are assumed to be at the usual offsets from text. */ - catch_errors (add_symbol_stub, (char *)pLoadFile, (char *)0); + catch_errors (add_symbol_stub, (char *)pLoadFile, (char *)0, + RETURN_MASK_ALL); #endif } printf_filtered ("Done.\n"); diff --git a/gdb/solib.c b/gdb/solib.c index 79a0e01f51e..124acc669fa 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -766,7 +766,8 @@ solib_add (arg_string, from_tty, target) } else if (catch_errors (symbol_add_stub, (char *) so, - "Error while reading shared library symbols:\n")) + "Error while reading shared library symbols:\n", + RETURN_MASK_ALL)) { special_symbol_handling (so); so -> symbols_loaded = 1; diff --git a/gdb/xcoffexec.c b/gdb/xcoffexec.c index cfc6a786dc0..0e997b1d8f7 100644 --- a/gdb/xcoffexec.c +++ b/gdb/xcoffexec.c @@ -467,7 +467,8 @@ add_vmap(ldi) #ifndef SOLIB_SYMBOLS_MANUAL if (catch_errors (objfile_symbol_add, (char *)obj, - "Error while reading shared library symbols:\n")) + "Error while reading shared library symbols:\n", + RETURN_MASK_ALL)) { /* Note this is only done if symbol reading was successful. */ vmap_symtab (vp);