1#define STRINGIFY_HELPER(X) #X 2#define STRINGIFY(X) STRINGIFY_HELPER(X) 3 4/* Identify known platforms by name. */ 5#if defined(__linux) || defined(__linux__) || defined(linux) 6# define PLATFORM_ID "Linux" 7 8#elif defined(__MSYS__) 9# define PLATFORM_ID "MSYS" 10 11#elif defined(__CYGWIN__) 12# define PLATFORM_ID "Cygwin" 13 14#elif defined(__MINGW32__) 15# define PLATFORM_ID "MinGW" 16 17#elif defined(__APPLE__) 18# define PLATFORM_ID "Darwin" 19 20#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) 21# define PLATFORM_ID "Windows" 22 23#elif defined(__DragonFly__) || defined(__DragonFly) 24# define PLATFORM_ID "DragonFly" 25 26#elif defined(__FreeBSD__) || defined(__FreeBSD) 27# define PLATFORM_ID "FreeBSD" 28 29#elif defined(__NetBSD__) || defined(__NetBSD) 30# define PLATFORM_ID "NetBSD" 31 32#elif defined(__OpenBSD__) || defined(__OPENBSD) 33# define PLATFORM_ID "OpenBSD" 34 35#elif defined(__sun) || defined(sun) 36# define PLATFORM_ID "SunOS" 37 38#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) 39# define PLATFORM_ID "AIX" 40 41#elif defined(__hpux) || defined(__hpux__) 42# define PLATFORM_ID "HP-UX" 43 44#elif defined(__HAIKU__) 45# define PLATFORM_ID "Haiku" 46 47#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) 48# define PLATFORM_ID "BeOS" 49 50#elif defined(__QNX__) || defined(__QNXNTO__) 51# define PLATFORM_ID "QNX" 52 53#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) 54# define PLATFORM_ID "Tru64" 55 56#elif defined(__riscos) || defined(__riscos__) 57# define PLATFORM_ID "RISCos" 58 59#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) 60# define PLATFORM_ID "SINIX" 61 62#elif defined(__UNIX_SV__) 63# define PLATFORM_ID "UNIX_SV" 64 65#elif defined(__bsdos__) 66# define PLATFORM_ID "BSDOS" 67 68#elif defined(_MPRAS) || defined(MPRAS) 69# define PLATFORM_ID "MP-RAS" 70 71#elif defined(__osf) || defined(__osf__) 72# define PLATFORM_ID "OSF1" 73 74#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) 75# define PLATFORM_ID "SCO_SV" 76 77#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) 78# define PLATFORM_ID "ULTRIX" 79 80#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) 81# define PLATFORM_ID "Xenix" 82 83#elif defined(__WATCOMC__) 84# if defined(__LINUX__) 85# define PLATFORM_ID "Linux" 86 87# elif defined(__DOS__) 88# define PLATFORM_ID "DOS" 89 90# elif defined(__OS2__) 91# define PLATFORM_ID "OS2" 92 93# elif defined(__WINDOWS__) 94# define PLATFORM_ID "Windows3x" 95 96# elif defined(__VXWORKS__) 97# define PLATFORM_ID "VxWorks" 98 99# else /* unknown platform */ 100# define PLATFORM_ID 101# endif 102 103#elif defined(__INTEGRITY) 104# if defined(INT_178B) 105# define PLATFORM_ID "Integrity178" 106 107# else /* regular Integrity */ 108# define PLATFORM_ID "Integrity" 109# endif 110 111#else /* unknown platform */ 112# define PLATFORM_ID 113 114#endif 115 116/* For windows compilers MSVC and Intel we can determine 117 the architecture of the compiler being used. This is because 118 the compilers do not have flags that can change the architecture, 119 but rather depend on which compiler is being used 120*/ 121#if defined(_WIN32) && defined(_MSC_VER) 122# if defined(_M_IA64) 123# define ARCHITECTURE_ID "IA64" 124 125# elif defined(_M_ARM64EC) 126# define ARCHITECTURE_ID "ARM64EC" 127 128# elif defined(_M_X64) || defined(_M_AMD64) 129# define ARCHITECTURE_ID "x64" 130 131# elif defined(_M_IX86) 132# define ARCHITECTURE_ID "X86" 133 134# elif defined(_M_ARM64) 135# define ARCHITECTURE_ID "ARM64" 136 137# elif defined(_M_ARM) 138# if _M_ARM == 4 139# define ARCHITECTURE_ID "ARMV4I" 140# elif _M_ARM == 5 141# define ARCHITECTURE_ID "ARMV5I" 142# else 143# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) 144# endif 145 146# elif defined(_M_MIPS) 147# define ARCHITECTURE_ID "MIPS" 148 149# elif defined(_M_SH) 150# define ARCHITECTURE_ID "SHx" 151 152# else /* unknown architecture */ 153# define ARCHITECTURE_ID "" 154# endif 155 156#elif defined(__WATCOMC__) 157# if defined(_M_I86) 158# define ARCHITECTURE_ID "I86" 159 160# elif defined(_M_IX86) 161# define ARCHITECTURE_ID "X86" 162 163# else /* unknown architecture */ 164# define ARCHITECTURE_ID "" 165# endif 166 167#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) 168# if defined(__ICCARM__) 169# define ARCHITECTURE_ID "ARM" 170 171# elif defined(__ICCRX__) 172# define ARCHITECTURE_ID "RX" 173 174# elif defined(__ICCRH850__) 175# define ARCHITECTURE_ID "RH850" 176 177# elif defined(__ICCRL78__) 178# define ARCHITECTURE_ID "RL78" 179 180# elif defined(__ICCRISCV__) 181# define ARCHITECTURE_ID "RISCV" 182 183# elif defined(__ICCAVR__) 184# define ARCHITECTURE_ID "AVR" 185 186# elif defined(__ICC430__) 187# define ARCHITECTURE_ID "MSP430" 188 189# elif defined(__ICCV850__) 190# define ARCHITECTURE_ID "V850" 191 192# elif defined(__ICC8051__) 193# define ARCHITECTURE_ID "8051" 194 195# elif defined(__ICCSTM8__) 196# define ARCHITECTURE_ID "STM8" 197 198# else /* unknown architecture */ 199# define ARCHITECTURE_ID "" 200# endif 201 202#elif defined(__ghs__) 203# if defined(__PPC64__) 204# define ARCHITECTURE_ID "PPC64" 205 206# elif defined(__ppc__) 207# define ARCHITECTURE_ID "PPC" 208 209# elif defined(__ARM__) 210# define ARCHITECTURE_ID "ARM" 211 212# elif defined(__x86_64__) 213# define ARCHITECTURE_ID "x64" 214 215# elif defined(__i386__) 216# define ARCHITECTURE_ID "X86" 217 218# else /* unknown architecture */ 219# define ARCHITECTURE_ID "" 220# endif 221 222#elif defined(__TI_COMPILER_VERSION__) 223# if defined(__TI_ARM__) 224# define ARCHITECTURE_ID "ARM" 225 226# elif defined(__MSP430__) 227# define ARCHITECTURE_ID "MSP430" 228 229# elif defined(__TMS320C28XX__) 230# define ARCHITECTURE_ID "TMS320C28x" 231 232# elif defined(__TMS320C6X__) || defined(_TMS320C6X) 233# define ARCHITECTURE_ID "TMS320C6x" 234 235# else /* unknown architecture */ 236# define ARCHITECTURE_ID "" 237# endif 238 239#else 240# define ARCHITECTURE_ID 241#endif 242 243/* Convert integer to decimal digit literals. */ 244#define DEC(n) \ 245 ('0' + (((n) / 10000000)%10)), \ 246 ('0' + (((n) / 1000000)%10)), \ 247 ('0' + (((n) / 100000)%10)), \ 248 ('0' + (((n) / 10000)%10)), \ 249 ('0' + (((n) / 1000)%10)), \ 250 ('0' + (((n) / 100)%10)), \ 251 ('0' + (((n) / 10)%10)), \ 252 ('0' + ((n) % 10)) 253 254/* Convert integer to hex digit literals. */ 255#define HEX(n) \ 256 ('0' + ((n)>>28 & 0xF)), \ 257 ('0' + ((n)>>24 & 0xF)), \ 258 ('0' + ((n)>>20 & 0xF)), \ 259 ('0' + ((n)>>16 & 0xF)), \ 260 ('0' + ((n)>>12 & 0xF)), \ 261 ('0' + ((n)>>8 & 0xF)), \ 262 ('0' + ((n)>>4 & 0xF)), \ 263 ('0' + ((n) & 0xF)) 264 265/* Construct a string literal encoding the version number. */ 266#ifdef COMPILER_VERSION 267char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; 268 269/* Construct a string literal encoding the version number components. */ 270#elif defined(COMPILER_VERSION_MAJOR) 271char const info_version[] = { 272 'I', 'N', 'F', 'O', ':', 273 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', 274 COMPILER_VERSION_MAJOR, 275# ifdef COMPILER_VERSION_MINOR 276 '.', COMPILER_VERSION_MINOR, 277# ifdef COMPILER_VERSION_PATCH 278 '.', COMPILER_VERSION_PATCH, 279# ifdef COMPILER_VERSION_TWEAK 280 '.', COMPILER_VERSION_TWEAK, 281# endif 282# endif 283# endif 284 ']','\0'}; 285#endif 286 287/* Construct a string literal encoding the internal version number. */ 288#ifdef COMPILER_VERSION_INTERNAL 289char const info_version_internal[] = { 290 'I', 'N', 'F', 'O', ':', 291 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', 292 'i','n','t','e','r','n','a','l','[', 293 COMPILER_VERSION_INTERNAL,']','\0'}; 294#elif defined(COMPILER_VERSION_INTERNAL_STR) 295char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; 296#endif 297 298/* Construct a string literal encoding the version number components. */ 299#ifdef SIMULATE_VERSION_MAJOR 300char const info_simulate_version[] = { 301 'I', 'N', 'F', 'O', ':', 302 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', 303 SIMULATE_VERSION_MAJOR, 304# ifdef SIMULATE_VERSION_MINOR 305 '.', SIMULATE_VERSION_MINOR, 306# ifdef SIMULATE_VERSION_PATCH 307 '.', SIMULATE_VERSION_PATCH, 308# ifdef SIMULATE_VERSION_TWEAK 309 '.', SIMULATE_VERSION_TWEAK, 310# endif 311# endif 312# endif 313 ']','\0'}; 314#endif 315 316/* Construct the string literal in pieces to prevent the source from 317 getting matched. Store it in a pointer rather than an array 318 because some compilers will just produce instructions to fill the 319 array rather than assigning a pointer to a static array. */ 320char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; 321char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; 322