+\r
+/**\r
+ Verifies the storage size of a given data type.\r
+\r
+ This macro generates a divide by zero error or a zero size array declaration in\r
+ the preprocessor if the size is incorrect. These are declared as "extern" so\r
+ the space for these arrays will not be in the modules.\r
+\r
+ @param TYPE The date type to determine the size of.\r
+ @param Size The expected size for the TYPE.\r
+\r
+**/\r
+#define VERIFY_SIZE_OF(TYPE, Size) extern UINT8 _VerifySizeof##TYPE[(sizeof(TYPE) == (Size)) / (sizeof(TYPE) == (Size))]\r
+\r
+//\r
+// Verify that ProcessorBind.h produced UEFI Data Types that are compliant with\r
+// Section 2.3.1 of the UEFI 2.3 Specification.\r
+//\r
+VERIFY_SIZE_OF (BOOLEAN, 1);\r
+VERIFY_SIZE_OF (INT8, 1);\r
+VERIFY_SIZE_OF (UINT8, 1);\r
+VERIFY_SIZE_OF (INT16, 2);\r
+VERIFY_SIZE_OF (UINT16, 2);\r
+VERIFY_SIZE_OF (INT32, 4);\r
+VERIFY_SIZE_OF (UINT32, 4);\r
+VERIFY_SIZE_OF (INT64, 8);\r
+VERIFY_SIZE_OF (UINT64, 8);\r
+VERIFY_SIZE_OF (CHAR8, 1);\r
+VERIFY_SIZE_OF (CHAR16, 2);\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 the global variable from the linked image if there are no references\r
+ /// to 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