]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add ARM VA_LIST related definitions
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 18 Aug 2009 20:46:21 +0000 (20:46 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 18 Aug 2009 20:46:21 +0000 (20:46 +0000)
Move content from CPU specific ProcessorBind.h files into Base.h if the content is the same for all supported CPU architectures.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9096 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Include/Base.h

index 3f71098861f2b3a6dafe51ce930e89a8fd50a898..850050cce40c57017ae691b786ec0ac9e5d7eecc 100644 (file)
@@ -7,6 +7,7 @@
   be used to implement base modules.\r
 \r
 Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
   be used to implement base modules.\r
 \r
 Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
+Portions Copyright (c) 2008-2009 Apple Inc.<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
 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
@@ -26,6 +27,64 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 //\r
 #include <ProcessorBind.h>\r
 \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)\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
 /// 128 bit buffer containing a unique identifier value.  \r
 /// Unless otherwise specified, aligned on a 64 bit boundary.\r
@@ -342,10 +401,38 @@ struct _LIST_ENTRY {
 **/\r
 #define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))\r
 \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
 // 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
 typedef __builtin_va_list VA_LIST;\r
 \r
 #define VA_START(Marker, Parameter)  __builtin_va_start (Marker, Parameter)\r
@@ -356,7 +443,8 @@ typedef __builtin_va_list VA_LIST;
 \r
 #else\r
 ///\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
 ///\r
 typedef CHAR8 *VA_LIST;\r
 \r
@@ -368,7 +456,7 @@ typedef CHAR8 *VA_LIST;
   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
   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
   @param   Parameter    The name of the parameter that immediately precedes \r
                         the variable argument list.\r
   \r
@@ -386,7 +474,7 @@ typedef CHAR8 *VA_LIST;
   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
   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
   @param   TYPE     The type of argument to retrieve from the beginning \r
                     of the variable argument list.\r
   \r
@@ -402,7 +490,7 @@ typedef CHAR8 *VA_LIST;
   After this macro is used, the only way to access the variable argument list again is \r
   by using VA_START() again.\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
 **/\r
 #define VA_END(Marker)      (Marker = (VA_LIST) 0)\r