From 25225badedf9111165c17968aa6cfcc736f9fbcf Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Tue, 30 Dec 2008 20:02:03 +0000 Subject: [PATCH] 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 --- reactos/include/reactos/libs/pseh/pseh2.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h index 3f04dbbe211..31c0ab7b14f 100644 --- a/reactos/include/reactos/libs/pseh/pseh2.h +++ b/reactos/include/reactos/libs/pseh/pseh2.h @@ -135,9 +135,6 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) #define ___SEH_STRINGIFY(X_) # 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_ARGS __attribute__((unused)) _SEH2Frame_t * _SEH2FrameP, __attribute__((unused)) struct _EXCEPTION_POINTERS * _SEHExceptionInformation #define __SEH_EXCEPT_ARGS_ , __SEH_EXCEPT_ARGS @@ -202,14 +199,16 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) __label__ _SEHDoTry; \ __label__ _SEHAfterTry; \ static const int _SEH2ScopeKind = 0; \ - _SEH2Frame_t _SEHFrame; \ volatile _SEH2TryLevel_t _SEHTryLevel; \ - _SEH2Frame_t * const _SEH2FrameP = _SEHTopTryLevel ? &_SEHFrame : _SEHCurFrameP; \ + void * _SEHStackPointer; \ 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)_SEHFrame; \ (void)_SEHTryLevel; \ + (void)_SEHStackPointer; \ (void)_SEH2FrameP; \ (void)_SEH2TryLevelP; \ \ @@ -220,7 +219,7 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) __SEH_ENTER_TRYLEVEL(); \ \ if(_SEHTopTryLevel) \ - _SEH2EnterFrame(&_SEHFrame); \ + _SEH2EnterFrame(_SEH2FrameP); \ #define __SEH_END_SCOPE \ } \ @@ -346,7 +345,10 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) \ _SEHAfterTry:; \ if(_SEHTopTryLevel) \ + { \ _SEH2LeaveFrame(); \ + __asm__ __volatile__("mov %0, %%esp" : : "g" (_SEHStackPointer)); \ + } \ else \ { \ __SEH_LEAVE_TRYLEVEL(); \