X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=StdLib%2FInclude%2Fstdarg.h;h=9a30e28fbf183e7b01c1c395ca9e8a02e1d2f620;hb=b9ca25cb683174b4992b7d3826d1e4b5095a22e9;hp=226e3156951bdc0dd63524f47f4a72113aeb73cc;hpb=2aa62f2bc9a9654687b377d9ca8a8c2c860a3852;p=mirror_edk2.git diff --git a/StdLib/Include/stdarg.h b/StdLib/Include/stdarg.h index 226e315695..9a30e28fbf 100644 --- a/StdLib/Include/stdarg.h +++ b/StdLib/Include/stdarg.h @@ -1,52 +1,53 @@ /** @file - The header declares a type and defines three macros, for advancing - through a list of arguments whose number and types are not known to the - called function when it is translated. - - A function may be called with a variable number of arguments of varying types. - Its parameter list contains one or more parameters. The rightmost parameter - plays a special role in the access mechanism, and will be designated paramN - in this description. - - The type va_list is a type suitable for holding information needed by the - macros va_start, va_arg, and va_end. If access to the varying arguments - is desired, the called function shall declare an object (referred to as ap - in these descriptions) having type va_list. The object ap may be passed as - an argument to another function; if that function invokes the va_arg macro - with parameter ap, the value of ap in the calling function is indeterminate - and shall be passed to the va_end macro prior to any further reference to ap. - - The va_start and va_arg macros shall be implemented as macros, not as actual - functions. It is unspecified, by the C library standards, whether va_end - is a macro or an identifier declared with external linkage. If a macro - definition is suppressed in order to access an actual function, or a - program defines an external identifier with the name va_end, the behavior - is undefined. The va_start and va_end macros shall be invoked in the - function accepting a varying number of arguments, if access to the varying - arguments is desired. - -Copyright (c) 2010, Intel Corporation. All rights reserved.
-This program and the accompanying materials are licensed and made available under -the terms and conditions of the BSD License that accompanies this distribution. -The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php. - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - + This header, , declares type va_list and defines macros: va_start, va_arg, va_end; + for advancing through a list of arguments whose number and types are not known to the + called function when it is translated. + + A function may be called with a variable number of arguments of varying types. + The rightmost argument plays a special role in the access mechanism, and will + be designated paramN in this and subsequent descriptions. + + The type va_list is a type suitable for holding information needed by the + macros va_start, va_arg, and va_end. If access to the varying arguments + is desired, the called function shall declare an object (referred to as ap + in these descriptions) having type va_list. The object ap may be passed as + an argument to another function; if the receiving function invokes the va_arg macro + with parameter ap, the value of ap in the calling function becomes indeterminate + and must be passed to the va_end macro prior to any further reference to ap. + + The va_start and va_arg macros must be implemented as macros, not as actual + functions. The va_start and va_end macros must be invoked in the + function accepting a varying number of arguments, if access to the varying + arguments is desired. + + Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #ifndef _STDARG_H #define _STDARG_H #include -/** The type va_list is a type suitable for holding information needed by the +/** @{ + The type va_list is a type suitable for holding information needed by the macros va_start, va_arg, and va_end. - This implementation aliases va_list to VA_LIST, declared in MdePkg/Base.h. + Depending upon compiler or CPU architecture, different definitions are required. **/ +#if defined(__GNUC__) +typedef __builtin_va_list va_list; +#else #define va_list VA_LIST +#endif +/*@}*/ -/** The va_start macro shall be invoked before any access to the unnamed arguments. +/** @{ + The va_start macro must be invoked before any access to the unnamed arguments. The va_start macro initializes ap for subsequent use by va_arg and va_end. Synopsys: void va_start(va_list ap, paramN); @@ -63,13 +64,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. is not compatible with the type that results after application of the default argument promotions, the behavior is undefined. - - This implementation aliases va_start to VA_START, declared in MdePkg/Base.h. **/ -//#define va_start(ap, ParamN) VA_START(ap, ParamN) +#if defined(__GNUC__) +#define va_start __builtin_va_start +#else #define va_start VA_START +#endif +/*@}*/ -/** The va_arg macro expands to an expression that has the type and value of +/** @{ + The va_arg macro expands to an expression that has the type and value of the next argument in the call. The parameter ap shall be the same as the va_list ap initialized by va_start. Each invocation of va_arg modifies ap so that the values of successive arguments are returned in turn. The @@ -90,13 +94,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. va_start macro returns the value of the argument after that specified by paramN. Successive invocations return the values of the remaining arguments in succession. - - This implementation aliases va_arg to VA_ARG, declared in MdePkg/Base.h. **/ -//#define va_arg(ap, type) VA_ARG(ap, type) +#if defined(__GNUC__) +#define va_arg __builtin_va_arg +#else #define va_arg VA_ARG +#endif +/*@}*/ -/** The va_end macro facillitates a normal return from the function whose +/** @{ + The va_end macro facillitates a normal return from the function whose variable argument list was referred to by the expansion of va_start that initialized the va_list ap. @@ -109,13 +116,31 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. @param ap An object of type va_list, initialized by a prior invocation of va_start, that will no longer be referenced. - - This implementation aliases va_end to VA_END, declared in MdePkg/Base.h. **/ -//#define va_end(ap) VA_END(ap) +#if defined(__GNUC__) +#define va_end __builtin_va_end +#else #define va_end VA_END +#endif +/*@}*/ -/** For BSD compatibility. **/ +/** @{ + For BSD compatibility. +**/ +#if defined(__GNUC__) +#define va_copy __builtin_va_copy +#else #define va_copy(s,d) (s) = (d) +#endif +/*@}*/ + +/** Provide a generic version of the compiler-dependent __va_copy macro. + Some software, such as Python 2.7.2, relies upon the existence of __va_copy. + If this macro is not defined, it just assigns one va_list item to another. + This breaks for compiler environments that define va_list as an array or structure. +**/ +#ifndef __va_copy + #define __va_copy va_copy +#endif #endif /* _STDARG_H */