]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Foundation/Include/EfiStdArg.h
EdkCompatibilityPkg VA_LIST: Fix build issue with GCC 4.4
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Include / EfiStdArg.h
index 9ff66e437d2a2be6e886e5ccf8b29d8ebc6d25b8..bbec17b6e0d9d59b7e91b021a2c98023627a12c2 100644 (file)
@@ -58,7 +58,14 @@ Abstract:
 #ifndef _EFISTDARG_H_\r
 #define _EFISTDARG_H_\r
 \r
-#define _EFI_INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))\r
+/**\r
+  Return the size of argument that has been aligned to sizeof (UINTN).\r
+\r
+  @param  n    The parameter size to be aligned.\r
+\r
+  @return The aligned size.\r
+**/\r
+#define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))\r
 \r
 #if defined(__CC_ARM)\r
 //\r
@@ -83,9 +90,7 @@ Abstract:
 \r
 #define VA_END(Marker)                ((void)0)\r
 \r
-#define VA_COPY(Dest, Start)          __va_copy (Dest, Start)\r
-\r
-#elif defined(__GNUC__)\r
+#elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS)\r
 //\r
 // Use GCC built-in macros for variable argument lists.\r
 //\r
@@ -102,23 +107,60 @@ typedef __builtin_va_list VA_LIST;
 \r
 #define VA_END(Marker)               __builtin_va_end (Marker)\r
 \r
-#define VA_COPY(Dest, Start)         __builtin_va_copy (Dest, Start)\r
-\r
 #else\r
+///\r
+/// Variable used to traverse the list of arguments. This type can vary by \r
+/// implementation and could be an array or structure. \r
+///\r
+typedef CHAR8 *VA_LIST;\r
 \r
-//\r
-// Also support coding convention rules for var arg macros\r
-//\r
-#ifndef VA_START\r
+/**\r
+  Retrieves a pointer to the beginning of a variable argument list, based on \r
+  the name of the parameter that immediately precedes the variable argument list. \r
 \r
-typedef CHAR8 *VA_LIST;\r
-#define VA_START(ap, v) (ap = (VA_LIST) & (v) + _EFI_INT_SIZE_OF (v))\r
-#define VA_ARG(ap, t)   (*(t *) ((ap += _EFI_INT_SIZE_OF (t)) - _EFI_INT_SIZE_OF (t)))\r
-#define VA_END(ap)      (ap = (VA_LIST) 0)\r
-#define VA_COPY(dest, src) ((void)((dest) = (src)))\r
+  This function initializes Marker to point to the beginning of the variable  \r
+  argument list that immediately follows Parameter.  The method for computing the \r
+  pointer to the next argument in the argument list is CPU-specific following the \r
+  EFIAPI ABI.\r
 \r
-#endif\r
+  @param   Marker       The VA_LIST used to traverse the list of arguments.\r
+  @param   Parameter    The name of the parameter that immediately precedes \r
+                        the variable argument list.\r
+  \r
+  @return  A pointer to the beginning of a variable argument list.\r
+\r
+**/\r
+#define VA_START(Marker, Parameter) (Marker = (VA_LIST) & (Parameter) + _INT_SIZE_OF (Parameter))\r
 \r
+/**\r
+  Returns an argument of a specified type from a variable argument list and updates \r
+  the pointer to the variable argument list to point to the next argument. \r
+\r
+  This function returns an argument of the type specified by TYPE from the beginning \r
+  of the variable argument list specified by Marker.  Marker is then updated to point \r
+  to the next argument in the variable argument list.  The method for computing the \r
+  pointer to the next argument in the argument list is CPU-specific following the EFIAPI ABI.\r
+\r
+  @param   Marker   VA_LIST used to traverse the list of arguments.\r
+  @param   TYPE     The type of argument to retrieve from the beginning \r
+                    of the variable argument list.\r
+  \r
+  @return  An argument of the type specified by TYPE.\r
+\r
+**/\r
+#define VA_ARG(Marker, TYPE)   (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE)) - _INT_SIZE_OF (TYPE)))\r
+\r
+/**\r
+  Terminates the use of a variable argument list.\r
+\r
+  This function initializes Marker so it can no longer be used with VA_ARG().  \r
+  After this macro is used, the only way to access the variable argument list is \r
+  by using VA_START() again.\r
+\r
+  @param   Marker   VA_LIST used to traverse the list of arguments.\r
+  \r
+**/\r
+#define VA_END(Marker)      (Marker = (VA_LIST) 0)\r
 \r
 #endif\r
 \r