[CMAKE]
[reactos.git] / include / crt / setjmp.h
index 731640b..2a64a9b 100644 (file)
@@ -32,7 +32,9 @@ extern "C" {
     unsigned long UnwindFunc;
     unsigned long UnwindData[6];
   } _JUMP_BUFFER;
+
 #elif defined(__ia64__)
+
   typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
     __MINGW_EXTENSION __int64 LowPart;
     __MINGW_EXTENSION __int64 HighPart;
@@ -92,7 +94,9 @@ extern "C" {
     __MINGW_EXTENSION __int64 Preds;
 
   } _JUMP_BUFFER;
+
 #elif defined(__x86_64)
+
   typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 {
     __MINGW_EXTENSION unsigned __int64 Part[2];
   } SETJMP_FLOAT128;
@@ -124,16 +128,26 @@ extern "C" {
     SETJMP_FLOAT128 Xmm14;
     SETJMP_FLOAT128 Xmm15;
   } _JUMP_BUFFER;
+
 #endif
+
 #ifndef _JMP_BUF_DEFINED
   typedef _JBTYPE jmp_buf[_JBLEN];
 #define _JMP_BUF_DEFINED
 #endif
 
-  void * __cdecl __MINGW_NOTHROW mingw_getsp(void);
-
+#ifdef _MSC_VER
+int __cdecl __MINGW_NOTHROW setjmp(jmp_buf _Buf);
+#else
 #ifdef USE_MINGW_SETJMP_TWO_ARGS
 #ifndef _INC_SETJMPEX
+#if defined(__x86_64)
+# define mingw_getsp() \
+  ({ void* value; __asm__ __volatile__("movq %%rsp, %[value]" : [value] "=r" (value)); value; })
+#elif defined(_X86_)
+# define mingw_getsp() \
+  ({ void* value; __asm__ __volatile__("movl %%esp, %[value]" : [value] "=r" (value)); value; })
+#endif
 #define setjmp(BUF) _setjmp((BUF),mingw_getsp())
   int __cdecl __MINGW_NOTHROW _setjmp(jmp_buf _Buf,void *_Ctx);
 #else
@@ -147,6 +161,7 @@ extern "C" {
 #define setjmp _setjmp
 #endif
   int __cdecl __MINGW_NOTHROW setjmp(jmp_buf _Buf);
+#endif
 #endif
 
   __declspec(noreturn) __MINGW_NOTHROW void __cdecl ms_longjmp(jmp_buf _Buf,int _Value)/* throw(...)*/;