1 /** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the mingw-w64 runtime package. 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package. 5 */ 6 #ifndef _INC_EXCPT 7 #define _INC_EXCPT 8 9 #include <crtdefs.h> 10 11 #pragma pack(push,_CRT_PACKING) 12 13 #ifdef __cplusplus 14 extern "C" { 15 #endif 16 17 struct _EXCEPTION_POINTERS; 18 19 #ifndef EXCEPTION_DISPOSITION 20 #define EXCEPTION_DISPOSITION int 21 #endif 22 #define ExceptionContinueExecution 0 23 #define ExceptionContinueSearch 1 24 #define ExceptionNestedException 2 25 #define ExceptionCollidedUnwind 3 26 #define ExceptionExecuteHandler 4 27 28 #if (defined(_X86_) && !defined(__x86_64)) 29 struct _EXCEPTION_RECORD; 30 struct _CONTEXT; 31 32 EXCEPTION_DISPOSITION __cdecl _except_handler(struct _EXCEPTION_RECORD *_ExceptionRecord,void *_EstablisherFrame,struct _CONTEXT *_ContextRecord,void *_DispatcherContext); 33 #elif defined(__ia64__) 34 35 typedef struct _EXCEPTION_POINTERS *Exception_info_ptr; 36 struct _EXCEPTION_RECORD; 37 struct _CONTEXT; 38 struct _DISPATCHER_CONTEXT; 39 40 __MINGW_EXTENSION _CRTIMP EXCEPTION_DISPOSITION __cdecl __C_specific_handler (struct _EXCEPTION_RECORD *_ExceptionRecord,unsigned __int64 _MemoryStackFp,unsigned __int64 _BackingStoreFp,struct _CONTEXT *_ContextRecord,struct _DISPATCHER_CONTEXT *_DispatcherContext,unsigned __int64 _GlobalPointer); 41 #elif defined(__x86_64) || defined(__arm__) || defined(__aarch64__) 42 43 struct _EXCEPTION_RECORD; 44 struct _CONTEXT; 45 struct _DISPATCHER_CONTEXT; 46 47 __MINGW_EXTENSION _CRTIMP EXCEPTION_DISPOSITION __cdecl __C_specific_handler (struct _EXCEPTION_RECORD *_ExceptionRecord, void *_EstablisherFrame, struct _CONTEXT *_ContextRecord, struct _DISPATCHER_CONTEXT *_DispatcherContext); 48 #endif 49 50 #define GetExceptionCode _exception_code 51 #define exception_code _exception_code 52 #define GetExceptionInformation (struct _EXCEPTION_POINTERS *)_exception_info 53 #define exception_info (struct _EXCEPTION_POINTERS *)_exception_info 54 #define AbnormalTermination _abnormal_termination 55 #define abnormal_termination _abnormal_termination 56 57 unsigned long __cdecl _exception_code(void); 58 void *__cdecl _exception_info(void); 59 int __cdecl _abnormal_termination(void); 60 61 #define EXCEPTION_EXECUTE_HANDLER 1 62 #define EXCEPTION_CONTINUE_SEARCH 0 63 #define EXCEPTION_CONTINUE_EXECUTION -1 64 65 /* CRT stuff */ 66 typedef void (__cdecl * _PHNDLR)(int); 67 68 struct _XCPT_ACTION { 69 unsigned long XcptNum; 70 int SigNum; 71 _PHNDLR XcptAction; 72 }; 73 74 extern struct _XCPT_ACTION _XcptActTab[]; 75 extern int _XcptActTabCount; 76 extern int _XcptActTabSize; 77 extern int _First_FPE_Indx; 78 extern int _Num_FPE; 79 80 int __cdecl __CppXcptFilter(unsigned long _ExceptionNum,struct _EXCEPTION_POINTERS * _ExceptionPtr); 81 int __cdecl _XcptFilter(unsigned long _ExceptionNum,struct _EXCEPTION_POINTERS * _ExceptionPtr); 82 83 /* 84 * The type of function that is expected as an exception handler to be 85 * installed with __try1. 86 */ 87 typedef EXCEPTION_DISPOSITION (*PEXCEPTION_HANDLER)(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*); 88 89 #if !defined (HAVE_NO_SEH) && defined (__MINGW_EXCPT_DEFINE_PSDK) 90 /* 91 * This is not entirely necessary, but it is the structure installed by 92 * the __try1 primitive below. 93 */ 94 typedef struct _EXCEPTION_REGISTRATION { 95 struct _EXCEPTION_REGISTRATION *prev; 96 EXCEPTION_DISPOSITION (*handler)(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*); 97 } EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION; 98 99 typedef EXCEPTION_REGISTRATION EXCEPTION_REGISTRATION_RECORD; 100 typedef PEXCEPTION_REGISTRATION PEXCEPTION_REGISTRATION_RECORD; 101 #endif 102 103 #if (defined(_X86_) && !defined(__x86_64)) 104 #define __try1(pHandler) \ 105 __asm__ __volatile__ ("pushl %0;pushl %%fs:0;movl %%esp,%%fs:0;" : : "g" (pHandler)); 106 107 #define __except1 \ 108 __asm__ __volatile__ ("movl (%%esp),%%eax;movl %%eax,%%fs:0;addl $8,%%esp;" \ 109 : : : "%eax"); 110 #elif defined(__x86_64) 111 #define __try1(pHandler) \ 112 __asm__ __volatile__ ("\t.l_startw:\n" \ 113 "\t.seh_handler __C_specific_handler, @except\n" \ 114 "\t.seh_handlerdata\n" \ 115 "\t.long 1\n" \ 116 "\t.rva .l_startw, .l_endw, " __MINGW64_STRINGIFY(__MINGW_USYMBOL(pHandler)) " ,.l_endw\n" \ 117 "\t.text" \ 118 ); 119 #define __except1 \ 120 asm ("\tnop\n" \ 121 "\t.l_endw: nop\n"); 122 #else 123 #define __try1(pHandler) 124 #define __except1 125 #endif 126 127 #ifdef __cplusplus 128 } 129 #endif 130 131 #pragma pack(pop) 132 #endif 133