26#if defined(_USE_NATIVE_SEH) || (defined(_MSC_VER) && !(defined(__clang__) && defined(_M_AMD64)))
28#define _SEH2_TRY __try
29#define _SEH2_FINALLY __finally
30#define _SEH2_EXCEPT(...) __except(__VA_ARGS__)
32#define _SEH2_GetExceptionInformation() (GetExceptionInformation())
33#define _SEH2_GetExceptionCode() (GetExceptionCode())
34#define _SEH2_AbnormalTermination() (AbnormalTermination())
35#define _SEH2_YIELD(STMT_) STMT_
36#define _SEH2_LEAVE __leave
41#elif defined(__GNUC__) && !defined(__clang__) && defined(_M_AMD64)
45#elif defined(_USE_DUMMY_PSEH) || defined (__arm__) || defined(_M_AMD64)
58_Pragma("GCC diagnostic push") \
59_Pragma("GCC diagnostic ignored \"-Wunused-label\"")\
61 __label__ __seh2_scope_end__;
63#define _SEH2_FINALLY \
64 __seh2_scope_end__:; \
68 __label__ __seh2_scope_end__;
70#define _SEH2_EXCEPT(...) \
71 __seh2_scope_end__:; \
73 if (_SEH2_Volatile0 || (0 && (__VA_ARGS__))) \
75 __label__ __seh2_scope_end__;
78 __seh2_scope_end__:; \
80_Pragma("GCC diagnostic pop")
82#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS*)0)
83#define _SEH2_GetExceptionCode() _SEH2_VolatileExceptionCode
84#define _SEH2_AbnormalTermination() (0)
85#define _SEH2_YIELD(STMT_) STMT_
86#define _SEH2_LEAVE goto __seh2_scope_end__;
87#define _SEH2_VOLATILE volatile
89#elif defined(_USE_PSEH3)
94#define _SEH2_TRY _SEH3_TRY
95#define _SEH2_EXCEPT _SEH3_EXCEPT
96#define _SEH2_FINALLY _SEH3_FINALLY
97#define _SEH2_END _SEH3_END
98#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS*)_exception_info())
99#define _SEH2_GetExceptionCode _exception_code
100#define _SEH2_AbnormalTermination _abnormal_termination
101#define _SEH2_LEAVE _SEH3_LEAVE
102#define _SEH2_YIELD(x) x
103#define _SEH2_VOLATILE volatile
106#define __try _SEH3_TRY
107#define __except _SEH3_EXCEPT
108#define __finally _SEH3_FINALLY
109#define __endtry _SEH3_END
110#define __leave _SEH3_LEAVE
113#elif defined(__GNUC__)
127typedef struct __SEH2Registration
129 struct __SEH2Registration * SER_Prev;
130 _SEH2FrameHandler_t SER_Handler;
134typedef struct __SEH2Frame
136 _SEH2Registration_t SF_Registration;
137 volatile struct __SEH2TryLevel *
volatile SF_TopTryLevel;
138 volatile unsigned long SF_Code;
142typedef struct __SEH2TryLevel
144 volatile struct __SEH2TryLevel * ST_Next;
150typedef struct __SEH2HandleTryLevel
152 _SEH2TryLevel_t SHT_Common;
153 void *
volatile SHT_Esp;
154 void *
volatile SHT_Ebp;
155 void *
volatile SHT_Ebx;
156 void *
volatile SHT_Esi;
157 void *
volatile SHT_Edi;
159_SEH2HandleTryLevel_t;
166extern __attribute__((returns_twice))
int __cdecl _SEH2EnterFrameAndHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
167extern __attribute__((returns_twice))
int __cdecl _SEH2EnterHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
176#if ((__GNUC__ >= 4) && (__GNUC_MINOR__ >= 7))
178#define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() _SEH_DontInline();
180#define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS()
184#define __SEH_SIDE_EFFECT __asm__ __volatile__("#")
187#define __SEH_PRETEND_SIDE_EFFECT (void)0
190#define __SEH_USE_LABEL(L_) if(__SEH_VOLATILE_FALSE) goto L_;
193#define __SEH_PRETEND_USE_LABEL(L_) (void)(&&L_)
196#define __SEH_BARRIER __asm__ __volatile__("#":::"memory")
199#define __SEH_VOLATILE_ZERO ({ int zero = 0; __asm__ __volatile__("#" : "+g" (zero)); zero; })
201#define __SEH_VOLATILE_FALSE __builtin_expect(__SEH_VOLATILE_ZERO, 0)
202#define __SEH_VOLATILE_TRUE __builtin_expect(!__SEH_VOLATILE_ZERO, 1)
204#define ___SEH_STRINGIFY(X_) # X_
205#define __SEH_STRINGIFY(X_) ___SEH_STRINGIFY(X_)
207#define __SEH_EXCEPT_RET long
208#define __SEH_EXCEPT_ARGS __attribute__((unused)) _SEH2Frame_t * _SEH2FrameP, __attribute__((unused)) struct _EXCEPTION_POINTERS * _SEHExceptionInformation
209#define __SEH_EXCEPT_ARGS_ , __SEH_EXCEPT_ARGS
210#define __SEH_EXCEPT_PFN __SEH_DECLARE_EXCEPT_PFN
211#define __SEH_DECLARE_EXCEPT_PFN(NAME_) __SEH_EXCEPT_RET (__cdecl * NAME_)(__SEH_EXCEPT_ARGS)
212#define __SEH_DECLARE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS)
213#define __SEH_DEFINE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS)
215#define __SEH_FINALLY_RET void
216#define __SEH_FINALLY_ARGS void
217#define __SEH_FINALLY_ARGS_
218#define __SEH_FINALLY_PFN __SEH_DECLARE_FINALLY_PFN
219#define __SEH_DECLARE_FINALLY_PFN(NAME_) __SEH_FINALLY_RET (__cdecl * NAME_)(__SEH_FINALLY_ARGS)
220#define __SEH_DECLARE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS)
221#define __SEH_DEFINE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS)
223#define __SEH_RETURN_EXCEPT(R_) return (long)(R_)
224#define __SEH_RETURN_FINALLY() return
226#define __SEH_BEGIN_TRY \
228 __label__ _SEHEndTry; \
230 __SEH_PRETEND_USE_LABEL(_SEHEndTry); \
235#define __SEH_END_TRY \
241#define __SEH_SET_TRYLEVEL(TRYLEVEL_) \
243 __SEH_BARRIER; _SEH2FrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \
246#define __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) (_SEH2EnterFrameAndTrylevel(_SEH2FrameP, (TRYLEVEL_)))
247#define __SEH_ENTER_TRYLEVEL(TRYLEVEL_) ((__SEH_SET_TRYLEVEL((TRYLEVEL_))), 0)
249#define __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterFrameAndHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_))
250#define __SEH_ENTER_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_))
252#define __SEH_ENTER_SCOPE(TRYLEVEL_) (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) : __SEH_ENTER_TRYLEVEL(TRYLEVEL_))
253#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_))))
255#define __SEH_LEAVE_TRYLEVEL() \
256 if(!_SEHTopTryLevel) \
258 __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \
261#define __SEH_LEAVE_FRAME() \
262 if(_SEHTopTryLevel) \
267#define __SEH_END_SCOPE_CHAIN \
268 static __attribute__((unused)) const int _SEH2ScopeKind = 1; \
269 static __attribute__((unused)) _SEH2Frame_t * const _SEH2FrameP = 0; \
270 static __attribute__((unused)) _SEH2TryLevel_t * const _SEH2TryLevelP = 0;
272#define __SEH_BEGIN_SCOPE \
275 const int _SEHTopTryLevel = (_SEH2ScopeKind != 0); \
276 _SEH2Frame_t * const _SEHCurFrameP = _SEH2FrameP; \
277 volatile _SEH2TryLevel_t * const _SEHPrevTryLevelP = _SEH2TryLevelP; \
278 __attribute__((unused)) int _SEHAbnormalTermination; \
280 (void)_SEHTopTryLevel; \
281 (void)_SEHCurFrameP; \
282 (void)_SEHPrevTryLevelP; \
285 __label__ _SEHBeforeTry; \
286 __label__ _SEHDoTry; \
287 __label__ _SEHAfterTry; \
288 static const int _SEH2ScopeKind = 0; \
289 volatile _SEH2TryLevel_t _SEHTryLevel; \
290 volatile _SEH2HandleTryLevel_t _SEHHandleTryLevel; \
291 _SEH2Frame_t _SEH2Frame[_SEHTopTryLevel ? 1 : 0]; \
292 volatile _SEH2TryLevel_t * _SEH2TryLevelP; \
293 _SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? \
294 _SEH2Frame : _SEHCurFrameP; \
296 (void)_SEH2ScopeKind; \
297 (void)_SEHTryLevel; \
298 (void)_SEHHandleTryLevel; \
300 (void)_SEH2TryLevelP; \
302 goto _SEHBeforeTry; \
306#define __SEH_END_SCOPE \
312#define __SEH_SCOPE_LOCALS \
313 __label__ _SEHBeginExcept; \
314 __label__ _SEHEndExcept; \
316 auto __SEH_DECLARE_FINALLY(_SEHFinally);
319 __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() \
322 __SEH_SCOPE_LOCALS; \
327#define _SEH2_FINALLY \
334 __SEH_PRETEND_USE_LABEL(_SEHBeginExcept); \
335 __SEH_PRETEND_USE_LABEL(_SEHEndExcept); \
337 _SEHTryLevel.ST_Filter = 0; \
338 _SEHTryLevel.ST_Body = &_SEHFinally; \
339 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
340 __SEH_ENTER_SCOPE(&_SEHTryLevel); \
341 _SEH2TryLevelP = &_SEHTryLevel; \
343 _SEHAbnormalTermination = 1; \
348 _SEHAbnormalTermination = 0; \
350 __SEH_LEAVE_TRYLEVEL(); \
353 goto _SEHEndExcept; \
357 __attribute__((noinline)) __SEH_DEFINE_FINALLY(_SEHFinally) \
359 __SEH_END_SCOPE_CHAIN; \
361 (void)_SEH2ScopeKind; \
363 (void)_SEH2TryLevelP; \
365 for(;; ({ __SEH_RETURN_FINALLY(); })) \
368#define _SEH2_EXCEPT(...) \
377 __attribute__((unused)) struct _EXCEPTION_POINTERS * volatile _SEHExceptionInformation; \
379 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) <= 0) \
381 if((__VA_ARGS__) < 0) \
383 _SEHTryLevel.ST_Filter = (void *)-1; \
384 _SEHTryLevel.ST_Body = 0; \
388 _SEHTryLevel.ST_Filter = (void *)0; \
389 _SEHTryLevel.ST_Body = 0; \
392 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
393 __SEH_ENTER_SCOPE(&_SEHTryLevel); \
394 _SEH2TryLevelP = &_SEHTryLevel; \
398 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) > 0) \
399 _SEHHandleTryLevel.SHT_Common.ST_Filter = (void *)1; \
402 __SEH_DEFINE_EXCEPT(_SEHExcept) \
404 __SEH_RETURN_EXCEPT((__VA_ARGS__)); \
407 _SEHHandleTryLevel.SHT_Common.ST_Filter = &_SEHExcept; \
410 _SEHHandleTryLevel.SHT_Common.ST_Next = _SEHPrevTryLevelP; \
411 _SEH2TryLevelP = &_SEHHandleTryLevel.SHT_Common; \
413 if(__builtin_expect(__SEH_ENTER_HANDLE_SCOPE(&_SEHHandleTryLevel, &&_SEHBeginExcept), 0)) \
414 goto _SEHBeginExcept; \
420 __attribute__((unused)) __SEH_DEFINE_FINALLY(_SEHFinally) { __SEH_RETURN_FINALLY(); } \
423 __SEH_LEAVE_TRYLEVEL(); \
425 goto _SEHEndExcept; \
439 __SEH_LEAVE_FRAME(); \
443#define _SEH2_GetExceptionInformation() (_SEHExceptionInformation)
444#define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
445#define _SEH2_AbnormalTermination() (_SEHAbnormalTermination)
447#define _SEH2_YIELD(STMT_) \
450 if(!_SEH2ScopeKind) \
456#define _SEH2_LEAVE goto _SEHEndTry
458__SEH_END_SCOPE_CHAIN;
460#define _SEH2_VOLATILE volatile
463#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)