Signed-off-by: Brendan Shanks bshanks@codeweavers.com ---
__force_align_arg_pointer__ has been supported for x86_64 since Clang 6.0 / Xcode 10. Note there is currently a Clang bug causing SSE register spills to use the unaligned frame pointer rather than the aligned stack pointer, see https://bugs.llvm.org/show_bug.cgi?id=48080.
GCC 5.0 added support for __has_attribute, so __force_align_arg_pointer__ should be used for as many GCC versions as before. (Actually more, since GCC 5.0-5.2 claim support for it but it doesn't seem to have any effect).
include/msvcrt/corecrt.h | 8 ++++++-- include/windef.h | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/include/msvcrt/corecrt.h b/include/msvcrt/corecrt.h index ad46c56591c..587dcce2a54 100644 --- a/include/msvcrt/corecrt.h +++ b/include/msvcrt/corecrt.h @@ -57,6 +57,10 @@ #endif #endif
+#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + #if !defined(_MSC_VER) && !defined(__stdcall) # ifdef __i386__ # ifdef __GNUC__ @@ -69,7 +73,7 @@ # error You need to define __stdcall for your compiler # endif # elif defined(__x86_64__) && defined (__GNUC__) -# if (__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 3)) +# if __has_attribute(__force_align_arg_pointer__) # define __stdcall __attribute__((ms_abi)) __attribute__((__force_align_arg_pointer__)) # else # define __stdcall __attribute__((ms_abi)) @@ -91,7 +95,7 @@ # define __cdecl __attribute__((__cdecl__)) # endif # elif defined(__x86_64__) && defined (__GNUC__) -# if (__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 3)) +# if __has_attribute(__force_align_arg_pointer__) # define __cdecl __attribute__((ms_abi)) __attribute__((__force_align_arg_pointer__)) # else # define __cdecl __attribute__((ms_abi)) diff --git a/include/windef.h b/include/windef.h index 521c3ab4512..db5c60641d4 100644 --- a/include/windef.h +++ b/include/windef.h @@ -31,6 +31,10 @@ # endif /* STRICT */ #endif /* NO_STRICT */
+#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + #ifdef __cplusplus extern "C" { #endif @@ -62,7 +66,7 @@ extern "C" { # error You need to define __stdcall for your compiler # endif # elif defined(__x86_64__) && defined (__GNUC__) -# if (__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 3)) +# if __has_attribute(__force_align_arg_pointer__) # define __stdcall __attribute__((ms_abi)) __attribute__((__force_align_arg_pointer__)) # else # define __stdcall __attribute__((ms_abi)) @@ -84,7 +88,7 @@ extern "C" { # define __cdecl __attribute__((__cdecl__)) # endif # elif defined(__x86_64__) && defined (__GNUC__) -# if (__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 3)) +# if __has_attribute(__force_align_arg_pointer__) # define __cdecl __attribute__((ms_abi)) __attribute__((__force_align_arg_pointer__)) # else # define __cdecl __attribute__((ms_abi))