* defs.h, main.c (catch_errors): Add return_mask arg.
authorJim Kingdon <jkingdon@engr.sgi.com>
Sun, 13 Jun 1993 18:16:42 +0000 (18:16 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Sun, 13 Jun 1993 18:16:42 +0000 (18:16 +0000)
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
gdb/config/i960/tm-nindy960.h
gdb/corelow.c
gdb/language.c
gdb/main.c
gdb/remote-hms.c
gdb/remote-mips.c
gdb/remote-nindy.c
gdb/remote-vx.c
gdb/solib.c
gdb/xcoffexec.c

index b69e5b7..e886fe4 100644 (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]:
index c6410d0..dba88e0 100644 (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);                  \
          }                                                     \
        }
index 75f64d5..de9af10 100644 (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 */
index 4f88b0a..4881aa1 100644 (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);
 }
 
 \f
index 9c274bb..cccf669 100644 (file)
@@ -337,33 +337,63 @@ static void stop_sig PARAMS ((int));
 #define sigsetmask(n)
 #endif
 \f
-/* 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 ();
index cb29057..4546310 100644 (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);
 }
index eb86ebf..ccc2bad 100644 (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;
 
index e28fe8a..033306b 100644 (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 */
 }
 \f
+/* 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);
+             }
+         }
   }
 }
 \f
index bb621a5..34f1fa2 100644 (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");
index 79a0e01..124acc6 100644 (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;
index cfc6a78..0e997b1 100644 (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);