26 #if defined(_USE_NATIVE_SEH) || defined(_MSC_VER) 29 #define _SEH2_TRY __try 30 #define _SEH2_FINALLY __finally 31 #define _SEH2_EXCEPT(...) __except(__VA_ARGS__) 33 #define _SEH2_GetExceptionInformation() (GetExceptionInformation()) 34 #define _SEH2_GetExceptionCode() (GetExceptionCode()) 35 #define _SEH2_AbnormalTermination() (AbnormalTermination()) 36 #define _SEH2_YIELD(STMT_) STMT_ 37 #define _SEH2_LEAVE __leave 38 #define _SEH2_VOLATILE 40 #elif defined(_USE_DUMMY_PSEH) || defined (__arm__) || defined(_M_AMD64) 46 #define _SEH2_FINALLY } { 47 #define _SEH2_EXCEPT(...) } if (_SEH2_Volatile0 || (0 && (__VA_ARGS__))) { 49 #define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS*)0) 50 #define _SEH2_GetExceptionCode() _SEH2_VolatileExceptionCode 51 #define _SEH2_AbnormalTermination() (0) 52 #define _SEH2_YIELD(STMT_) STMT_ 54 #define _SEH2_VOLATILE volatile 56 #elif defined(_USE_PSEH3) 61 #define _SEH2_TRY _SEH3_TRY 62 #define _SEH2_EXCEPT _SEH3_EXCEPT 63 #define _SEH2_FINALLY _SEH3_FINALLY 64 #define _SEH2_END _SEH3_END 65 #define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS*)_exception_info()) 66 #define _SEH2_GetExceptionCode _exception_code 67 #define _SEH2_AbnormalTermination _abnormal_termination 68 #define _SEH2_LEAVE _SEH3_LEAVE 69 #define _SEH2_YIELD(x) x 70 #define _SEH2_VOLATILE volatile 72 #elif defined(__GNUC__) 93 typedef struct __SEH2Frame
96 volatile struct __SEH2TryLevel *
volatile SF_TopTryLevel;
97 volatile unsigned long SF_Code;
101 typedef struct __SEH2TryLevel
103 volatile struct __SEH2TryLevel * ST_Next;
109 typedef struct __SEH2HandleTryLevel
111 _SEH2TryLevel_t SHT_Common;
112 void *
volatile SHT_Esp;
113 void *
volatile SHT_Ebp;
114 void *
volatile SHT_Ebx;
115 void *
volatile SHT_Esi;
116 void *
volatile SHT_Edi;
118 _SEH2HandleTryLevel_t;
125 extern __attribute__((returns_twice))
int __cdecl _SEH2EnterFrameAndHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
126 extern __attribute__((returns_twice))
int __cdecl _SEH2EnterHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
135 #if ((__GNUC__ >= 4) && (__GNUC_MINOR__ >= 7)) 137 #define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() _SEH_DontInline(); 139 #define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() 143 #define __SEH_SIDE_EFFECT __asm__ __volatile__("#") 146 #define __SEH_PRETEND_SIDE_EFFECT (void)0 149 #define __SEH_USE_LABEL(L_) if(__SEH_VOLATILE_FALSE) goto L_; 152 #define __SEH_PRETEND_USE_LABEL(L_) (void)(&&L_) 155 #define __SEH_BARRIER __asm__ __volatile__("#":::"memory") 158 #define __SEH_VOLATILE_ZERO ({ int zero = 0; __asm__ __volatile__("#" : "+g" (zero)); zero; }) 160 #define __SEH_VOLATILE_FALSE __builtin_expect(__SEH_VOLATILE_ZERO, 0) 161 #define __SEH_VOLATILE_TRUE __builtin_expect(!__SEH_VOLATILE_ZERO, 1) 163 #define ___SEH_STRINGIFY(X_) # X_ 164 #define __SEH_STRINGIFY(X_) ___SEH_STRINGIFY(X_) 166 #define __SEH_EXCEPT_RET long 167 #define __SEH_EXCEPT_ARGS __attribute__((unused)) _SEH2Frame_t * _SEH2FrameP, __attribute__((unused)) struct _EXCEPTION_POINTERS * _SEHExceptionInformation 168 #define __SEH_EXCEPT_ARGS_ , __SEH_EXCEPT_ARGS 169 #define __SEH_EXCEPT_PFN __SEH_DECLARE_EXCEPT_PFN 170 #define __SEH_DECLARE_EXCEPT_PFN(NAME_) __SEH_EXCEPT_RET (__cdecl * NAME_)(__SEH_EXCEPT_ARGS) 171 #define __SEH_DECLARE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS) 172 #define __SEH_DEFINE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS) 174 #define __SEH_FINALLY_RET void 175 #define __SEH_FINALLY_ARGS void 176 #define __SEH_FINALLY_ARGS_ 177 #define __SEH_FINALLY_PFN __SEH_DECLARE_FINALLY_PFN 178 #define __SEH_DECLARE_FINALLY_PFN(NAME_) __SEH_FINALLY_RET (__cdecl * NAME_)(__SEH_FINALLY_ARGS) 179 #define __SEH_DECLARE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS) 180 #define __SEH_DEFINE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS) 182 #define __SEH_RETURN_EXCEPT(R_) return (long)(R_) 183 #define __SEH_RETURN_FINALLY() return 185 #define __SEH_BEGIN_TRY \ 187 __label__ _SEHEndTry; \ 189 __SEH_PRETEND_USE_LABEL(_SEHEndTry); \ 194 #define __SEH_END_TRY \ 200 #define __SEH_SET_TRYLEVEL(TRYLEVEL_) \ 202 __SEH_BARRIER; _SEH2FrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \ 205 #define __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) (_SEH2EnterFrameAndTrylevel(_SEH2FrameP, (TRYLEVEL_))) 206 #define __SEH_ENTER_TRYLEVEL(TRYLEVEL_) ((__SEH_SET_TRYLEVEL((TRYLEVEL_))), 0) 208 #define __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterFrameAndHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_)) 209 #define __SEH_ENTER_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_)) 211 #define __SEH_ENTER_SCOPE(TRYLEVEL_) (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) : __SEH_ENTER_TRYLEVEL(TRYLEVEL_)) 212 #define __SEH_ENTER_HANDLE_SCOPE(TRYLEVEL_, HANDLE_) (({ __SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" ((TRYLEVEL_)->SHT_Esp)); __SEH_BARRIER; }), (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_)) : __SEH_ENTER_HANDLE_TRYLEVEL((TRYLEVEL_), (HANDLE_)))) 214 #define __SEH_LEAVE_TRYLEVEL() \ 215 if(!_SEHTopTryLevel) \ 217 __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \ 220 #define __SEH_LEAVE_FRAME() \ 221 if(_SEHTopTryLevel) \ 226 #define __SEH_END_SCOPE_CHAIN \ 227 static __attribute__((unused)) const int _SEH2ScopeKind = 1; \ 228 static __attribute__((unused)) _SEH2Frame_t * const _SEH2FrameP = 0; \ 229 static __attribute__((unused)) _SEH2TryLevel_t * const _SEH2TryLevelP = 0; 231 #define __SEH_BEGIN_SCOPE \ 234 const int _SEHTopTryLevel = (_SEH2ScopeKind != 0); \ 235 _SEH2Frame_t * const _SEHCurFrameP = _SEH2FrameP; \ 236 volatile _SEH2TryLevel_t * const _SEHPrevTryLevelP = _SEH2TryLevelP; \ 237 __attribute__((unused)) int _SEHAbnormalTermination; \ 239 (void)_SEHTopTryLevel; \ 240 (void)_SEHCurFrameP; \ 241 (void)_SEHPrevTryLevelP; \ 244 __label__ _SEHBeforeTry; \ 245 __label__ _SEHDoTry; \ 246 __label__ _SEHAfterTry; \ 247 static const int _SEH2ScopeKind = 0; \ 248 volatile _SEH2TryLevel_t _SEHTryLevel; \ 249 volatile _SEH2HandleTryLevel_t _SEHHandleTryLevel; \ 250 _SEH2Frame_t _SEH2Frame[_SEHTopTryLevel ? 1 : 0]; \ 251 volatile _SEH2TryLevel_t * _SEH2TryLevelP; \ 252 _SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? \ 253 _SEH2Frame : _SEHCurFrameP; \ 255 (void)_SEH2ScopeKind; \ 256 (void)_SEHTryLevel; \ 257 (void)_SEHHandleTryLevel; \ 259 (void)_SEH2TryLevelP; \ 261 goto _SEHBeforeTry; \ 265 #define __SEH_END_SCOPE \ 271 #define __SEH_SCOPE_LOCALS \ 272 __label__ _SEHBeginExcept; \ 273 __label__ _SEHEndExcept; \ 275 auto __SEH_DECLARE_FINALLY(_SEHFinally); 278 __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() \ 281 __SEH_SCOPE_LOCALS; \ 286 #define _SEH2_FINALLY \ 293 __SEH_PRETEND_USE_LABEL(_SEHBeginExcept); \ 294 __SEH_PRETEND_USE_LABEL(_SEHEndExcept); \ 296 _SEHTryLevel.ST_Filter = 0; \ 297 _SEHTryLevel.ST_Body = &_SEHFinally; \ 298 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \ 299 __SEH_ENTER_SCOPE(&_SEHTryLevel); \ 300 _SEH2TryLevelP = &_SEHTryLevel; \ 302 _SEHAbnormalTermination = 1; \ 307 _SEHAbnormalTermination = 0; \ 309 __SEH_LEAVE_TRYLEVEL(); \ 312 goto _SEHEndExcept; \ 316 __attribute__((noinline)) __SEH_DEFINE_FINALLY(_SEHFinally) \ 318 __SEH_END_SCOPE_CHAIN; \ 320 (void)_SEH2ScopeKind; \ 322 (void)_SEH2TryLevelP; \ 324 for(;; ({ __SEH_RETURN_FINALLY(); })) \ 327 #define _SEH2_EXCEPT(...) \ 336 __attribute__((unused)) struct _EXCEPTION_POINTERS * volatile _SEHExceptionInformation; \ 338 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) <= 0) \ 340 if((__VA_ARGS__) < 0) \ 342 _SEHTryLevel.ST_Filter = (void *)-1; \ 343 _SEHTryLevel.ST_Body = 0; \ 347 _SEHTryLevel.ST_Filter = (void *)0; \ 348 _SEHTryLevel.ST_Body = 0; \ 351 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \ 352 __SEH_ENTER_SCOPE(&_SEHTryLevel); \ 353 _SEH2TryLevelP = &_SEHTryLevel; \ 357 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) > 0) \ 358 _SEHHandleTryLevel.SHT_Common.ST_Filter = (void *)1; \ 361 __SEH_DEFINE_EXCEPT(_SEHExcept) \ 363 __SEH_RETURN_EXCEPT((__VA_ARGS__)); \ 366 _SEHHandleTryLevel.SHT_Common.ST_Filter = &_SEHExcept; \ 369 _SEHHandleTryLevel.SHT_Common.ST_Next = _SEHPrevTryLevelP; \ 370 _SEH2TryLevelP = &_SEHHandleTryLevel.SHT_Common; \ 372 if(__builtin_expect(__SEH_ENTER_HANDLE_SCOPE(&_SEHHandleTryLevel, &&_SEHBeginExcept), 0)) \ 373 goto _SEHBeginExcept; \ 379 __attribute__((unused)) __SEH_DEFINE_FINALLY(_SEHFinally) { __SEH_RETURN_FINALLY(); } \ 382 __SEH_LEAVE_TRYLEVEL(); \ 384 goto _SEHEndExcept; \ 398 __SEH_LEAVE_FRAME(); \ 402 #define _SEH2_GetExceptionInformation() (_SEHExceptionInformation) 403 #define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code) 404 #define _SEH2_AbnormalTermination() (_SEHAbnormalTermination) 406 #define _SEH2_YIELD(STMT_) \ 409 if(!_SEH2ScopeKind) \ 415 #define _SEH2_LEAVE goto _SEHEndTry 417 __SEH_END_SCOPE_CHAIN;
419 #define _SEH2_VOLATILE volatile 422 #error no PSEH support struct __SEH2Registration * SER_Prev
void __cdecl _SEH2Return(void)
typedef void struct _CONTEXT void *struct __SEH2Registration _SEH2Registration_t
_SEH2FrameHandler_t SER_Handler
void __cdecl _SEH2LeaveFrame(void)
int __cdecl _SEH2EnterFrameAndTrylevel(_SEH2Frame_t *frame, volatile _SEH2TryLevel_t *trylevel)
int _SEH2_VolatileExceptionCode
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *