mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00
modified include/reactos/libs/pseh/pseh2.h
Did you know gcc doesn't let PSEH deter it from inlining a function? Allocate the frame with __builtin_alloca so that this doesn't cause issues svn path=/trunk/; revision=38476
This commit is contained in:
parent
a1ffc8d05a
commit
25225baded
1 changed files with 9 additions and 7 deletions
|
@ -135,9 +135,6 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
|
||||||
#define ___SEH_STRINGIFY(X_) # X_
|
#define ___SEH_STRINGIFY(X_) # X_
|
||||||
#define __SEH_STRINGIFY(X_) ___SEH_STRINGIFY(X_)
|
#define __SEH_STRINGIFY(X_) ___SEH_STRINGIFY(X_)
|
||||||
|
|
||||||
#define __SEH_FORCE_NEST \
|
|
||||||
__asm__ __volatile__("#%0" : : "r" (&_SEHFrame))
|
|
||||||
|
|
||||||
#define __SEH_EXCEPT_RET long
|
#define __SEH_EXCEPT_RET long
|
||||||
#define __SEH_EXCEPT_ARGS __attribute__((unused)) _SEH2Frame_t * _SEH2FrameP, __attribute__((unused)) struct _EXCEPTION_POINTERS * _SEHExceptionInformation
|
#define __SEH_EXCEPT_ARGS __attribute__((unused)) _SEH2Frame_t * _SEH2FrameP, __attribute__((unused)) struct _EXCEPTION_POINTERS * _SEHExceptionInformation
|
||||||
#define __SEH_EXCEPT_ARGS_ , __SEH_EXCEPT_ARGS
|
#define __SEH_EXCEPT_ARGS_ , __SEH_EXCEPT_ARGS
|
||||||
|
@ -202,14 +199,16 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
|
||||||
__label__ _SEHDoTry; \
|
__label__ _SEHDoTry; \
|
||||||
__label__ _SEHAfterTry; \
|
__label__ _SEHAfterTry; \
|
||||||
static const int _SEH2ScopeKind = 0; \
|
static const int _SEH2ScopeKind = 0; \
|
||||||
_SEH2Frame_t _SEHFrame; \
|
|
||||||
volatile _SEH2TryLevel_t _SEHTryLevel; \
|
volatile _SEH2TryLevel_t _SEHTryLevel; \
|
||||||
_SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \
|
void * _SEHStackPointer; \
|
||||||
volatile _SEH2TryLevel_t * const _SEH2TryLevelP = &_SEHTryLevel; \
|
volatile _SEH2TryLevel_t * const _SEH2TryLevelP = &_SEHTryLevel; \
|
||||||
|
_SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? \
|
||||||
|
({ __asm__ __volatile__("mov %%esp, %0" : "=g" (_SEHStackPointer)); __builtin_alloca(sizeof(_SEH2Frame_t)); }) : \
|
||||||
|
_SEHCurFrameP; \
|
||||||
\
|
\
|
||||||
(void)_SEH2ScopeKind; \
|
(void)_SEH2ScopeKind; \
|
||||||
(void)_SEHFrame; \
|
|
||||||
(void)_SEHTryLevel; \
|
(void)_SEHTryLevel; \
|
||||||
|
(void)_SEHStackPointer; \
|
||||||
(void)_SEH2FrameP; \
|
(void)_SEH2FrameP; \
|
||||||
(void)_SEH2TryLevelP; \
|
(void)_SEH2TryLevelP; \
|
||||||
\
|
\
|
||||||
|
@ -220,7 +219,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
|
||||||
__SEH_ENTER_TRYLEVEL(); \
|
__SEH_ENTER_TRYLEVEL(); \
|
||||||
\
|
\
|
||||||
if(_SEHTopTryLevel) \
|
if(_SEHTopTryLevel) \
|
||||||
_SEH2EnterFrame(&_SEHFrame); \
|
_SEH2EnterFrame(_SEH2FrameP); \
|
||||||
|
|
||||||
#define __SEH_END_SCOPE \
|
#define __SEH_END_SCOPE \
|
||||||
} \
|
} \
|
||||||
|
@ -346,7 +345,10 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
|
||||||
\
|
\
|
||||||
_SEHAfterTry:; \
|
_SEHAfterTry:; \
|
||||||
if(_SEHTopTryLevel) \
|
if(_SEHTopTryLevel) \
|
||||||
|
{ \
|
||||||
_SEH2LeaveFrame(); \
|
_SEH2LeaveFrame(); \
|
||||||
|
__asm__ __volatile__("mov %0, %%esp" : : "g" (_SEHStackPointer)); \
|
||||||
|
} \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
__SEH_LEAVE_TRYLEVEL(); \
|
__SEH_LEAVE_TRYLEVEL(); \
|
||||||
|
|
Loading…
Reference in a new issue