master
  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
 14extern "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