Commit 8fb8cc03 authored by Martin Storsjo's avatar Martin Storsjo Committed by Alexandre Julliard

arm64: Use __builtin_ms_va_list and __attribute__((ms_abi)) on arm64.

Windows uses a different ABI for va_list on arm64 just like on x86_64. On x86_64, the calling convention for windows functions is completely different from the one on other platforms. On arm64, they're mostly the same, with the only exception being variadic functions (where all float arguments are passed in integer registers, since the va_list is a single pointer). Any functions using __builtin_ms_va_start need to be decorated with __attribute__((ms_abi)). Signed-off-by: 's avatarMartin Storsjo <martin@martin.st> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 8f46ac23
......@@ -5409,6 +5409,30 @@ rm -f core conftest.err conftest.$ac_objext \
TARGETFLAGS="-marm -mfloat-abi=$float_abi"
;;
aarch64*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports __builtin_ms_va_list" >&5
$as_echo_n "checking whether $CC supports __builtin_ms_va_list... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdarg.h>
int
main ()
{
void func(__builtin_ms_va_list *args);
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
as_fn_error $? "You need clang >= 5.0 to build Wine for arm64." "$LINENO" 5
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
;;
i[3456789]86*)
enable_win16=${enable_win16:-yes}
;;
......
......@@ -205,6 +205,13 @@ case $host in
CFLAGS="$CFLAGS -marm -mfloat-abi=$float_abi"
AC_SUBST(TARGETFLAGS,"-marm -mfloat-abi=$float_abi")
;;
aarch64*)
AC_MSG_CHECKING([whether $CC supports __builtin_ms_va_list])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>]], [[void func(__builtin_ms_va_list *args);]])],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
AC_MSG_ERROR([You need clang >= 5.0 to build Wine for arm64.])])
;;
i[[3456789]]86*)
enable_win16=${enable_win16:-yes}
;;
......
......@@ -62,6 +62,8 @@
# endif
# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__)
# define __stdcall __attribute__((pcs("aapcs-vfp")))
# elif defined(__aarch64__) && defined (__GNUC__)
# define __stdcall __attribute__((ms_abi))
# else /* __i386__ */
# define __stdcall
# endif /* __i386__ */
......@@ -82,13 +84,15 @@
# endif
# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__)
# define __cdecl __attribute__((pcs("aapcs-vfp")))
# elif defined(__aarch64__) && defined (__GNUC__)
# define __cdecl __attribute__((ms_abi))
# elif !defined(_MSC_VER)
# define __cdecl
# endif
#endif /* __cdecl */
#ifndef __ms_va_list
# if defined(__x86_64__) && defined (__GNUC__)
# if (defined(__x86_64__) || defined(__aarch64__)) && defined (__GNUC__)
# define __ms_va_list __builtin_ms_va_list
# define __ms_va_start(list,arg) __builtin_ms_va_start(list,arg)
# define __ms_va_end(list) __builtin_ms_va_end(list)
......
......@@ -71,6 +71,8 @@ extern "C" {
# endif
# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__)
# define __stdcall __attribute__((pcs("aapcs-vfp")))
# elif defined(__aarch64__) && defined (__GNUC__)
# define __stdcall __attribute__((ms_abi))
# else /* __i386__ */
# define __stdcall
# endif /* __i386__ */
......@@ -91,13 +93,15 @@ extern "C" {
# endif
# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__)
# define __cdecl __attribute__((pcs("aapcs-vfp")))
# elif defined(__aarch64__) && defined (__GNUC__)
# define __cdecl __attribute__((ms_abi))
# elif !defined(_MSC_VER)
# define __cdecl
# endif
#endif /* __cdecl */
#ifndef __ms_va_list
# if defined(__x86_64__) && defined (__GNUC__)
# if (defined(__x86_64__) || defined(__aarch64__)) && defined (__GNUC__)
# define __ms_va_list __builtin_ms_va_list
# define __ms_va_start(list,arg) __builtin_ms_va_start(list,arg)
# define __ms_va_end(list) __builtin_ms_va_end(list)
......
......@@ -90,7 +90,7 @@ static inline int winetest_strcmpW( const WCHAR *str1, const WCHAR *str2 )
#define START_TEST(name) void func_##name(void)
#endif
#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
#if (defined(__x86_64__) || defined(__aarch64__)) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
#define __winetest_cdecl __cdecl
#define __winetest_va_list __builtin_ms_va_list
#else
......@@ -181,7 +181,7 @@ extern void __winetest_cdecl winetest_trace( const char *msg, ... ) WINETEST_PRI
#include <stdio.h>
#include <excpt.h>
#if defined(__x86_64__) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
#if (defined(__x86_64__) || defined(__aarch64__)) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
# define __winetest_va_start(list,arg) __builtin_ms_va_start(list,arg)
# define __winetest_va_end(list) __builtin_ms_va_end(list)
#else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment