2010-07-20  Ozkan Sezer  <sezeroz@gmail.com>

	* crt/gs_support.c (_ReturnAddress, _AddressOfReturnAddress): wrap
	m$vc intrinsics onto gcc builtins.
	(__report_gsfailure): Use _ReturnAddress and _AddressOfReturnAddress.
	Tidy up the win64 ifdefs at the function start.


git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@2910 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/ChangeLog b/mingw-w64-crt/ChangeLog
index bac8d3d..83460e8 100644
--- a/mingw-w64-crt/ChangeLog
+++ b/mingw-w64-crt/ChangeLog
@@ -1,3 +1,10 @@
+2010-07-20  Ozkan Sezer  <sezeroz@gmail.com>
+
+	* crt/gs_support.c (_ReturnAddress, _AddressOfReturnAddress): wrap
+	m$vc intrinsics onto gcc builtins.
+	(__report_gsfailure): Use _ReturnAddress and _AddressOfReturnAddress.
+	Tidy up the win64 ifdefs at the function start.
+
 2010-07-20  Amine Khaldi  <amine.khaldi@reactos.org>
 
 	* crt/CRT_fp10.c: __attribute__((alias("xxx"))) is for gcc only.
diff --git a/mingw-w64-crt/crt/gs_support.c b/mingw-w64-crt/crt/gs_support.c
index 0076900..3338c3d 100644
--- a/mingw-w64-crt/crt/gs_support.c
+++ b/mingw-w64-crt/crt/gs_support.c
@@ -87,6 +87,14 @@
   __security_cookie_complement = ~cookie;
 }
 
+
+#if defined(__GNUC__) /* wrap m$vc intrinsics onto gcc builtins */
+#undef  _ReturnAddress
+#undef  _AddressOfReturnAddress
+#define _ReturnAddress()		__builtin_return_address(0)
+#define _AddressOfReturnAddress()	__builtin_frame_address (0)
+#endif /* __GNUC__ */
+
 __declspec(noreturn) void __cdecl __report_gsfailure (ULONGLONG);
 
 __declspec(noreturn) void __cdecl
@@ -97,9 +105,7 @@
   ULONG64 controlPC, imgBase, establisherFrame;
   PRUNTIME_FUNCTION fctEntry;
   PVOID hndData;
-#endif
 
-#ifdef _WIN64
   RtlCaptureContext (&GS_ContextRecord);
   controlPC = GS_ContextRecord.Rip;
   fctEntry = RtlLookupFunctionEntry (controlPC, &imgBase, NULL);
@@ -109,15 +115,15 @@
 			&GS_ContextRecord, &hndData, &establisherFrame, NULL);
     }
   else
-#endif
+#endif /* _WIN64 */
     {
 #ifdef _WIN64
-      GS_ContextRecord.Rip = (ULONGLONG) __builtin_return_address (0);
-      GS_ContextRecord.Rsp = (ULONGLONG) __builtin_frame_address (0) + 8;
+      GS_ContextRecord.Rip = (ULONGLONG) _ReturnAddress();
+      GS_ContextRecord.Rsp = (ULONGLONG) _AddressOfReturnAddress() + 8;
 #else
-      GS_ContextRecord.Eip = (DWORD) __builtin_return_address (0);
-      GS_ContextRecord.Esp = (DWORD) __builtin_frame_address (0) + 4;
-#endif
+      GS_ContextRecord.Eip = (DWORD) _ReturnAddress();
+      GS_ContextRecord.Esp = (DWORD) _AddressOfReturnAddress() + 4;
+#endif /* _WIN64 */
     }
 
 #ifdef _WIN64
@@ -126,7 +132,7 @@
 #else
   GS_ExceptionRecord.ExceptionAddress = (PVOID) GS_ContextRecord.Eip;
   GS_ContextRecord.Ecx = StackCookie;
-#endif
+#endif /* _WIN64 */
   GS_ExceptionRecord.ExceptionCode = STATUS_STACK_BUFFER_OVERRUN;
   GS_ExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
   cookie[0] = __security_cookie;
@@ -136,3 +142,4 @@
   TerminateProcess (GetCurrentProcess (), STATUS_STACK_BUFFER_OVERRUN);
   abort();
 }
+