diff --git a/configure b/configure index 30d53da4837..d53583dfbcb 100755 --- a/configure +++ b/configure @@ -5408,6 +5408,30 @@ rm -f core conftest.err conftest.$ac_objext \ CFLAGS="$CFLAGS -marm -mfloat-abi=$float_abi" 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 +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} diff --git a/configure.ac b/configure.ac index 54c31d86c8f..b4a8ef0d13b 100644 --- a/configure.ac +++ b/configure.ac @@ -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 ]], [[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} ;; diff --git a/include/msvcrt/crtdefs.h b/include/msvcrt/crtdefs.h index a9edef57c4f..0c0b08748ea 100644 --- a/include/msvcrt/crtdefs.h +++ b/include/msvcrt/crtdefs.h @@ -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) diff --git a/include/windef.h b/include/windef.h index 40028f3373c..8e8a08afbbf 100644 --- a/include/windef.h +++ b/include/windef.h @@ -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) diff --git a/include/wine/test.h b/include/wine/test.h index 21e2ac76d5f..e3e4bcf77b7 100644 --- a/include/wine/test.h +++ b/include/wine/test.h @@ -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 #include -#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