Allow pseh.h and pseh2.h to be included in the same compilation unit. Mixing PSEH and PSEH 2.0 macros in the same function isn't safe yet, though

svn path=/trunk/; revision=37601
This commit is contained in:
KJK::Hyperion 2008-11-23 23:00:37 +00:00
parent eba975aff9
commit 0d89ee1b23

View file

@ -31,7 +31,7 @@ struct _EXCEPTION_RECORD;
struct _EXCEPTION_POINTERS; struct _EXCEPTION_POINTERS;
struct _CONTEXT; struct _CONTEXT;
typedef int (__cdecl * _SEHFrameHandler_t) typedef int (__cdecl * _SEH2FrameHandler_t)
( (
struct _EXCEPTION_RECORD *, struct _EXCEPTION_RECORD *,
void *, void *,
@ -94,12 +94,12 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
/* Soft memory barrier */ /* Soft memory barrier */
#define __SEH_BARRIER __asm__ __volatile__("#":::"memory") #define __SEH_BARRIER __asm__ __volatile__("#":::"memory")
typedef struct __SEHRegistration typedef struct __SEH2Registration
{ {
struct __SEHRegistration * SER_Prev; struct __SEH2Registration * SER_Prev;
_SEHFrameHandler_t SER_Handler; _SEH2FrameHandler_t SER_Handler;
} }
_SEHRegistration_t; _SEH2Registration_t;
#define __SEH_FORCE_NEST \ #define __SEH_FORCE_NEST \
__asm__ __volatile__("#%0" : : "r" (&_SEHFrame)) __asm__ __volatile__("#%0" : : "r" (&_SEHFrame))
@ -118,24 +118,24 @@ _SEHRegistration_t;
#define __SEH_RETURN_EXCEPT(R_) return (int)(R_) #define __SEH_RETURN_EXCEPT(R_) return (int)(R_)
#define __SEH_RETURN_FINALLY() return #define __SEH_RETURN_FINALLY() return
typedef struct __SEHFrame typedef struct __SEH2Frame
{ {
_SEHRegistration_t SF_Registration; _SEH2Registration_t SF_Registration;
volatile struct __SEHTryLevel * volatile SF_TopTryLevel; volatile struct __SEH2TryLevel * volatile SF_TopTryLevel;
void * volatile SF_FramePointer; void * volatile SF_FramePointer;
void * volatile SF_StackPointer; void * volatile SF_StackPointer;
volatile unsigned long SF_Code; volatile unsigned long SF_Code;
} }
_SEHFrame_t; _SEH2Frame_t;
typedef struct __SEHTryLevel typedef struct __SEH2TryLevel
{ {
volatile struct __SEHTryLevel * ST_Next; volatile struct __SEH2TryLevel * ST_Next;
void * ST_FramePointer; void * ST_FramePointer;
void * ST_Filter; void * ST_Filter;
void * ST_Body; void * ST_Body;
} }
_SEHTryLevel_t; _SEH2TryLevel_t;
#define __SEH_BEGIN_TRY \ #define __SEH_BEGIN_TRY \
{ \ { \
@ -157,16 +157,16 @@ _SEHTryLevel_t;
#define __SEH_SET_TRYLEVEL(TRYLEVEL_) \ #define __SEH_SET_TRYLEVEL(TRYLEVEL_) \
{ \ { \
__SEH_BARRIER; _SEHFrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \ __SEH_BARRIER; _SEH2FrameP->SF_TopTryLevel = (TRYLEVEL_); __SEH_BARRIER; \
} }
#define __SEH_ENTER_TRYLEVEL() __SEH_SET_TRYLEVEL(&_SEHTryLevel) #define __SEH_ENTER_TRYLEVEL() __SEH_SET_TRYLEVEL(&_SEHTryLevel)
#define __SEH_LEAVE_TRYLEVEL() __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP) #define __SEH_LEAVE_TRYLEVEL() __SEH_SET_TRYLEVEL(_SEHPrevTryLevelP)
#define __SEH_END_SCOPE_CHAIN \ #define __SEH_END_SCOPE_CHAIN \
static const int _SEHScopeKind = 1; \ static const int _SEH2ScopeKind = 1; \
static _SEHFrame_t * const _SEHFrameP = 0; \ static _SEH2Frame_t * const _SEH2FrameP = 0; \
static _SEHTryLevel_t * const _SEHTryLevelP = 0; static _SEH2TryLevel_t * const _SEH2TryLevelP = 0;
#define __SEH_BEGIN_SCOPE \ #define __SEH_BEGIN_SCOPE \
for(;;) \ for(;;) \
@ -176,9 +176,9 @@ _SEHTryLevel_t;
\ \
_SEHBeginScope: __SEH_SIDE_EFFECT; \ _SEHBeginScope: __SEH_SIDE_EFFECT; \
\ \
const int _SEHTopTryLevel = (_SEHScopeKind != 0); \ const int _SEHTopTryLevel = (_SEH2ScopeKind != 0); \
_SEHFrame_t * const _SEHCurFrameP = _SEHFrameP; \ _SEH2Frame_t * const _SEHCurFrameP = _SEH2FrameP; \
volatile _SEHTryLevel_t * const _SEHPrevTryLevelP = _SEHTryLevelP; \ volatile _SEH2TryLevel_t * const _SEHPrevTryLevelP = _SEH2TryLevelP; \
\ \
(void)_SEHTopTryLevel; \ (void)_SEHTopTryLevel; \
(void)_SEHCurFrameP; \ (void)_SEHCurFrameP; \
@ -191,17 +191,17 @@ _SEHTryLevel_t;
__label__ _SEHBeforeTry; \ __label__ _SEHBeforeTry; \
__label__ _SEHDoTry; \ __label__ _SEHDoTry; \
__label__ _SEHAfterTry; \ __label__ _SEHAfterTry; \
static const int _SEHScopeKind = 0; \ static const int _SEH2ScopeKind = 0; \
_SEHFrame_t _SEHFrame; \ _SEH2Frame_t _SEHFrame; \
volatile _SEHTryLevel_t _SEHTryLevel; \ volatile _SEH2TryLevel_t _SEHTryLevel; \
_SEHFrame_t * const _SEHFrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \ _SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \
volatile _SEHTryLevel_t * const _SEHTryLevelP = &_SEHTryLevel; \ volatile _SEH2TryLevel_t * const _SEH2TryLevelP = &_SEHTryLevel; \
\ \
(void)_SEHScopeKind; \ (void)_SEH2ScopeKind; \
(void)_SEHFrame; \ (void)_SEHFrame; \
(void)_SEHTryLevel; \ (void)_SEHTryLevel; \
(void)_SEHFrameP; \ (void)_SEH2FrameP; \
(void)_SEHTryLevelP; \ (void)_SEH2TryLevelP; \
\ \
_SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \ _SEHTryLevel.ST_Next = _SEHPrevTryLevelP; \
goto _SEHBeforeTry; \ goto _SEHBeforeTry; \
@ -274,9 +274,9 @@ _SEHTryLevel_t;
{ \ { \
__SEH_END_SCOPE_CHAIN; \ __SEH_END_SCOPE_CHAIN; \
\ \
(void)_SEHScopeKind; \ (void)_SEH2ScopeKind; \
(void)_SEHFrameP; \ (void)_SEH2FrameP; \
(void)_SEHTryLevelP; \ (void)_SEH2TryLevelP; \
\ \
__SEH_NESTED_PROLOG; \ __SEH_NESTED_PROLOG; \
\ \
@ -299,7 +299,7 @@ _SEHTryLevel_t;
_SEHTryLevel.ST_FramePointer = _SEHClosureFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \ _SEHTryLevel.ST_FramePointer = _SEHClosureFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \
_SEHTryLevel.ST_Filter = _SEHFunctionFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \ _SEHTryLevel.ST_Filter = _SEHFunctionFromTrampoline((_SEHTrampoline_t *)&_SEHExcept); \
_SEHTryLevel.ST_Body = &&_SEHBeginExcept; \ _SEHTryLevel.ST_Body = &&_SEHBeginExcept; \
__SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" (_SEHFrameP->SF_StackPointer)); __SEH_BARRIER; \ __SEH_BARRIER; __asm__ __volatile__("mov %%esp, %0" : "=m" (_SEH2FrameP->SF_StackPointer)); __SEH_BARRIER; \
\ \
goto _SEHDoTry; \ goto _SEHDoTry; \
\ \
@ -324,8 +324,8 @@ _SEHTryLevel_t;
_SEHBeginExcept: __SEH_SIDE_EFFECT; \ _SEHBeginExcept: __SEH_SIDE_EFFECT; \
{ \ { \
{ \ { \
_SEHFrame_t * const _SEHFrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \ _SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \
(void)_SEHFrameP; \ (void)_SEH2FrameP; \
__SEH_BARRIER; __SEH_BARRIER;
#define _SEH2_END \ #define _SEH2_END \
@ -337,12 +337,12 @@ _SEHTryLevel_t;
__SEH_END_SCOPE; __SEH_END_SCOPE;
#define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers) #define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers)
#define _SEH2_GetExceptionCode() ((_SEHFrameP)->SF_Code) #define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code)
#define _SEH2_YIELD(STMT_) \ #define _SEH2_YIELD(STMT_) \
for(;;) \ for(;;) \
{ \ { \
if(!_SEHScopeKind) \ if(!_SEH2ScopeKind) \
_SEH2Return(); \ _SEH2Return(); \
\ \
STMT_; \ STMT_; \
@ -357,7 +357,7 @@ extern "C"
{ {
#endif #endif
extern void __cdecl _SEH2EnterFrame(_SEHFrame_t *); extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t *);
extern void __cdecl _SEH2LeaveFrame(void); extern void __cdecl _SEH2LeaveFrame(void);
extern void __cdecl _SEH2Return(void); extern void __cdecl _SEH2Return(void);