* 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).
This commit is contained in:
Jim Kingdon 1993-06-13 18:16:42 +00:00
parent b025842760
commit 9748446f53
11 changed files with 128 additions and 50 deletions

View File

@ -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]:

View File

@ -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); \
} \
}

View File

@ -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 */

View File

@ -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);
}

View File

@ -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 ();

View File

@ -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);
}

View File

@ -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;

View File

@ -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);
}
}
}
}

View File

@ -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");

View File

@ -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;

View File

@ -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);