X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdePkg%2FInclude%2FBase.h;h=e03fa823928492115854d12b85cf116dba38ccfc;hp=7dbf9386b6b47e6f43630a811ded4483a7d76dba;hb=48d5f9a551a93acb45f272dda879b0ab5a504e36;hpb=b2dc04a87fab89307240dc0f30b9a23bb5726c81 diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h index 7dbf9386b6..e03fa82392 100644 --- a/MdePkg/Include/Base.h +++ b/MdePkg/Include/Base.h @@ -590,6 +590,30 @@ struct _LIST_ENTRY { #define VA_COPY(Dest, Start) __va_copy (Dest, Start) #elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS) + +#if defined(MDE_CPU_X64) && !defined(NO_MSABI_VA_FUNCS) +// +// X64 only. Use MS ABI version of GCC built-in macros for variable argument lists. +// +/// +/// Both GCC and LLVM 3.8 for X64 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) + +#else // // Use GCC built-in macros for variable argument lists. // @@ -608,6 +632,8 @@ typedef __builtin_va_list VA_LIST; #define VA_COPY(Dest, Start) __builtin_va_copy (Dest, Start) +#endif + #else /// /// Variable used to traverse the list of arguments. This type can vary by