2005-01-13  Andrew Cagney  <cagney@gnu.org>
 
+       * breakpoint.c (gdb_breakpoint_query): Update, use
+       catch_exceptions_with_msg.
+       (do_captured_breakpoint): Add uiout parameter.
+       (gdb_breakpoint): Update, use catch_exceptions_with_msg.
+       * mi/mi-main.c (mi_cmd_thread_select): Pass mi_error_message to
+       gdb_thread_select.  Return MI_CMD_ERROR instead of
+       MI_CMD_CAUGHT_ERROR.
+       (mi_cmd_thread_list_ids): Ditto for gdb_list_thread_ids.
+       (enum captured_mi_execute_command_actions): Delete
+       EXECUTE_COMMAND_DISPLAY_ERROR.
+       (captured_mi_execute_command): Delete code handling
+       MI_CMD_CAUGHT_ERROR.
+       (mi_execute_command): Don't check for
+       EXECUTE_COMMAND_DISPLAY_ERROR.
+       * mi/mi-cmd-break.c (breakpoint_notify): Update call to
+       gdb_breakpoint_query.
+       (mi_cmd_break_insert): Pass mi_error_message to gdb_breakpoint.
+       * mi/mi-cmds.h (enum mi_cmd_result): Delete MI_CMD_CAUGHT_ERROR.
+       * gdb.h (gdb_thread_select, gdb_list_thread_ids)
+       (gdb_breakpoint, gdb_breakpoint_query): Add error_message
+       parameter.
+       * thread.c (thread_command): Update call.
+       (gdb_thread_select, gdb_list_thread_ids): Update, call
+       catch_exceptions_with_msg.
+
        * mi/mi-main.c (mi_execute_command): Use catch_exception,
        eliminate call to error_last_message.
        (captured_mi_execute_command): Change return type to void.
 
 }
 
 enum gdb_rc
-gdb_breakpoint_query (struct ui_out *uiout, int bnum)
+gdb_breakpoint_query (struct ui_out *uiout, int bnum, char **error_message)
 {
   struct captured_breakpoint_query_args args;
   args.bnum = bnum;
   /* For the moment we don't trust print_one_breakpoint() to not throw
      an error. */
-  return catch_exceptions (uiout, do_captured_breakpoint_query, &args,
-                          NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_breakpoint_query, &args,
+                                   NULL, error_message, RETURN_MASK_ALL);
 }
 
 /* Return non-zero if B is user settable (breakpoints, watchpoints,
   };
 
 static int
-do_captured_breakpoint (void *data)
+do_captured_breakpoint (struct ui_out *uiout, void *data)
 {
   struct captured_breakpoint_args *args = data;
   struct symtabs_and_lines sals;
 enum gdb_rc
 gdb_breakpoint (char *address, char *condition,
                int hardwareflag, int tempflag,
-               int thread, int ignore_count)
+               int thread, int ignore_count,
+               char **error_message)
 {
   struct captured_breakpoint_args args;
   args.address = address;
   args.tempflag = tempflag;
   args.thread = thread;
   args.ignore_count = ignore_count;
-  return catch_errors (do_captured_breakpoint, &args,
-                      NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_breakpoint, &args,
+                                   NULL, error_message, RETURN_MASK_ALL);
 }
 
 
 
 
 enum gdb_rc {
   /* The operation failed.  The failure message can be fetched by
-     calling ``char *error_last_message(void)''. The value is
-     determined by the catch_errors() interface. */
+     calling ``char *error_last_message(void)''.  The value is
+     determined by the catch_errors() interface.  The MSG parameter is
+     set to a freshly allocated copy of the error message.  */
   /* NOTE: Since ``defs.h:catch_errors()'' does not return an error /
      internal / quit indication it is not possible to return that
      here. */
 
 /* Print the specified breakpoint on GDB_STDOUT. (Eventually this
    function will ``print'' the object on ``output''). */
-enum gdb_rc gdb_breakpoint_query (struct ui_out *uiout, int bnum);
+enum gdb_rc gdb_breakpoint_query (struct ui_out *uiout, int bnum,
+                                 char **error_message);
 
 /* Create a breakpoint at ADDRESS (a GDB source and line). */
 enum gdb_rc gdb_breakpoint (char *address, char *condition,
                            int hardwareflag, int tempflag,
-                           int thread, int ignore_count);
+                           int thread, int ignore_count,
+                           char **error_message);
 
 /* Switch thread and print notification. */
-enum gdb_rc gdb_thread_select (struct ui_out *uiout, char *tidstr);
+enum gdb_rc gdb_thread_select (struct ui_out *uiout, char *tidstr,
+                              char **error_message);
 
 /* Print a list of known thread ids. */
-enum gdb_rc gdb_list_thread_ids (struct ui_out *uiout);
+enum gdb_rc gdb_list_thread_ids (struct ui_out *uiout,
+                                char **error_message);
 
 #endif
 
 static void
 breakpoint_notify (int b)
 {
-  gdb_breakpoint_query (uiout, b);
+  gdb_breakpoint_query (uiout, b, NULL);
 }
 
 
     case REG_BP:
       rc = gdb_breakpoint (address, condition,
                           0 /*hardwareflag */ , temp_p,
-                          thread, ignore_count);
+                          thread, ignore_count,
+                          &mi_error_message);
       break;
     case HW_BP:
       rc = gdb_breakpoint (address, condition,
                           1 /*hardwareflag */ , temp_p,
-                          thread, ignore_count);
+                          thread, ignore_count,
+                          &mi_error_message);
       break;
 #if 0
     case REGEXP_BP:
   deprecated_set_gdb_event_hooks (old_hooks);
 
   if (rc == GDB_RC_FAIL)
-    return MI_CMD_CAUGHT_ERROR;
+    return MI_CMD_ERROR;
   else
     return MI_CMD_DONE;
 }
 
        asprintf'd into the mi_error_message buffer.  The main loop will
        display the error message and the completion prompt. */
     MI_CMD_ERROR,
-    /* An error condition was detected and caught.  The error message is
-       in the global error message buffer. The main loop will display
-       the error message and the completion prompt. */
-    MI_CMD_CAUGHT_ERROR,
     /* The MI command has already displayed its completion message.
        Main loop will not display a completion message but will display
        the completion prompt. */
 
 enum captured_mi_execute_command_actions
   {
     EXECUTE_COMMAND_DISPLAY_PROMPT,
-    EXECUTE_COMMAND_SUPRESS_PROMPT,
-    EXECUTE_COMMAND_DISPLAY_ERROR
+    EXECUTE_COMMAND_SUPRESS_PROMPT
   };
 
 /* This structure is used to pass information from captured_mi_execute_command
       return MI_CMD_ERROR;
     }
   else
-    rc = gdb_thread_select (uiout, argv[0]);
+    rc = gdb_thread_select (uiout, argv[0], &mi_error_message);
 
   /* RC is enum gdb_rc if it is successful (>=0)
      enum return_reason if not (<0). */
   if ((int) rc < 0 && (enum return_reason) rc == RETURN_ERROR)
-    return MI_CMD_CAUGHT_ERROR;
+    return MI_CMD_ERROR;
   else if ((int) rc >= 0 && rc == GDB_RC_FAIL)
     return MI_CMD_ERROR;
   else
       return MI_CMD_ERROR;
     }
   else
-    rc = gdb_list_thread_ids (uiout);
+    rc = gdb_list_thread_ids (uiout, &mi_error_message);
 
   if (rc == GDB_RC_FAIL)
-    return MI_CMD_CAUGHT_ERROR;
+    return MI_CMD_ERROR;
   else
     return MI_CMD_DONE;
 }
                }
              mi_out_rewind (uiout);
            }
-         else if (args->rc == MI_CMD_CAUGHT_ERROR)
-           {
-             mi_out_rewind (uiout);
-             args->action = EXECUTE_COMMAND_DISPLAY_ERROR;
-             return;
-           }
          else
            mi_out_rewind (uiout);
        }
          mi_parse_free (command);
          return;
        }
-      if (args.action == EXECUTE_COMMAND_DISPLAY_ERROR
-         || result.reason < 0)
+      if (result.reason < 0)
        {
          char *msg = result.message;
          struct cleanup *cleanup = make_cleanup (xfree, msg);
 
 /* Official gdblib interface function to get a list of thread ids and
    the total number. */
 enum gdb_rc
-gdb_list_thread_ids (struct ui_out *uiout)
+gdb_list_thread_ids (struct ui_out *uiout, char **error_message)
 {
-  return catch_exceptions (uiout, do_captured_list_thread_ids, NULL,
-                          NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_list_thread_ids, NULL,
+                                   NULL, error_message, RETURN_MASK_ALL);
 }
 
 /* Load infrun state for the thread PID.  */
       return;
     }
 
-  gdb_thread_select (uiout, tidstr);
+  gdb_thread_select (uiout, tidstr, NULL);
 }
 
 static int
 }
 
 enum gdb_rc
-gdb_thread_select (struct ui_out *uiout, char *tidstr)
+gdb_thread_select (struct ui_out *uiout, char *tidstr, char **error_message)
 {
-  return catch_exceptions (uiout, do_captured_thread_select, tidstr,
-                          NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_thread_select, tidstr,
+                                   NULL, error_message, RETURN_MASK_ALL);
 }
 
 /* Commands with a prefix of `thread'.  */