}
#endif
-#if defined(__i386__)
-typedef struct __SEHTrampoline
-{
- unsigned char STR_MovEcx;
- unsigned char STR_Closure[4];
- unsigned char STR_Jmp;
- unsigned char STR_Function[4];
-}
-_SEHTrampoline_t;
-
-static
-__inline__
-__attribute__((always_inline))
-int _SEHIsTrampoline(_SEHTrampoline_t * trampoline_)
-{
- return trampoline_->STR_MovEcx == 0xb9 && trampoline_->STR_Jmp == 0xe9;
-}
-
-static
-__inline__
-__attribute__((always_inline))
-void * _SEHFunctionFromTrampoline(_SEHTrampoline_t * trampoline_)
-{
- return (void *)(*(int *)(&trampoline_->STR_Function[0]) + (int)(trampoline_ + 1));
-}
-
-static
-__inline__
-__attribute__((always_inline))
-void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
-{
- return (void *)*(int *)(&trampoline_->STR_Closure[0]);
-}
-#else
-#error TODO
-#endif
-
/* A no-op side effect that scares GCC */
#define __SEH_SIDE_EFFECT __asm__ __volatile__("#")
extern int __cdecl __SEH2FrameHandler(struct _EXCEPTION_RECORD *, void *, struct _CONTEXT *, void *);
extern int __cdecl __SEH2UnwindHandler(struct _EXCEPTION_RECORD *, void *, struct _CONTEXT *, void *);
+typedef struct __SEHTrampoline
+{
+ unsigned char STR_MovEcx;
+ unsigned char * STR_Closure;
+ unsigned char STR_Jmp;
+ unsigned char * STR_Function;
+}
+__attribute__((packed))
+_SEHTrampoline_t;
+
+FORCEINLINE
+int _SEHIsTrampoline(_SEHTrampoline_t * trampoline_)
+{
+ return trampoline_->STR_MovEcx == 0xb9 && trampoline_->STR_Jmp == 0xe9;
+}
+
+FORCEINLINE
+void * _SEHFunctionFromTrampoline(_SEHTrampoline_t * trampoline_)
+{
+ return (int)(trampoline_ + 1) + trampoline_->STR_Function;
+}
+
+FORCEINLINE
+void * _SEHClosureFromTrampoline(_SEHTrampoline_t * trampoline_)
+{
+ return trampoline_->STR_Closure;
+}
+
FORCEINLINE
_SEH2Registration_t * __cdecl _SEH2CurrentRegistration(void)
{