/* 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.
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free
+ Software Foundation, Inc.
This file is part of GDB.
#ifndef EXCEPTIONS_H
#define EXCEPTIONS_H
+struct ui_out;
+
+#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
/* 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 exception'' message field provides more
+ detail. */
+ TLS_GENERIC_ERROR,
+
/* Add more errors here. */
NR_ERRORS
};
/* A pre-defined non-exception. */
extern const struct 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 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 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. for _fprintf, prefix the message with PREFIX... */
+extern void exception_print (struct ui_file *file, struct exception e);
+extern void exception_fprintf (struct ui_file *file, struct exception e,
+ const char *prefix,
+ ...) ATTR_FORMAT (printf, 3, 4);
+
/* Throw an exception (as described by "struct exception"). Will
execute a LONG JUMP to the inner most containing exception handler
established using catch_exceptions() (or similar).
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_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
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,