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