[PSEH]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 7 Sep 2014 20:52:20 +0000 (20:52 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 7 Sep 2014 20:52:20 +0000 (20:52 +0000)
- Fix compilation of PSEH with Clang
- Fix _SEH3$_InvokeEmbeddedFilterFromRegistration

svn path=/trunk/; revision=64077

reactos/include/reactos/libs/pseh/pseh3.h
reactos/lib/pseh/i386/pseh3.c
reactos/lib/pseh/i386/pseh3_i386.S

index 457d7d9..6fbedc2 100644 (file)
@@ -64,7 +64,7 @@ typedef struct _SEH3$_REGISTRATION_FRAME
     /* Except handler stores pointer to exception pointers here */
     PSEH3$_EXCEPTION_POINTERS volatile ExceptionPointers;
 
-    /* Except handle stores the exception code here */
+    /* Except handler stores the exception code here */
     unsigned long ExceptionCode;
 
     /* Registers that we need to save */
index 8a3be57..96760ea 100644 (file)
@@ -64,7 +64,7 @@ _SEH3$_Unregister(
 static inline
 LONG
 _SEH3$_InvokeNestedFunctionFilter(
-    PSEH3$_REGISTRATION_FRAME RegistrationFrame,
+    volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame,
     PVOID Filter)
 {
     LONG FilterResult;
@@ -93,17 +93,17 @@ _SEH3$_InvokeNestedFunctionFilter(
 long
 __attribute__((regparm(1)))
 _SEH3$_InvokeEmbeddedFilter(
-    PSEH3$_REGISTRATION_FRAME RegistrationFrame);
+    volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame);
 
 long
 __attribute__((regparm(1)))
 _SEH3$_InvokeEmbeddedFilterFromRegistration(
-    PSEH3$_REGISTRATION_FRAME RegistrationFrame);
+    volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame);
 
 static inline
 LONG
 _SEH3$_InvokeFilter(
-    PSEH3$_REGISTRATION_FRAME RegistrationFrame,
+    volatile SEH3$_REGISTRATION_FRAME *RegistrationFrame,
     PVOID Filter)
 {
     LONG FilterResult;
@@ -133,7 +133,7 @@ _SEH3$_InvokeFilter(
 void
 __attribute__((regparm(1)))
 _SEH3$_AutoCleanup(
-    SEH3$_REGISTRATION_FRAME *Frame)
+    volatile SEH3$_REGISTRATION_FRAME *Frame)
 {
     /* Check for __finally frames */
     if (Frame->ScopeTable->Target == NULL)
@@ -241,7 +241,9 @@ _SEH3$_CallRtlUnwind(
 
 EXCEPTION_DISPOSITION
 __cdecl
+#ifndef __clang__
 __attribute__ ((__target__ ("cld")))
+#endif
 _SEH3$_except_handler(
     struct _EXCEPTION_RECORD * ExceptionRecord,
     PSEH3$_REGISTRATION_FRAME EstablisherFrame,
index 8e409fa..adab89c 100644 (file)
@@ -128,6 +128,8 @@ __SEH3$_InvokeEmbeddedFilterFromRegistration:
     mov edi, [eax + SEH3_REGISTRATION_FRAME_Edi]
     mov ebp, [eax + SEH3_REGISTRATION_FRAME_Ebp]
 
+    jmp __SEH3$_InvokeEmbeddedFilter2
+
     /* Get the saved stack pointer */
     mov edx, [eax + SEH3_REGISTRATION_FRAME_Esp]
 
@@ -155,7 +157,7 @@ __SEH3$_InvokeEmbeddedFilter:
 
     /* Load ebp from the registration invocation */
     mov ebp, [eax + SEH3_REGISTRATION_FRAME_Ebp]
-
+__SEH3$_InvokeEmbeddedFilter2:
     /* Calculate the size of the temp stack frame region */
     mov ecx, [eax + SEH3_REGISTRATION_FRAME_AllocaFrame]
     sub ecx, [eax + SEH3_REGISTRATION_FRAME_Esp]