On 8 July 2016 at 10:42, Shi, Steven <steven....@intel.com> wrote:
> Both GCC and LLVM 3.8 64bits support new variable argument (VA)
> intrinsics for Microsoft ABI, enable these new VA intrinsics for
> GNUC family 64bits code build. These VA intrinsics are only
> permitted use in 64bits code, so not use them in 32bits code build.
> The original 32bits GNU VA intrinsics has the same calling conversion
> as MS, so we don’t need change them.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Steven Shi <steven....@intel.com>
> ---
>  MdePkg/Include/Base.h | 27 +++++++++++++++++++++++++--
>  1 file changed, 25 insertions(+), 2 deletions(-)
>  mode change 100644 => 100755 MdePkg/Include/Base.h
>
> diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h
> old mode 100644
> new mode 100755
> index cbd9e55..5129b64
> --- a/MdePkg/Include/Base.h
> +++ b/MdePkg/Include/Base.h
> @@ -588,9 +588,32 @@ struct _LIST_ENTRY {
>
>  #define VA_COPY(Dest, Start)          __va_copy (Dest, Start)
>
> -#elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS)
> +
> +#elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS) && !defined 
> (MDE_CPU_IA32)

This will affect all other architectures as well, so you should
probably change the second proposition to

defined(MDE_CPU_X64)

instead.


> +//
> +// 64bits build only. Use GCC built-in macros for variable argument lists.
> +//
> +///
> +/// Both GCC and LLVM 3.8 64bits support new variable argument intrinsics 
> for Microsoft ABI
> +///
> +
> +///
> +/// Variable used to traverse the list of arguments. This type can vary by
> +/// implementation and could be an array or structure.
> +///
> +typedef __builtin_ms_va_list VA_LIST;
> +
> +#define VA_START(Marker, Parameter)  __builtin_ms_va_start (Marker, 
> Parameter)
> +
> +#define VA_ARG(Marker, TYPE)         ((sizeof (TYPE) < sizeof (UINTN)) ? 
> (TYPE)(__builtin_va_arg (Marker, UINTN)) : (TYPE)(__builtin_va_arg (Marker, 
> TYPE)))
> +
> +#define VA_END(Marker)               __builtin_ms_va_end (Marker)
> +
> +#define VA_COPY(Dest, Start)         __builtin_ms_va_copy (Dest, Start)
> +
> +#elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS) && defined 
> (MDE_CPU_IA32)

likewise here

>  //
> -// Use GCC built-in macros for variable argument lists.
> +// 32bits build only. Use GCC built-in macros for variable argument lists.
>  //
>

Note that with this change alone, I managed to build EmulatorPkg/X64
and Ovmf/X64 successfully using '-fpic -mcmodel=small -O2' (and
removing -DNO_BUILTIN_VA_FUNCS), using versions of GCC all the way
back to v4.7.4, which results in much smaller binaries.
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to