modified include/reactos/libs/pseh/pseh2.h
authorKJK::Hyperion <hackbunny@reactos.org>
Tue, 30 Dec 2008 20:02:03 +0000 (20:02 +0000)
committerKJK::Hyperion <hackbunny@reactos.org>
Tue, 30 Dec 2008 20:02:03 +0000 (20:02 +0000)
   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

index 3f04dbb..31c0ab7 100644 (file)
@@ -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(); \