* NEWS: Mention pointer to member improvements.
[deliverable/binutils-gdb.git] / gdb / exceptions.h
index 919738a7375e1b3dbff9566a5aff0424c86ce0ed..47ce0771c37d412d80ab276cdab028edd31bb608 100644 (file)
@@ -1,8 +1,8 @@
 /* Exception (throw catch) mechanism, for GDB, the GNU debugger.
 
-   Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
-   Foundation, Inc.
+   Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #ifndef EXCEPTIONS_H
 #define EXCEPTIONS_H
 
+#include "ui-out.h"
+#include <setjmp.h>
+
 /* Reasons for calling throw_exceptions().  NOTE: all reason values
    must be less than zero.  enum value 0 is reserved for internal use
    as the return value from an initial setjmp().  The function
@@ -47,15 +50,35 @@ typedef int return_mask;
 /* Describe all exceptions.  */
 
 enum errors {
-  NO_ERROR,
+  GDB_NO_ERROR,
   /* Any generic error, the corresponding text is in
      exception.message.  */
   GENERIC_ERROR,
+  NOT_FOUND_ERROR,
+
+  /* Thread library lacks support necessary for finding thread local
+     storage.  */
+  TLS_NO_LIBRARY_SUPPORT_ERROR,
+
+  /* Load module not found while attempting to find thread local storage.  */
+  TLS_LOAD_MODULE_NOT_FOUND_ERROR,
+
+  /* Thread local storage has not been allocated yet.  */
+  TLS_NOT_ALLOCATED_YET_ERROR,
+
+  /* Something else went wrong while attempting to find thread local
+     storage.  The ``struct gdb_exception'' message field provides
+     more detail.  */
+  TLS_GENERIC_ERROR,
+
+  /* Problem parsing an XML document.  */
+  XML_PARSE_ERROR,
+
   /* Add more errors here.  */
   NR_ERRORS
 };
 
-struct exception
+struct gdb_exception
 {
   enum return_reason reason;
   enum errors error;
@@ -63,14 +86,72 @@ struct exception
 };
 
 /* A pre-defined non-exception.  */
-extern const struct exception exception_none;
+extern const struct gdb_exception exception_none;
+
+/* Wrap set/long jmp so that it's more portable (internal to
+   exceptions).  */
+
+#if defined(HAVE_SIGSETJMP)
+#define EXCEPTIONS_SIGJMP_BUF          sigjmp_buf
+#define EXCEPTIONS_SIGSETJMP(buf)      sigsetjmp((buf), 1)
+#define EXCEPTIONS_SIGLONGJMP(buf,val) siglongjmp((buf), (val))
+#else
+#define EXCEPTIONS_SIGJMP_BUF          jmp_buf
+#define EXCEPTIONS_SIGSETJMP(buf)      setjmp(buf)
+#define EXCEPTIONS_SIGLONGJMP(buf,val) longjmp((buf), (val))
+#endif
+
+/* Functions to drive the exceptions state m/c (internal to
+   exceptions).  */
+EXCEPTIONS_SIGJMP_BUF *exceptions_state_mc_init (struct ui_out *func_uiout,
+                                                volatile struct gdb_exception *
+                                                exception,
+                                                return_mask mask);
+int exceptions_state_mc_action_iter (void);
+int exceptions_state_mc_action_iter_1 (void);
+
+/* Macro to wrap up standard try/catch behavior.
+
+   The double loop lets us correctly handle code "break"ing out of the
+   try catch block.  (It works as the "break" only exits the inner
+   "while" loop, the outer for loop detects this handling it
+   correctly.)  Of course "return" and "goto" are not so lucky.
+
+   For instance:
+
+   *INDENT-OFF*
+
+   volatile struct gdb_exception e;
+   TRY_CATCH (e, RETURN_MASK_ERROR)
+     {
+     }
+   switch (e.reason)
+     {
+     case RETURN_ERROR: ...
+     }
+
+  */
+
+#define TRY_CATCH(EXCEPTION,MASK) \
+     { \
+       EXCEPTIONS_SIGJMP_BUF *buf = \
+        exceptions_state_mc_init (uiout, &(EXCEPTION), (MASK)); \
+       EXCEPTIONS_SIGSETJMP (*buf); \
+     } \
+     while (exceptions_state_mc_action_iter ()) \
+       while (exceptions_state_mc_action_iter_1 ())
+
+/* *INDENT-ON* */
+
 
 /* If E is an exception, print it's error message on the specified
-   stream.  */
-extern void exception_print (struct ui_file *file, const char *pre_print,
-                            struct exception e);
+   stream. for _fprintf, prefix the message with PREFIX...  */
+extern void exception_print (struct ui_file *file, struct gdb_exception e);
+extern void exception_fprintf (struct ui_file *file, struct gdb_exception e,
+                              const char *prefix,
+                              ...) ATTR_FORMAT (printf, 3, 4);
 
-/* Throw an exception (as described by "struct exception").  Will
+/* Throw an exception (as described by "struct gdb_exception").  Will
    execute a LONG JUMP to the inner most containing exception handler
    established using catch_exceptions() (or similar).
 
@@ -81,13 +162,17 @@ extern void exception_print (struct ui_file *file, const char *pre_print,
    be a good thing or a dangerous thing.'' -- the Existential
    Wombat.  */
 
-extern NORETURN void throw_exception (struct exception exception) ATTR_NORETURN;
-extern NORETURN void throw_reason (enum return_reason reason) ATTR_NORETURN;
-extern NORETURN void throw_verror (enum errors, const char *fmt,
-                                  va_list ap) ATTR_NORETURN;
-extern NORETURN void throw_vfatal (const char *fmt, va_list ap) ATTR_NORETURN;
-extern NORETURN void throw_vsilent (const char *fmt, va_list ap) ATTR_NORETURN;
+extern NORETURN void throw_exception (struct gdb_exception exception) ATTR_NORETURN;
+extern NORETURN void throw_verror (enum errors, const char *fmt, va_list ap)
+     ATTR_NORETURN ATTR_FORMAT (printf, 2, 0);
+extern NORETURN void throw_vfatal (const char *fmt, va_list ap)
+     ATTR_NORETURN ATTR_FORMAT (printf, 1, 0);
+extern NORETURN void throw_error (enum errors error, const char *fmt,
+                                 ...) ATTR_NORETURN ATTR_FORMAT (printf, 2, 3);
 
+/* Instead of deprecated_throw_reason, code should use catch_exception
+   and throw_exception.  */
+extern NORETURN void deprecated_throw_reason (enum return_reason reason) ATTR_NORETURN;
 
 /* Call FUNC(UIOUT, FUNC_ARGS) but wrapped within an exception
    handler.  If an exception (enum return_reason) is thrown using
@@ -119,21 +204,21 @@ struct ui_out;
 typedef int (catch_exceptions_ftype) (struct ui_out *ui_out, void *args);
 extern int catch_exceptions (struct ui_out *uiout,
                             catch_exceptions_ftype *func, void *func_args,
-                            char *errstring, return_mask mask);
+                            return_mask mask);
 typedef void (catch_exception_ftype) (struct ui_out *ui_out, void *args);
 extern int catch_exceptions_with_msg (struct ui_out *uiout,
                                      catch_exceptions_ftype *func, 
                                      void *func_args,
-                                     char *errstring, char **gdberrmsg,
+                                     char **gdberrmsg,
                                      return_mask mask);
 
 /* This function, in addition, suppresses the printing of the captured
    error message.  It's up to the client to print it.  */
 
-extern struct exception catch_exception (struct ui_out *uiout,
-                                        catch_exception_ftype *func,
-                                        void *func_args,
-                                        return_mask mask);
+extern struct gdb_exception catch_exception (struct ui_out *uiout,
+                                            catch_exception_ftype *func,
+                                            void *func_args,
+                                            return_mask mask);
 
 /* If CATCH_ERRORS_FTYPE throws an error, catch_errors() returns zero
    otherwize the result from CATCH_ERRORS_FTYPE is returned. It is
This page took 0.029197 seconds and 4 git commands to generate.