Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/local_includes/exception.h')
-rw-r--r--winsup/cygwin/local_includes/exception.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/winsup/cygwin/local_includes/exception.h b/winsup/cygwin/local_includes/exception.h
new file mode 100644
index 000000000..13159d17b
--- /dev/null
+++ b/winsup/cygwin/local_includes/exception.h
@@ -0,0 +1,57 @@
+/* exception.h
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#pragma once
+
+#define exception_list void
+typedef struct _DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT;
+
+class exception
+{
+ static EXCEPTION_DISPOSITION myfault (EXCEPTION_RECORD *, exception_list *,
+ CONTEXT *, PDISPATCHER_CONTEXT);
+ static EXCEPTION_DISPOSITION handle (EXCEPTION_RECORD *, exception_list *,
+ CONTEXT *, PDISPATCHER_CONTEXT);
+public:
+ exception () __attribute__ ((always_inline))
+ {
+ /* Install SEH handler. */
+ asm volatile ("\n\
+ 1: \n\
+ .seh_handler \
+ _ZN9exception6handleEP17_EXCEPTION_RECORDPvP8_CONTEXTP19_DISPATCHER_CONTEXT, \
+ @except \n\
+ .seh_handlerdata \n\
+ .long 1 \n\
+ .rva 1b, 2f, 2f, 2f \n\
+ .seh_code \n");
+ };
+ ~exception () __attribute__ ((always_inline))
+ {
+ asm volatile ("\n\
+ nop \n\
+ 2: \n\
+ nop \n");
+ }
+};
+
+LONG CALLBACK myfault_altstack_handler (EXCEPTION_POINTERS *);
+
+class cygwin_exception
+{
+ PUINT_PTR framep;
+ PCONTEXT ctx;
+ EXCEPTION_RECORD *e;
+ HANDLE h;
+ void dump_exception ();
+ void open_stackdumpfile ();
+public:
+ cygwin_exception (PUINT_PTR in_framep, PCONTEXT in_ctx = NULL, EXCEPTION_RECORD *in_e = NULL):
+ framep (in_framep), ctx (in_ctx), e (in_e), h (NULL) {}
+ void dumpstack ();
+ PCONTEXT context () const {return ctx;}
+ EXCEPTION_RECORD *exception_record () const {return e;}
+};