+//\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