[PATCH] include: Force stack alignment on x86_64 with Clang.

Brendan Shanks bshanks at codeweavers.com
Wed Nov 4 19:29:28 CST 2020


Signed-off-by: Brendan Shanks <bshanks at 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))
-- 
2.26.2




More information about the wine-devel mailing list