va_list definition in library variadic functions for X64


I’m trying to enable Uefi firmware clang build which is to switch gcc to clang as the firmware default CC compiler, and I have some troubles to handle the X64 library variable arguments parsing with attribute((ms_abi)) calling convention. I hope to implement my own va_list macros, e.g. va_start, va_arg, va_end, va_copy, and I see the Stdarg.h define the va_list as __builtin_va_list, but I don’t know how clang define the __builtin_va_list for X64 architecture. Where can I find it?

· I thought the __builtin_va_list might be the char * and I defined the va_list macros as below, but they does not work.

typedef CHAR8 *VA_LIST;

#define VA_START(Marker, Parameter) (Marker = (VA_LIST) ((UINTN) & (Parameter) + _INT_SIZE_OF (Parameter)))

#define VA_ARG(Marker, TYPE) (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE)) - _INT_SIZE_OF (TYPE)))

#define VA_END(Marker) (Marker = (VA_LIST) 0)

#define VA_COPY(Dest, Start) ((void)((Dest) = (Start)))

· I also tried directly use the _builtin functions as below, the result is better, but still cannot completely work if the library function have very long variable arguments.

typedef __builtin_va_list VA_LIST;

#define VA_START(Marker, Parameter) __builtin_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_va_end (Marker)

#define VA_COPY(Dest, Start) __builtin_va_copy (Dest, Start)

Any suggestion is appreciated!

Steven Shi


Tel: +86 021-61166522

iNet: 821-6522