* 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 b69e5b77b0ed4da4dd44015eb0d569183034b5fb..e886fe4a1e536b4211ae3a06b90af62d1bfef926 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 c6410d016824369b84fe8aac8db9c1ece97cccb1..dba88e0894eea50edcbf397f000d8e801b458727 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 75f64d54eaa0c4dc879bc1c0b0f80a4412e96e05..de9af10b8f367b4fd3312177835fe2e0e231ecdd 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 4f88b0a264beffaca0565572f57558e88d9fc886..4881aa18c27b8fdd5b794561bafd328c6942f00f 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 9c274bb82ffa96ed7db3125687f7d4fe72fadb98..cccf6697cc5c1b42b1ca1af52d17840607b0c753 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 cb290579f7d46b41a00ffb138e5a61060a05c576..454631079fbb318713b71e6b747eeb6e5e09fd18 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 eb86ebfd0800e9e9cdc6dd96879e49635e631dbb..ccc2bad020ef268d5896f63829c94a9ce9e77aaf 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 e28fe8adcffaffc3978c5994e368ad469df409d9..033306bfe8323ab91b86afa56437f305fbc7b217 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 bb621a546d574724550e39e8e930bd5c6ed02e09..34f1fa2b9df8f75d484d7d0b448dbdc2e885e386 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 79a0e01f51e722467c5c41313324a17955680efb..124acc669fa5746ffaf06add6084dac83d4f98a4 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 cfc6a786dc0971bcc00ab17041cda0b1d921ee48..0e997b1d8f7615c2dc7832e063129d4e0ccb05bd 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);