[PATCH] arm64: Use __builtin_ms_va_list and __attribute__((ms_abi)) on arm64

André Hentschel nerv at dawncrow.de
Mon Aug 14 07:14:11 CDT 2017


Signed-off-by: André Hentschel <nerv at dawncrow.de>

Am 14.08.2017 um 12:35 schrieb Martin Storsjo:
> 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)).
> 
> Add a check in configure for the support of __builtin_ms_va_list
> (both features appared in clang at the same time, in the 5.0 release).
> 
> This fixes running binaries that use e.g. printf style functions
> (e.g. midl.exe from the windows 10 sdk), fixing
> https://bugs.winehq.org/show_bug.cgi?id=38886.
> 
> Signed-off-by: Martin Storsjo <martin at martin.st>
> ---
> clang 5.0, which this requires, isn't yet released, but is in RC2 and
> will probably be released pretty soon.
> ---
>  configure.ac             | 7 +++++++
>  include/msvcrt/crtdefs.h | 6 +++++-
>  include/windef.h         | 6 +++++-
>  include/wine/test.h      | 4 ++--
>  4 files changed, 19 insertions(+), 4 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 7d52b24..c33221f 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -179,6 +179,13 @@ case $host in
>      CFLAGS="$CFLAGS -marm"
>      AC_SUBST(TARGETFLAGS,"-marm")
>      ;;
> +  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}
>      ;;
> diff --git a/include/msvcrt/crtdefs.h b/include/msvcrt/crtdefs.h
> index 8aed64c..6ae8c8c 100644
> --- a/include/msvcrt/crtdefs.h
> +++ b/include/msvcrt/crtdefs.h
> @@ -60,6 +60,8 @@
>  #  else
>  #   define __stdcall __attribute__((ms_abi))
>  #  endif
> +# elif defined(__aarch64__) && defined (__GNUC__)
> +#  define __stdcall __attribute__((ms_abi))
>  # else  /* __i386__ */
>  #  define __stdcall
>  # endif  /* __i386__ */
> @@ -78,13 +80,15 @@
>  #  else
>  #   define __cdecl __attribute__((ms_abi))
>  #  endif
> +# 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 e77b1ca..49572d5 100644
> --- a/include/windef.h
> +++ b/include/windef.h
> @@ -69,6 +69,8 @@ extern "C" {
>  #  else
>  #   define __stdcall __attribute__((ms_abi))
>  #  endif
> +# elif defined(__aarch64__) && defined (__GNUC__)
> +#  define __stdcall __attribute__((ms_abi))
>  # else  /* __i386__ */
>  #  define __stdcall
>  # endif  /* __i386__ */
> @@ -87,13 +89,15 @@ extern "C" {
>  #  else
>  #   define __cdecl __attribute__((ms_abi))
>  #  endif
> +# 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 4ec66d5..3caff6c 100644
> --- a/include/wine/test.h
> +++ b/include/wine/test.h
> @@ -87,7 +87,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
> @@ -178,7 +178,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
> 




More information about the wine-patches mailing list