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