+//\r
+// Verify that ProcessorBind.h produced UEFI Data Types that are compliant with \r
+// Section 2.3.1 of the UEFI 2.3 Specification. Generates a divide by zero \r
+// error or a zero size array declaration in the preprocessor if the size is \r
+// incorrect. These are declared as "extern" so the space for these arrays will \r
+// not be in the modules.\r
+//\r
+extern UINT8 _VerifySizeOfBoolean [(sizeof(BOOLEAN) == 1) / (sizeof(BOOLEAN) == 1)];\r
+extern UINT8 _VerifySizeOfInt8 [(sizeof(INT8) == 1) / (sizeof(INT8) == 1)];\r
+extern UINT8 _VerifySizeOfUint8 [(sizeof(UINT8) == 1) / (sizeof(UINT8) == 1)];\r
+extern UINT8 _VerifySizeOfInt16 [(sizeof(INT16) == 2) / (sizeof(INT16) == 2)];\r
+extern UINT8 _VerifySizeOfUint16 [(sizeof(UINT16) == 2) / (sizeof(UINT16) == 2)];\r
+extern UINT8 _VerifySizeOfInt32 [(sizeof(INT32) == 4) / (sizeof(INT32) == 4)];\r
+extern UINT8 _VerifySizeOfUint32 [(sizeof(UINT32) == 4) / (sizeof(UINT32) == 4)];\r
+extern UINT8 _VerifySizeOfInt64 [(sizeof(INT64) == 8) / (sizeof(INT64) == 8)];\r
+extern UINT8 _VerifySizeOfUint64 [(sizeof(UINT64) == 8) / (sizeof(UINT64) == 8)];\r
+extern UINT8 _VerifySizeOfChar8 [(sizeof(CHAR8) == 1) / (sizeof(CHAR8) == 1)];\r
+extern UINT8 _VerifySizeOfChar16 [(sizeof(CHAR16) == 2) / (sizeof(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