28#if defined(_USE_NATIVE_SEH) || defined(_MSC_VER)
30#define _SEH2_TRY __try
31#define _SEH2_FINALLY __finally
32#define _SEH2_EXCEPT(...) __except(__VA_ARGS__)
34#define _SEH2_GetExceptionInformation() (GetExceptionInformation())
35#define _SEH2_GetExceptionCode() (GetExceptionCode())
36#define _SEH2_AbnormalTermination() (AbnormalTermination())
37#define _SEH2_YIELD(STMT_) STMT_
38#define _SEH2_LEAVE __leave
43#elif defined(__GNUC__) && !defined(__clang__) && defined(_M_AMD64)
47#elif defined(_USE_DUMMY_PSEH) || defined (__arm__) || defined(_M_AMD64)
60_Pragma("GCC diagnostic push") \
61_Pragma("GCC diagnostic ignored \"-Wunused-label\"")\
63 __label__ __seh2_scope_end__;
65#define _SEH2_FINALLY \
66 __seh2_scope_end__:; \
70 __label__ __seh2_scope_end__;
72#define _SEH2_EXCEPT(...) \
73 __seh2_scope_end__:; \
75 if (_SEH2_Volatile0 || (0 && (__VA_ARGS__))) \
77 __label__ __seh2_scope_end__;
80 __seh2_scope_end__:; \
82_Pragma("GCC diagnostic pop")
84#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS*)0)
85#define _SEH2_GetExceptionCode() _SEH2_VolatileExceptionCode
86#define _SEH2_AbnormalTermination() (0)
87#define _SEH2_YIELD(STMT_) STMT_
88#define _SEH2_LEAVE goto __seh2_scope_end__;
89#define _SEH2_VOLATILE volatile
91#define __try _SEH2_TRY
92#define __except _SEH2_EXCEPT
93#define __finally _SEH2_FINALLY
94#define __endtry _SEH2_END
95#define __leave _SEH2_LEAVE
96#define _exception_code() 0
97#define _exception_info() ((void*)0)
99#elif defined(_USE_PSEH3)
104#define _SEH2_TRY _SEH3_TRY
105#define _SEH2_EXCEPT _SEH3_EXCEPT
106#define _SEH2_FINALLY _SEH3_FINALLY
107#define _SEH2_END _SEH3_END
108#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS*)_exception_info())
109#define _SEH2_GetExceptionCode _exception_code
110#define _SEH2_AbnormalTermination _abnormal_termination
111#define _SEH2_LEAVE _SEH3_LEAVE
112#define _SEH2_YIELD(x) x
113#define _SEH2_VOLATILE volatile
116#define __try _SEH3_TRY
117#define __except _SEH3_EXCEPT
118#define __finally _SEH3_FINALLY
119#define __endtry _SEH3_END
120#define __leave _SEH3_LEAVE
123#elif defined(__GNUC__)
137typedef struct __SEH2Registration
139 struct __SEH2Registration * SER_Prev;
140 _SEH2FrameHandler_t SER_Handler;
144typedef struct __SEH2Frame
146 _SEH2Registration_t SF_Registration;
147 volatile struct __SEH2TryLevel *
volatile SF_TopTryLevel;
148 volatile unsigned long SF_Code;
152typedef struct __SEH2TryLevel
154 volatile struct __SEH2TryLevel * ST_Next;
160typedef struct __SEH2HandleTryLevel
162 _SEH2TryLevel_t SHT_Common;
163 void *
volatile SHT_Esp;
164 void *
volatile SHT_Ebp;
165 void *
volatile SHT_Ebx;
166 void *
volatile SHT_Esi;
167 void *
volatile SHT_Edi;
169_SEH2HandleTryLevel_t;
176extern __attribute__((returns_twice))
int __cdecl _SEH2EnterFrameAndHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
177extern __attribute__((returns_twice))
int __cdecl _SEH2EnterHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
186#if ((__GNUC__ >= 4) && (__GNUC_MINOR__ >= 7))
188#define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() _SEH_DontInline();
190#define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS()
194#define __SEH_SIDE_EFFECT __asm__ __volatile__("#")
197#define __SEH_PRETEND_SIDE_EFFECT (void)0
200#define __SEH_USE_LABEL(L_) if(__SEH_VOLATILE_FALSE) goto L_;
203#define __SEH_PRETEND_USE_LABEL(L_) (void)(&&L_)
206#define __SEH_BARRIER __asm__ __volatile__("#":::"memory")
209#define __SEH_VOLATILE_ZERO ({ int zero = 0; __asm__ __volatile__("#" : "+g" (zero)); zero; })
211#define __SEH_VOLATILE_FALSE __builtin_expect(__SEH_VOLATILE_ZERO, 0)
212#define __SEH_VOLATILE_TRUE __builtin_expect(!__SEH_VOLATILE_ZERO, 1)
214#define ___SEH_STRINGIFY(X_) # X_
215#define __SEH_STRINGIFY(X_) ___SEH_STRINGIFY(X_)
217#define __SEH_EXCEPT_RET long
218#define __SEH_EXCEPT_ARGS __attribute__((unused)) _SEH2Frame_t * _SEH2FrameP, __attribute__((unused)) struct _EXCEPTION_POINTERS * _SEHExceptionInformation
219#define __SEH_EXCEPT_ARGS_ , __SEH_EXCEPT_ARGS
220#define __SEH_EXCEPT_PFN __SEH_DECLARE_EXCEPT_PFN
221#define __SEH_DECLARE_EXCEPT_PFN(NAME_) __SEH_EXCEPT_RET (__cdecl * NAME_)(__SEH_EXCEPT_ARGS)
222#define __SEH_DECLARE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS)
223#define __SEH_DEFINE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS)
225#define __SEH_FINALLY_RET void
226#define __SEH_FINALLY_ARGS void
227#define __SEH_FINALLY_ARGS_
228#define __SEH_FINALLY_PFN __SEH_DECLARE_FINALLY_PFN
229#define __SEH_DECLARE_FINALLY_PFN(NAME_) __SEH_FINALLY_RET (__cdecl * NAME_)(__SEH_FINALLY_ARGS)
230#define __SEH_DECLARE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS)
231#define __SEH_DEFINE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS)
233#define __SEH_RETURN_EXCEPT(R_) return (long)(R_)
234#define __SEH_RETURN_FINALLY() return
236#define __SEH_BEGIN_TRY \
238 __label__ _SEHEndTry; \
240 __SEH_PRETEND_USE_LABEL(_SEHEndTry); \
245#define __SEH_END_TRY \
251#define __SEH_SET_TRYLEVEL(TRYLEVEL_) \
253 __SEH_BARRIER; _SEH2FrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \
256#define __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) (_SEH2EnterFrameAndTrylevel(_SEH2FrameP, (TRYLEVEL_)))
257#define __SEH_ENTER_TRYLEVEL(TRYLEVEL_) ((__SEH_SET_TRYLEVEL((TRYLEVEL_))), 0)
259#define __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterFrameAndHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_))
260#define __SEH_ENTER_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_))
262#define __SEH_ENTER_SCOPE(TRYLEVEL_) (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) : __SEH_ENTER_TRYLEVEL(TRYLEVEL_))
263#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_))))
265#define __SEH_LEAVE_TRYLEVEL() \
266 if(!_SEHTopTryLevel) \
268 __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \
271#define __SEH_LEAVE_FRAME() \
272 if(_SEHTopTryLevel) \
277#define __SEH_END_SCOPE_CHAIN \
278 static __attribute__((unused)) const int _SEH2ScopeKind = 1; \
279 static __attribute__((unused)) _SEH2Frame_t * const _SEH2FrameP = 0; \
280 static __attribute__((unused)) _SEH2TryLevel_t * const _SEH2TryLevelP = 0;
282#define __SEH_BEGIN_SCOPE \
285 const int _SEHTopTryLevel = (_SEH2ScopeKind != 0); \
286 _SEH2Frame_t * const _SEHCurFrameP = _SEH2FrameP; \
287 volatile _SEH2TryLevel_t * const _SEHPrevTryLevelP = _SEH2TryLevelP; \
288 __attribute__((unused)) int _SEHAbnormalTermination; \
290 (void)_SEHTopTryLevel; \
291 (void)_SEHCurFrameP; \
292 (void)_SEHPrevTryLevelP; \
295 __label__ _SEHBeforeTry; \
296 __label__ _SEHDoTry; \
297 __label__ _SEHAfterTry; \
298 static const int _SEH2ScopeKind = 0; \
299 volatile _SEH2TryLevel_t _SEHTryLevel; \
300 volatile _SEH2HandleTryLevel_t _SEHHandleTryLevel; \
301 _SEH2Frame_t _SEH2Frame[_SEHTopTryLevel ? 1 : 0]; \
302 volatile _SEH2TryLevel_t * _SEH2TryLevelP; \
303 _SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? \
304 _SEH2Frame : _SEHCurFrameP; \
306 (void)_SEH2ScopeKind; \
307 (void)_SEHTryLevel; \
308 (void)_SEHHandleTryLevel; \
310 (void)_SEH2TryLevelP; \
312 goto _SEHBeforeTry; \
316#define __SEH_END_SCOPE \
322#define __SEH_SCOPE_LOCALS \
323 __label__ _SEHBeginExcept; \
324 __label__ _SEHEndExcept; \
326 auto __SEH_DECLARE_FINALLY(_SEHFinally);
329 __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() \
332 __SEH_SCOPE_LOCALS; \
337#define _SEH2_FINALLY \
344 __SEH_PRETEND_USE_LABEL(_SEHBeginExcept); \
345 __SEH_PRETEND_USE_LABEL(_SEHEndExcept); \
347 _SEHTryLevel.ST_Filter = 0; \
348 _SEHTryLevel.ST_Body = &_SEHFinally; \
349 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
350 __SEH_ENTER_SCOPE(&_SEHTryLevel); \
351 _SEH2TryLevelP = &_SEHTryLevel; \
353 _SEHAbnormalTermination = 1; \
358 _SEHAbnormalTermination = 0; \
360 __SEH_LEAVE_TRYLEVEL(); \
363 goto _SEHEndExcept; \
367 __attribute__((noinline)) __SEH_DEFINE_FINALLY(_SEHFinally) \
369 __SEH_END_SCOPE_CHAIN; \
371 (void)_SEH2ScopeKind; \
373 (void)_SEH2TryLevelP; \
375 for(;; ({ __SEH_RETURN_FINALLY(); })) \
378#define _SEH2_EXCEPT(...) \
387 __attribute__((unused)) struct _EXCEPTION_POINTERS * volatile _SEHExceptionInformation; \
389 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) <= 0) \
391 if((__VA_ARGS__) < 0) \
393 _SEHTryLevel.ST_Filter = (void *)-1; \
394 _SEHTryLevel.ST_Body = 0; \
398 _SEHTryLevel.ST_Filter = (void *)0; \
399 _SEHTryLevel.ST_Body = 0; \
402 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
403 __SEH_ENTER_SCOPE(&_SEHTryLevel); \
404 _SEH2TryLevelP = &_SEHTryLevel; \
408 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) > 0) \
409 _SEHHandleTryLevel.SHT_Common.ST_Filter = (void *)1; \
412 __SEH_DEFINE_EXCEPT(_SEHExcept) \
414 __SEH_RETURN_EXCEPT((__VA_ARGS__)); \
417 _SEHHandleTryLevel.SHT_Common.ST_Filter = &_SEHExcept; \
420 _SEHHandleTryLevel.SHT_Common.ST_Next = _SEHPrevTryLevelP; \
421 _SEH2TryLevelP = &_SEHHandleTryLevel.SHT_Common; \
423 if(__builtin_expect(__SEH_ENTER_HANDLE_SCOPE(&_SEHHandleTryLevel, &&_SEHBeginExcept), 0)) \
424 goto _SEHBeginExcept; \
430 __attribute__((unused)) __SEH_DEFINE_FINALLY(_SEHFinally) { __SEH_RETURN_FINALLY(); } \
433 __SEH_LEAVE_TRYLEVEL(); \
435 goto _SEHEndExcept; \
449 __SEH_LEAVE_FRAME(); \
453#define _SEH2_GetExceptionInformation() (_SEHExceptionInformation)
454#define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
455#define _SEH2_AbnormalTermination() (_SEHAbnormalTermination)
457#define _SEH2_YIELD(STMT_) \
460 if(!_SEH2ScopeKind) \
466#define _SEH2_LEAVE goto _SEHEndTry
468__SEH_END_SCOPE_CHAIN;
470#define _SEH2_VOLATILE volatile
473#error no PSEH support
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
int _SEH2_VolatileExceptionCode
int __cdecl _SEH2EnterFrameAndTrylevel(_SEH2Frame_t *frame, volatile _SEH2TryLevel_t *trylevel)
void __cdecl _SEH2Return(void)
void __cdecl _SEH2LeaveFrame(void)