1 #define STRINGIFY_HELPER(X) #X
2 #define STRINGIFY(X) STRINGIFY_HELPER(X)
4 /* Identify known platforms by name. */
5 #if defined(__linux) || defined(__linux__) || defined(linux)
6 # define PLATFORM_ID "Linux"
8 #elif defined(__MSYS__)
9 # define PLATFORM_ID "MSYS"
11 #elif defined(__CYGWIN__)
12 # define PLATFORM_ID "Cygwin"
14 #elif defined(__MINGW32__)
15 # define PLATFORM_ID "MinGW"
17 #elif defined(__APPLE__)
18 # define PLATFORM_ID "Darwin"
20 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
21 # define PLATFORM_ID "Windows"
23 #elif defined(__FreeBSD__) || defined(__FreeBSD)
24 # define PLATFORM_ID "FreeBSD"
26 #elif defined(__NetBSD__) || defined(__NetBSD)
27 # define PLATFORM_ID "NetBSD"
29 #elif defined(__OpenBSD__) || defined(__OPENBSD)
30 # define PLATFORM_ID "OpenBSD"
32 #elif defined(__sun) || defined(sun)
33 # define PLATFORM_ID "SunOS"
35 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
36 # define PLATFORM_ID "AIX"
38 #elif defined(__hpux) || defined(__hpux__)
39 # define PLATFORM_ID "HP-UX"
41 #elif defined(__HAIKU__)
42 # define PLATFORM_ID "Haiku"
44 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
45 # define PLATFORM_ID "BeOS"
47 #elif defined(__QNX__) || defined(__QNXNTO__)
48 # define PLATFORM_ID "QNX"
50 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
51 # define PLATFORM_ID "Tru64"
53 #elif defined(__riscos) || defined(__riscos__)
54 # define PLATFORM_ID "RISCos"
56 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
57 # define PLATFORM_ID "SINIX"
59 #elif defined(__UNIX_SV__)
60 # define PLATFORM_ID "UNIX_SV"
62 #elif defined(__bsdos__)
63 # define PLATFORM_ID "BSDOS"
65 #elif defined(_MPRAS) || defined(MPRAS)
66 # define PLATFORM_ID "MP-RAS"
68 #elif defined(__osf) || defined(__osf__)
69 # define PLATFORM_ID "OSF1"
71 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
72 # define PLATFORM_ID "SCO_SV"
74 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
75 # define PLATFORM_ID "ULTRIX"
77 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
78 # define PLATFORM_ID "Xenix"
80 #elif defined(__WATCOMC__)
81 # if defined(__LINUX__)
82 # define PLATFORM_ID "Linux"
84 # elif defined(__DOS__)
85 # define PLATFORM_ID "DOS"
87 # elif defined(__OS2__)
88 # define PLATFORM_ID "OS2"
90 # elif defined(__WINDOWS__)
91 # define PLATFORM_ID "Windows3x"
93 # elif defined(__VXWORKS__)
94 # define PLATFORM_ID "VxWorks"
96 # else /* unknown platform */
100 #elif defined(__INTEGRITY)
101 # if defined(INT_178B)
102 # define PLATFORM_ID "Integrity178"
104 # else /* regular Integrity */
105 # define PLATFORM_ID "Integrity"
108 # elif defined(_ADI_COMPILER)
109 # define PLATFORM_ID "ADSP"
111 #else /* unknown platform */
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
121 #if defined(_WIN32) && defined(_MSC_VER)
122 # if defined(_M_IA64)
123 # define ARCHITECTURE_ID "IA64"
125 # elif defined(_M_ARM64EC)
126 # define ARCHITECTURE_ID "ARM64EC"
128 # elif defined(_M_X64) || defined(_M_AMD64)
129 # define ARCHITECTURE_ID "x64"
131 # elif defined(_M_IX86)
132 # define ARCHITECTURE_ID "X86"
134 # elif defined(_M_ARM64)
135 # define ARCHITECTURE_ID "ARM64"
137 # elif defined(_M_ARM)
139 # define ARCHITECTURE_ID "ARMV4I"
141 # define ARCHITECTURE_ID "ARMV5I"
143 # define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
146 # elif defined(_M_MIPS)
147 # define ARCHITECTURE_ID "MIPS"
149 # elif defined(_M_SH)
150 # define ARCHITECTURE_ID "SHx"
152 # else /* unknown architecture */
153 # define ARCHITECTURE_ID ""
156 #elif defined(__WATCOMC__)
158 # define ARCHITECTURE_ID "I86"
160 # elif defined(_M_IX86)
161 # define ARCHITECTURE_ID "X86"
163 # else /* unknown architecture */
164 # define ARCHITECTURE_ID ""
167 #elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
168 # if defined(__ICCARM__)
169 # define ARCHITECTURE_ID "ARM"
171 # elif defined(__ICCRX__)
172 # define ARCHITECTURE_ID "RX"
174 # elif defined(__ICCRH850__)
175 # define ARCHITECTURE_ID "RH850"
177 # elif defined(__ICCRL78__)
178 # define ARCHITECTURE_ID "RL78"
180 # elif defined(__ICCRISCV__)
181 # define ARCHITECTURE_ID "RISCV"
183 # elif defined(__ICCAVR__)
184 # define ARCHITECTURE_ID "AVR"
186 # elif defined(__ICC430__)
187 # define ARCHITECTURE_ID "MSP430"
189 # elif defined(__ICCV850__)
190 # define ARCHITECTURE_ID "V850"
192 # elif defined(__ICC8051__)
193 # define ARCHITECTURE_ID "8051"
195 # elif defined(__ICCSTM8__)
196 # define ARCHITECTURE_ID "STM8"
198 # else /* unknown architecture */
199 # define ARCHITECTURE_ID ""
202 #elif defined(__ghs__)
203 # if defined(__PPC64__)
204 # define ARCHITECTURE_ID "PPC64"
206 # elif defined(__ppc__)
207 # define ARCHITECTURE_ID "PPC"
209 # elif defined(__ARM__)
210 # define ARCHITECTURE_ID "ARM"
212 # elif defined(__x86_64__)
213 # define ARCHITECTURE_ID "x64"
215 # elif defined(__i386__)
216 # define ARCHITECTURE_ID "X86"
218 # else /* unknown architecture */
219 # define ARCHITECTURE_ID ""
222 #elif defined(__TI_COMPILER_VERSION__)
223 # if defined(__TI_ARM__)
224 # define ARCHITECTURE_ID "ARM"
226 # elif defined(__MSP430__)
227 # define ARCHITECTURE_ID "MSP430"
229 # elif defined(__TMS320C28XX__)
230 # define ARCHITECTURE_ID "TMS320C28x"
232 # elif defined(__TMS320C6X__) || defined(_TMS320C6X)
233 # define ARCHITECTURE_ID "TMS320C6x"
235 # else /* unknown architecture */
236 # define ARCHITECTURE_ID ""
239 # elif defined(__ADSPSHARC__)
240 # define ARCHITECTURE_ID "SHARC"
242 # elif defined(__ADSPBLACKFIN__)
243 # define ARCHITECTURE_ID "Blackfin"
245 #elif defined(__TASKING__)
247 # if defined(__CTC__) || defined(__CPTC__)
248 # define ARCHITECTURE_ID "TriCore"
250 # elif defined(__CMCS__)
251 # define ARCHITECTURE_ID "MCS"
253 # elif defined(__CARM__)
254 # define ARCHITECTURE_ID "ARM"
256 # elif defined(__CARC__)
257 # define ARCHITECTURE_ID "ARC"
259 # elif defined(__C51__)
260 # define ARCHITECTURE_ID "8051"
262 # elif defined(__CPCP__)
263 # define ARCHITECTURE_ID "PCP"
266 # define ARCHITECTURE_ID ""
270 # define ARCHITECTURE_ID
273 /* Convert integer to decimal digit literals. */
275 ('0' + (((n) / 10000000)%10)), \
276 ('0' + (((n) / 1000000)%10)), \
277 ('0' + (((n) / 100000)%10)), \
278 ('0' + (((n) / 10000)%10)), \
279 ('0' + (((n) / 1000)%10)), \
280 ('0' + (((n) / 100)%10)), \
281 ('0' + (((n) / 10)%10)), \
284 /* Convert integer to hex digit literals. */
286 ('0' + ((n)>>28 & 0xF)), \
287 ('0' + ((n)>>24 & 0xF)), \
288 ('0' + ((n)>>20 & 0xF)), \
289 ('0' + ((n)>>16 & 0xF)), \
290 ('0' + ((n)>>12 & 0xF)), \
291 ('0' + ((n)>>8 & 0xF)), \
292 ('0' + ((n)>>4 & 0xF)), \
295 /* Construct a string literal encoding the version number. */
296 #ifdef COMPILER_VERSION
297 char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]";
299 /* Construct a string literal encoding the version number components. */
300 #elif defined(COMPILER_VERSION_MAJOR)
301 char const info_version[] = {
302 'I', 'N', 'F', 'O', ':',
303 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
304 COMPILER_VERSION_MAJOR,
305 # ifdef COMPILER_VERSION_MINOR
306 '.', COMPILER_VERSION_MINOR,
307 # ifdef COMPILER_VERSION_PATCH
308 '.', COMPILER_VERSION_PATCH,
309 # ifdef COMPILER_VERSION_TWEAK
310 '.', COMPILER_VERSION_TWEAK,
317 /* Construct a string literal encoding the internal version number. */
318 #ifdef COMPILER_VERSION_INTERNAL
319 char const info_version_internal[] = {
320 'I', 'N', 'F', 'O', ':',
321 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
322 'i','n','t','e','r','n','a','l','[',
323 COMPILER_VERSION_INTERNAL,']','\0'};
324 #elif defined(COMPILER_VERSION_INTERNAL_STR)
325 char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]";
328 /* Construct a string literal encoding the version number components. */
329 #ifdef SIMULATE_VERSION_MAJOR
330 char const info_simulate_version[] = {
331 'I', 'N', 'F', 'O', ':',
332 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
333 SIMULATE_VERSION_MAJOR,
334 # ifdef SIMULATE_VERSION_MINOR
335 '.', SIMULATE_VERSION_MINOR,
336 # ifdef SIMULATE_VERSION_PATCH
337 '.', SIMULATE_VERSION_PATCH,
338 # ifdef SIMULATE_VERSION_TWEAK
339 '.', SIMULATE_VERSION_TWEAK,
346 /* Construct the string literal in pieces to prevent the source from
347 getting matched. Store it in a pointer rather than an array
348 because some compilers will just produce instructions to fill the
349 array rather than assigning a pointer to a static array. */
350 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
351 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";