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
92#define __try _SEH2_TRY
93#define __except _SEH2_EXCEPT
94#define __finally _SEH2_FINALLY
95#define __endtry _SEH2_END
96#define __leave _SEH2_LEAVE
98#define _exception_code() 0
99#define _exception_info() ((void*)0)
101#elif defined(_USE_PSEH3)
106#define _SEH2_TRY _SEH3_TRY
107#define _SEH2_EXCEPT _SEH3_EXCEPT
108#define _SEH2_FINALLY _SEH3_FINALLY
109#define _SEH2_END _SEH3_END
110#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS*)_exception_info())
111#define _SEH2_GetExceptionCode _exception_code
112#define _SEH2_AbnormalTermination _abnormal_termination
113#define _SEH2_LEAVE _SEH3_LEAVE
114#define _SEH2_YIELD(x) x
115#define _SEH2_VOLATILE volatile
118#define __try _SEH3_TRY
119#define __except _SEH3_EXCEPT
120#define __finally _SEH3_FINALLY
121#define __endtry _SEH3_END
122#define __leave _SEH3_LEAVE
125#elif defined(__GNUC__)
139typedef struct __SEH2Registration
141 struct __SEH2Registration * SER_Prev;
142 _SEH2FrameHandler_t SER_Handler;
146typedef struct __SEH2Frame
148 _SEH2Registration_t SF_Registration;
149 volatile struct __SEH2TryLevel *
volatile SF_TopTryLevel;
150 volatile unsigned long SF_Code;
154typedef struct __SEH2TryLevel
156 volatile struct __SEH2TryLevel * ST_Next;
162typedef struct __SEH2HandleTryLevel
164 _SEH2TryLevel_t SHT_Common;
165 void *
volatile SHT_Esp;
166 void *
volatile SHT_Ebp;
167 void *
volatile SHT_Ebx;
168 void *
volatile SHT_Esi;
169 void *
volatile SHT_Edi;
171_SEH2HandleTryLevel_t;
178extern __attribute__((returns_twice))
int __cdecl _SEH2EnterFrameAndHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
179extern __attribute__((returns_twice))
int __cdecl _SEH2EnterHandleTrylevel(_SEH2Frame_t *,
volatile _SEH2HandleTryLevel_t *,
void *);
188#if ((__GNUC__ >= 4) && (__GNUC_MINOR__ >= 7))
190#define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() _SEH_DontInline();
192#define __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS()
196#define __SEH_SIDE_EFFECT __asm__ __volatile__("#")
199#define __SEH_PRETEND_SIDE_EFFECT (void)0
202#define __SEH_USE_LABEL(L_) if(__SEH_VOLATILE_FALSE) goto L_;
205#define __SEH_PRETEND_USE_LABEL(L_) (void)(&&L_)
208#define __SEH_BARRIER __asm__ __volatile__("#":::"memory")
211#define __SEH_VOLATILE_ZERO ({ int zero = 0; __asm__ __volatile__("#" : "+g" (zero)); zero; })
213#define __SEH_VOLATILE_FALSE __builtin_expect(__SEH_VOLATILE_ZERO, 0)
214#define __SEH_VOLATILE_TRUE __builtin_expect(!__SEH_VOLATILE_ZERO, 1)
216#define ___SEH_STRINGIFY(X_) # X_
217#define __SEH_STRINGIFY(X_) ___SEH_STRINGIFY(X_)
219#define __SEH_EXCEPT_RET long
220#define __SEH_EXCEPT_ARGS __attribute__((unused)) _SEH2Frame_t * _SEH2FrameP, __attribute__((unused)) struct _EXCEPTION_POINTERS * _SEHExceptionInformation
221#define __SEH_EXCEPT_ARGS_ , __SEH_EXCEPT_ARGS
222#define __SEH_EXCEPT_PFN __SEH_DECLARE_EXCEPT_PFN
223#define __SEH_DECLARE_EXCEPT_PFN(NAME_) __SEH_EXCEPT_RET (__cdecl * NAME_)(__SEH_EXCEPT_ARGS)
224#define __SEH_DECLARE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS)
225#define __SEH_DEFINE_EXCEPT(NAME_) __SEH_EXCEPT_RET __cdecl NAME_(__SEH_EXCEPT_ARGS)
227#define __SEH_FINALLY_RET void
228#define __SEH_FINALLY_ARGS void
229#define __SEH_FINALLY_ARGS_
230#define __SEH_FINALLY_PFN __SEH_DECLARE_FINALLY_PFN
231#define __SEH_DECLARE_FINALLY_PFN(NAME_) __SEH_FINALLY_RET (__cdecl * NAME_)(__SEH_FINALLY_ARGS)
232#define __SEH_DECLARE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS)
233#define __SEH_DEFINE_FINALLY(NAME_) __SEH_FINALLY_RET __cdecl NAME_(__SEH_FINALLY_ARGS)
235#define __SEH_RETURN_EXCEPT(R_) return (long)(R_)
236#define __SEH_RETURN_FINALLY() return
238#define __SEH_BEGIN_TRY \
240 __label__ _SEHEndTry; \
242 __SEH_PRETEND_USE_LABEL(_SEHEndTry); \
247#define __SEH_END_TRY \
253#define __SEH_SET_TRYLEVEL(TRYLEVEL_) \
255 __SEH_BARRIER; _SEH2FrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \
258#define __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) (_SEH2EnterFrameAndTrylevel(_SEH2FrameP, (TRYLEVEL_)))
259#define __SEH_ENTER_TRYLEVEL(TRYLEVEL_) ((__SEH_SET_TRYLEVEL((TRYLEVEL_))), 0)
261#define __SEH_ENTER_FRAME_AND_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterFrameAndHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_))
262#define __SEH_ENTER_HANDLE_TRYLEVEL(TRYLEVEL_, HANDLE_) _SEH2EnterHandleTrylevel(_SEH2FrameP, (TRYLEVEL_), (HANDLE_))
264#define __SEH_ENTER_SCOPE(TRYLEVEL_) (_SEHTopTryLevel ? __SEH_ENTER_FRAME_AND_TRYLEVEL(TRYLEVEL_) : __SEH_ENTER_TRYLEVEL(TRYLEVEL_))
265#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_))))
267#define __SEH_LEAVE_TRYLEVEL() \
268 if(!_SEHTopTryLevel) \
270 __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP); \
273#define __SEH_LEAVE_FRAME() \
274 if(_SEHTopTryLevel) \
279#define __SEH_END_SCOPE_CHAIN \
280 static __attribute__((unused)) const int _SEH2ScopeKind = 1; \
281 static __attribute__((unused)) _SEH2Frame_t * const _SEH2FrameP = 0; \
282 static __attribute__((unused)) _SEH2TryLevel_t * const _SEH2TryLevelP = 0;
284#define __SEH_BEGIN_SCOPE \
287 const int _SEHTopTryLevel = (_SEH2ScopeKind != 0); \
288 _SEH2Frame_t * const _SEHCurFrameP = _SEH2FrameP; \
289 volatile _SEH2TryLevel_t * const _SEHPrevTryLevelP = _SEH2TryLevelP; \
290 __attribute__((unused)) int _SEHAbnormalTermination; \
292 (void)_SEHTopTryLevel; \
293 (void)_SEHCurFrameP; \
294 (void)_SEHPrevTryLevelP; \
297 __label__ _SEHBeforeTry; \
298 __label__ _SEHDoTry; \
299 __label__ _SEHAfterTry; \
300 static const int _SEH2ScopeKind = 0; \
301 volatile _SEH2TryLevel_t _SEHTryLevel; \
302 volatile _SEH2HandleTryLevel_t _SEHHandleTryLevel; \
303 _SEH2Frame_t _SEH2Frame[_SEHTopTryLevel ? 1 : 0]; \
304 volatile _SEH2TryLevel_t * _SEH2TryLevelP; \
305 _SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? \
306 _SEH2Frame : _SEHCurFrameP; \
308 (void)_SEH2ScopeKind; \
309 (void)_SEHTryLevel; \
310 (void)_SEHHandleTryLevel; \
312 (void)_SEH2TryLevelP; \
314 goto _SEHBeforeTry; \
318#define __SEH_END_SCOPE \
324#define __SEH_SCOPE_LOCALS \
325 __label__ _SEHBeginExcept; \
326 __label__ _SEHEndExcept; \
328 auto __SEH_DECLARE_FINALLY(_SEHFinally);
331 __PREVENT_GCC_FROM_INLINING_SEH_FUNCTIONS() \
334 __SEH_SCOPE_LOCALS; \
339#define _SEH2_FINALLY \
346 __SEH_PRETEND_USE_LABEL(_SEHBeginExcept); \
347 __SEH_PRETEND_USE_LABEL(_SEHEndExcept); \
349 _SEHTryLevel.ST_Filter = 0; \
350 _SEHTryLevel.ST_Body = &_SEHFinally; \
351 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
352 __SEH_ENTER_SCOPE(&_SEHTryLevel); \
353 _SEH2TryLevelP = &_SEHTryLevel; \
355 _SEHAbnormalTermination = 1; \
360 _SEHAbnormalTermination = 0; \
362 __SEH_LEAVE_TRYLEVEL(); \
365 goto _SEHEndExcept; \
369 __attribute__((noinline)) __SEH_DEFINE_FINALLY(_SEHFinally) \
371 __SEH_END_SCOPE_CHAIN; \
373 (void)_SEH2ScopeKind; \
375 (void)_SEH2TryLevelP; \
377 for(;; ({ __SEH_RETURN_FINALLY(); })) \
380#define _SEH2_EXCEPT(...) \
389 __attribute__((unused)) struct _EXCEPTION_POINTERS * volatile _SEHExceptionInformation; \
391 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) <= 0) \
393 if((__VA_ARGS__) < 0) \
395 _SEHTryLevel.ST_Filter = (void *)-1; \
396 _SEHTryLevel.ST_Body = 0; \
400 _SEHTryLevel.ST_Filter = (void *)0; \
401 _SEHTryLevel.ST_Body = 0; \
404 _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
405 __SEH_ENTER_SCOPE(&_SEHTryLevel); \
406 _SEH2TryLevelP = &_SEHTryLevel; \
410 if(__builtin_constant_p((__VA_ARGS__)) && (__VA_ARGS__) > 0) \
411 _SEHHandleTryLevel.SHT_Common.ST_Filter = (void *)1; \
414 __SEH_DEFINE_EXCEPT(_SEHExcept) \
416 __SEH_RETURN_EXCEPT((__VA_ARGS__)); \
419 _SEHHandleTryLevel.SHT_Common.ST_Filter = &_SEHExcept; \
422 _SEHHandleTryLevel.SHT_Common.ST_Next = _SEHPrevTryLevelP; \
423 _SEH2TryLevelP = &_SEHHandleTryLevel.SHT_Common; \
425 if(__builtin_expect(__SEH_ENTER_HANDLE_SCOPE(&_SEHHandleTryLevel, &&_SEHBeginExcept), 0)) \
426 goto _SEHBeginExcept; \
432 __attribute__((unused)) __SEH_DEFINE_FINALLY(_SEHFinally) { __SEH_RETURN_FINALLY(); } \
435 __SEH_LEAVE_TRYLEVEL(); \
437 goto _SEHEndExcept; \
451 __SEH_LEAVE_FRAME(); \
455#define _SEH2_GetExceptionInformation() (_SEHExceptionInformation)
456#define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
457#define _SEH2_AbnormalTermination() (_SEHAbnormalTermination)
459#define _SEH2_YIELD(STMT_) \
462 if(!_SEH2ScopeKind) \
468#define _SEH2_LEAVE goto _SEHEndTry
470__SEH_END_SCOPE_CHAIN;
472#define _SEH2_VOLATILE volatile
475#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)