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
This commit is contained in:
KJK::Hyperion 2008-11-26 16:03:12 +00:00
parent cab11c6e20
commit 58c81ba194
3 changed files with 112 additions and 64 deletions

View file

@ -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 <excpt.h>
#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

View file

@ -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

View file

@ -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]