environment. There are a set of base libraries in the Mde Package that can\r
be used to implement base modules.\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
+Copyright (c) 2006 - 2009, Intel Corporation<BR>\r
+Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
//\r
#include <ProcessorBind.h>\r
\r
+//\r
+// The Microsoft* C compiler can removed references to unreferenced data items\r
+// if the /OPT:REF linker option is used. We defined a macro as this is a \r
+// a non standard extension\r
+//\r
+#if defined(_MSC_EXTENSIONS) && !defined (MDE_CPU_EBC)\r
+ ///\r
+ /// Remove global variable from the linked image if there are no references to \r
+ /// it after all compiler and linker optimizations have been performed.\r
+ ///\r
+ ///\r
+ #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)\r
+#else\r
+ ///\r
+ /// Remove global variable from the linked image if there are no references to \r
+ /// it after all compiler and linker optimizations have been performed.\r
+ ///\r
+ ///\r
+ #define GLOBAL_REMOVE_IF_UNREFERENCED\r
+#endif\r
+\r
+//\r
+// For symbol name in GNU assembly code, an extra "_" is necessary\r
+//\r
+#if defined(__GNUC__)\r
+ ///\r
+ /// Private worker functions for ASM_PFX()\r
+ ///\r
+ #define _CONCATENATE(a, b) __CONCATENATE(a, b)\r
+ #define __CONCATENATE(a, b) a ## b\r
+\r
+ ///\r
+ /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix\r
+ /// on symbols in assembly language.\r
+ ///\r
+ #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)\r
+#endif\r
+\r
+#if __APPLE__\r
+ //\r
+ // Apple extension that is used by the linker to optimize code size \r
+ // with assembly functions. Put at the end of your .S files\r
+ //\r
+ #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED .subsections_via_symbols\r
+#else\r
+ #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED\r
+#endif\r
+\r
+#ifdef __CC_ARM\r
+ //\r
+ // Older RVCT ARM compilers don't fully support #pragma pack and require __packed \r
+ // as a prefix for the structure.\r
+ //\r
+ #define PACKED __packed\r
+#else\r
+ #define PACKED\r
+#endif\r
+\r
///\r
/// 128 bit buffer containing a unique identifier value. \r
/// Unless otherwise specified, aligned on a 64 bit boundary.\r
**/\r
#define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))\r
\r
-#if defined(__GNUC__)\r
+#if defined(__CC_ARM)\r
+//\r
+// RVCT ARM variable argument list support.\r
+//\r
+\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
+#ifdef __APCS_ADSABI\r
+ typedef int *va_list[1];\r
+ #define VA_LIST va_list\r
+#else\r
+ typedef struct __va_list { void *__ap; } va_list;\r
+ #define VA_LIST va_list\r
+#endif\r
+\r
+#define VA_START(Marker, Parameter) __va_start(Marker, Parameter)\r
+\r
+#define VA_ARG(Marker, TYPE) __va_arg(Marker, TYPE)\r
+\r
+#define VA_END(Marker) ((void)0)\r
+\r
+#elif defined(__GNUC__)\r
//\r
// Use GCC built-in macros for variable argument lists.\r
//\r
+\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 __builtin_va_list VA_LIST;\r
\r
#define VA_START(Marker, Parameter) __builtin_va_start (Marker, Parameter)\r
\r
#else\r
///\r
-/// Pointer to the start of a variable argument list. Same as CHAR8 *.\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
list that immediately follows Parameter. The method for computing the pointer to the \r
next argument in the argument list is CPU specific following the EFIAPI ABI.\r
\r
- @param Marker Pointer to the beginning of the variable argument list.\r
+ @param Marker 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
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 Pointer to the beginning of a variable argument list.\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
After this macro is used, the only way to access the variable argument list again is \r
by using VA_START() again.\r
\r
- @param Marker The variable to set to the beginning of the variable argument list.\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
typedef UINTN *BASE_LIST;\r
\r
+/**\r
+ Returns the size of a data type in sizeof(UINTN) units rounded up to the nearest UINTN boundary.\r
+\r
+ @param TYPE The date type to determine the size of.\r
+\r
+ @return The size of TYPE in sizeof (UINTN) units rounded up to the nearest UINTN boundary.\r
+**/\r
+#define _BASE_INT_SIZE_OF(TYPE) ((sizeof (TYPE) + sizeof (UINTN) - 1) / sizeof (UINTN))\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
@return An argument of the type specified by TYPE.\r
\r
**/\r
-#define BASE_ARG(Marker, TYPE) (*(TYPE *)((UINT8 *)(Marker = (BASE_LIST)((UINT8 *)Marker + _INT_SIZE_OF (TYPE))) - _INT_SIZE_OF (TYPE)))\r
+#define BASE_ARG(Marker, TYPE) (*(TYPE *) ((Marker += _BASE_INT_SIZE_OF (TYPE)) - _BASE_INT_SIZE_OF (TYPE)))\r
\r
/**\r
Macro that returns the byte offset of a field in a data structure. \r
This function rounds the pointer specified by Pointer to the next alignment boundary \r
specified by Alignment. The pointer to the aligned address is returned. \r
\r
- @param Value The value to round up.\r
+ @param Pointer The pointer to round up.\r
@param Alignment The alignment boundary to use to return an aligned pointer.\r
\r
@return Pointer to the aligned address.\r
This macro returns the maximum of two operand specified by a and b. \r
Both a and b must be the same numerical types, signed or unsigned.\r
\r
- @param TYPE Any numerical data types.\r
@param a The first operand with any numerical type.\r
@param b The second operand. It should be the same any numerical type with a.\r
\r
This macro returns the minimal of two operand specified by a and b. \r
Both a and b must be the same numerical types, signed or unsigned.\r
\r
- @param TYPE Any numerical data types.\r
@param a The first operand with any numerical type.\r
@param b The second operand. It should be the same any numerical type with a.\r
\r
//\r
// Status codes common to all execution phases\r
//\r
-typedef INTN RETURN_STATUS;\r
+typedef UINTN RETURN_STATUS;\r
\r
/**\r
Produces a RETURN_STATUS code with the highest bit set. \r
@retval FALSE The high bit of StatusCode is clear.\r
\r
**/\r
-#define RETURN_ERROR(StatusCode) (((RETURN_STATUS)(StatusCode)) < 0)\r
+#define RETURN_ERROR(StatusCode) (((INTN)(RETURN_STATUS)(StatusCode)) < 0)\r
\r
///\r
/// The operation completed successfully.\r
\r
\r
///\r
-/// The Unicode string contained one or more characters that\r
+/// The string contained one or more characters that\r
/// the device could not render and were skipped.\r
///\r
#define RETURN_WARN_UNKNOWN_GLYPH ENCODE_WARNING (1)\r