* 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:
parent
b025842760
commit
9748446f53
11 changed files with 128 additions and 50 deletions
|
@ -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]:
|
||||
|
|
|
@ -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); \
|
||||
} \
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
100
gdb/main.c
100
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 ();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue