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(); } +