From 9748446f533aef6d3a568667e37b55c74f078f4d Mon Sep 17 00:00:00 2001 From: Jim Kingdon Date: Sun, 13 Jun 1993 18:16:42 +0000 Subject: [PATCH] * 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). --- gdb/ChangeLog | 12 ++++ gdb/config/i960/tm-nindy960.h | 4 +- gdb/corelow.c | 3 +- gdb/language.c | 4 +- gdb/main.c | 100 ++++++++++++++++++++++++---------- gdb/remote-hms.c | 1 - gdb/remote-mips.c | 4 +- gdb/remote-nindy.c | 36 +++++++++--- gdb/remote-vx.c | 8 ++- gdb/solib.c | 3 +- gdb/xcoffexec.c | 3 +- 11 files changed, 128 insertions(+), 50 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b69e5b77b0..e886fe4a1e 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 c6410d0168..dba88e0894 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 75f64d54ea..de9af10b8f 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 4f88b0a264..4881aa18c2 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 9c274bb82f..cccf6697cc 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 cb290579f7..454631079f 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 eb86ebfd08..ccc2bad020 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 e28fe8adcf..033306bfe8 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 bb621a546d..34f1fa2b9d 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 79a0e01f51..124acc669f 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 cfc6a786dc..0e997b1d8f 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); -- 2.34.1