From 58c81ba19415e9ba4143a95e80d6dd1db91eb93c Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Wed, 26 Nov 2008 16:03:12 +0000 Subject: [PATCH] modified include/reactos/libs/pseh/pseh2.h If the compiler is not GCC, assume native SEH support modified lib/pseh/framebased-gcchack.c modified lib/pseh/i386/framebased-gcchack.S Allow pseh to be compiled with Visual C++ without warnings svn path=/trunk/; revision=37663 --- reactos/include/reactos/libs/pseh/pseh2.h | 95 +++++++++++++--------- reactos/lib/pseh/framebased-gcchack.c | 59 ++++++++------ reactos/lib/pseh/i386/framebased-gcchack.S | 22 +++++ 3 files changed, 112 insertions(+), 64 deletions(-) diff --git a/reactos/include/reactos/libs/pseh/pseh2.h b/reactos/include/reactos/libs/pseh/pseh2.h index fe05d6b3bd2..367c633dc57 100644 --- a/reactos/include/reactos/libs/pseh/pseh2.h +++ b/reactos/include/reactos/libs/pseh/pseh2.h @@ -23,10 +23,6 @@ #ifndef KJK_PSEH2_H_ #define KJK_PSEH2_H_ -#ifndef __GNUC__ -#error TODO -#endif - struct _EXCEPTION_RECORD; struct _EXCEPTION_POINTERS; struct _CONTEXT; @@ -39,6 +35,47 @@ typedef int (__cdecl * _SEH2FrameHandler_t) void * ); +typedef struct __SEH2Registration +{ + struct __SEH2Registration * SER_Prev; + _SEH2FrameHandler_t SER_Handler; +} +_SEH2Registration_t; + +typedef struct __SEH2Frame +{ + _SEH2Registration_t SF_Registration; + volatile struct __SEH2TryLevel * volatile SF_TopTryLevel; + void * volatile SF_FramePointer; + void * volatile SF_StackPointer; + volatile unsigned long SF_Code; +} +_SEH2Frame_t; + +typedef struct __SEH2TryLevel +{ + volatile struct __SEH2TryLevel * ST_Next; + void * ST_FramePointer; + void * ST_Filter; + void * ST_Body; +} +_SEH2TryLevel_t; + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t *); +extern void __cdecl _SEH2LeaveFrame(void); +extern void __cdecl _SEH2Return(void); + +#ifdef __cplusplus +} +#endif + +#if defined(__GNUC__) + #if defined(__i386__) typedef struct __SEHTrampoline { @@ -100,13 +137,6 @@ void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_) #define __SEH_FALSE __builtin_expect(__SEH_ZERO, 0) #define __SEH_TRUE __builtin_expect(!__SEH_ZERO, 1) -typedef struct __SEH2Registration -{ - struct __SEH2Registration * SER_Prev; - _SEH2FrameHandler_t SER_Handler; -} -_SEH2Registration_t; - #define __SEH_FORCE_NEST \ __asm__ __volatile__("#%0" : : "r" (&_SEHFrame)) @@ -124,25 +154,6 @@ _SEH2Registration_t; #define __SEH_RETURN_EXCEPT(R_) return (int)(R_) #define __SEH_RETURN_FINALLY() return -typedef struct __SEH2Frame -{ - _SEH2Registration_t SF_Registration; - volatile struct __SEH2TryLevel * volatile SF_TopTryLevel; - void * volatile SF_FramePointer; - void * volatile SF_StackPointer; - volatile unsigned long SF_Code; -} -_SEH2Frame_t; - -typedef struct __SEH2TryLevel -{ - volatile struct __SEH2TryLevel * ST_Next; - void * ST_FramePointer; - void * ST_Filter; - void * ST_Body; -} -_SEH2TryLevel_t; - #define __SEH_BEGIN_TRY \ { \ __label__ _SEHBeginTry; \ @@ -347,6 +358,7 @@ _SEH2TryLevel_t; #define _SEH2_GetExceptionInformation() ((struct _EXCEPTION_POINTERS *)_SEHExceptionPointers) #define _SEH2_GetExceptionCode() ((_SEH2FrameP)->SF_Code) +#define _SEH2_AbnormalTermination() (!!_SEH2_GetExceptionCode()) #define _SEH2_YIELD(STMT_) \ for(;;) \ @@ -361,17 +373,22 @@ _SEH2TryLevel_t; __SEH_END_SCOPE_CHAIN; -#ifdef __cplusplus -extern "C" -{ -#endif +#else -extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t *); -extern void __cdecl _SEH2LeaveFrame(void); -extern void __cdecl _SEH2Return(void); +#include + +#define _SEH2_TRY __try +#define _SEH2_FINALLY __finally +#define _SEH2_EXCEPT(E_) __except((E_)) +#define _SEH2_END + +#define _SEH2_GetExceptionInformation() (GetExceptionInformation()) +#define _SEH2_GetExceptionCode() (GetExceptionCode()) +#define _SEH2_AbnormalTermination() (AbnormalTermination()) + +#define _SEH2_YIELD(STMT_) STMT_ +#define _SEH2_LEAVE __leave -#ifdef __cplusplus -} #endif #endif diff --git a/reactos/lib/pseh/framebased-gcchack.c b/reactos/lib/pseh/framebased-gcchack.c index 3d9175d104b..7778a28eb57 100644 --- a/reactos/lib/pseh/framebased-gcchack.c +++ b/reactos/lib/pseh/framebased-gcchack.c @@ -34,15 +34,31 @@ extern _SEH2Registration_t * __cdecl _SEH2CurrentRegistration(void); extern int __SEH2Except(void *, void *, void *); extern void __SEH2Finally(void *, void *); +extern +#if defined(__GNUC__) +__attribute__((noreturn)) +#elif defined(_MSC_VER) +__declspec(noreturn) +#endif +int __SEH2Handle(void *, void *, void *); + static +#if defined(__GNUC__) __attribute__((always_inline)) +#elif defined(_MSC_VER) +__forceinline +#endif int _SEH2Except(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel, EXCEPTION_POINTERS * ep) { return __SEH2Except(trylevel->ST_Filter, trylevel->ST_FramePointer, ep); } static +#if defined(__GNUC__) __attribute__((noinline)) +#elif defined(_MSC_VER) +__declspec(noinline) +#endif void _SEH2Finally(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel) { __SEH2Finally(trylevel->ST_Body, trylevel->ST_FramePointer); @@ -65,22 +81,16 @@ void _SEH2LocalUnwind(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * dsttrylev extern void _SEH2GlobalUnwind(void *); static +#if defined(__GNUC__) __attribute__((noreturn)) +#elif defined(_MSC_VER) +__declspec(noreturn) +#endif void _SEH2Handle(_SEH2Frame_t * frame, volatile _SEH2TryLevel_t * trylevel) { _SEH2GlobalUnwind(frame); _SEH2LocalUnwind(frame, trylevel); - - __asm__ __volatile__ - ( - "mov %[frame], %%ebp\n" - "mov %[stack], %%esp\n" - "jmp *%[handler]\n" : - : - [frame] "m" (frame->SF_FramePointer), [stack] "m" (frame->SF_StackPointer), [handler] "r" (trylevel->ST_Body) - ); - - for(;;); + __SEH2Handle(trylevel->ST_Body, frame->SF_FramePointer, frame->SF_StackPointer); } static @@ -94,7 +104,11 @@ int __cdecl _SEH2FrameHandler { _SEH2Frame_t * frame; +#if defined(__GNUC__) __asm__ __volatile__("cld"); +#elif defined(_MSC_VER) + __asm cld +#endif frame = EstablisherFrame; @@ -133,29 +147,24 @@ int __cdecl _SEH2FrameHandler return ExceptionContinueSearch; } +extern +void __cdecl __SEH2EnterFrame(_SEH2Frame_t *); + extern void __cdecl _SEH2EnterFrame(_SEH2Frame_t * frame) { frame->SF_Registration.SER_Handler = _SEH2FrameHandler; frame->SF_Code = 0; - __asm__ __volatile__("movl %%fs:0, %k0\n" : "=q" (frame->SF_Registration.SER_Prev)); - - __SEH_BARRIER; - __asm__ __volatile__("movl %k0, %%fs:0\n" : : "q" (&frame->SF_Registration)); + __SEH2EnterFrame(frame); } extern -void __cdecl _SEH2LeaveFrame() +void __cdecl __SEH2LeaveFrame(void); + +extern +void __cdecl _SEH2LeaveFrame(void) { - __asm__ __volatile__ - ( - "movl %%fs:0, %%edx\n" - "movl 0(%%edx), %%edx\n" - "movl %%edx, %%fs:0\n" : - : - : - "edx" - ); + __SEH2LeaveFrame(); } extern diff --git a/reactos/lib/pseh/i386/framebased-gcchack.S b/reactos/lib/pseh/i386/framebased-gcchack.S index ce36cf93c47..230642e8e46 100644 --- a/reactos/lib/pseh/i386/framebased-gcchack.S +++ b/reactos/lib/pseh/i386/framebased-gcchack.S @@ -26,6 +26,28 @@ __SEH2CurrentRegistration: mov eax, [fs:0] ret +.globl ___SEH2EnterFrame +___SEH2EnterFrame: + mov eax, [esp+4] + mov ecx, [fs:0] + mov [eax], ecx + mov [fs:0], eax + ret + +.globl __SEH2LeaveFrame +__SEH2LeaveFrame: + mov eax, [fs:0] + mov eax, [eax] + mov [fs:0], eax + ret + +.globl ___SEH2Handle +___SEH2Handle: + mov eax, [esp+4] + mov ebp, [esp+8] + mov esp, [esp+12] + jmp eax + .globl ___SEH2Except ___SEH2Except: mov eax, [esp+4]