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(__clang__) && defined(__ti__)
223 # if defined(__ARM_ARCH)
224 # define ARCHITECTURE_ID "Arm"
226 # else /* unknown architecture */
227 # define ARCHITECTURE_ID ""
230 #elif defined(__TI_COMPILER_VERSION__)
231 # if defined(__TI_ARM__)
232 # define ARCHITECTURE_ID "ARM"
234 # elif defined(__MSP430__)
235 # define ARCHITECTURE_ID "MSP430"
237 # elif defined(__TMS320C28XX__)
238 # define ARCHITECTURE_ID "TMS320C28x"
240 # elif defined(__TMS320C6X__) || defined(_TMS320C6X)
241 # define ARCHITECTURE_ID "TMS320C6x"
243 # else /* unknown architecture */
244 # define ARCHITECTURE_ID ""
247 # elif defined(__ADSPSHARC__)
248 # define ARCHITECTURE_ID "SHARC"
250 # elif defined(__ADSPBLACKFIN__)
251 # define ARCHITECTURE_ID "Blackfin"
253 #elif defined(__TASKING__)
255 # if defined(__CTC__) || defined(__CPTC__)
256 # define ARCHITECTURE_ID "TriCore"
258 # elif defined(__CMCS__)
259 # define ARCHITECTURE_ID "MCS"
261 # elif defined(__CARM__)
262 # define ARCHITECTURE_ID "ARM"
264 # elif defined(__CARC__)
265 # define ARCHITECTURE_ID "ARC"
267 # elif defined(__C51__)
268 # define ARCHITECTURE_ID "8051"
270 # elif defined(__CPCP__)
271 # define ARCHITECTURE_ID "PCP"
274 # define ARCHITECTURE_ID ""
278 # define ARCHITECTURE_ID
281 /* Convert integer to decimal digit literals. */
283 ('0' + (((n) / 10000000)%10)), \
284 ('0' + (((n) / 1000000)%10)), \
285 ('0' + (((n) / 100000)%10)), \
286 ('0' + (((n) / 10000)%10)), \
287 ('0' + (((n) / 1000)%10)), \
288 ('0' + (((n) / 100)%10)), \
289 ('0' + (((n) / 10)%10)), \
292 /* Convert integer to hex digit literals. */
294 ('0' + ((n)>>28 & 0xF)), \
295 ('0' + ((n)>>24 & 0xF)), \
296 ('0' + ((n)>>20 & 0xF)), \
297 ('0' + ((n)>>16 & 0xF)), \
298 ('0' + ((n)>>12 & 0xF)), \
299 ('0' + ((n)>>8 & 0xF)), \
300 ('0' + ((n)>>4 & 0xF)), \
303 /* Construct a string literal encoding the version number. */
304 #ifdef COMPILER_VERSION
305 char const* info_version
= "INFO" ":" "compiler_version[" COMPILER_VERSION
"]";
307 /* Construct a string literal encoding the version number components. */
308 #elif defined(COMPILER_VERSION_MAJOR)
309 char const info_version
[] = {
310 'I', 'N', 'F', 'O', ':',
311 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
312 COMPILER_VERSION_MAJOR
,
313 # ifdef COMPILER_VERSION_MINOR
314 '.', COMPILER_VERSION_MINOR
,
315 # ifdef COMPILER_VERSION_PATCH
316 '.', COMPILER_VERSION_PATCH
,
317 # ifdef COMPILER_VERSION_TWEAK
318 '.', COMPILER_VERSION_TWEAK
,
325 /* Construct a string literal encoding the internal version number. */
326 #ifdef COMPILER_VERSION_INTERNAL
327 char const info_version_internal
[] = {
328 'I', 'N', 'F', 'O', ':',
329 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
330 'i','n','t','e','r','n','a','l','[',
331 COMPILER_VERSION_INTERNAL
,']','\0'};
332 #elif defined(COMPILER_VERSION_INTERNAL_STR)
333 char const* info_version_internal
= "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR
"]";
336 /* Construct a string literal encoding the version number components. */
337 #ifdef SIMULATE_VERSION_MAJOR
338 char const info_simulate_version
[] = {
339 'I', 'N', 'F', 'O', ':',
340 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
341 SIMULATE_VERSION_MAJOR
,
342 # ifdef SIMULATE_VERSION_MINOR
343 '.', SIMULATE_VERSION_MINOR
,
344 # ifdef SIMULATE_VERSION_PATCH
345 '.', SIMULATE_VERSION_PATCH
,
346 # ifdef SIMULATE_VERSION_TWEAK
347 '.', SIMULATE_VERSION_TWEAK
,
354 /* Construct the string literal in pieces to prevent the source from
355 getting matched. Store it in a pointer rather than an array
356 because some compilers will just produce instructions to fill the
357 array rather than assigning a pointer to a static array. */
358 char const* info_platform
= "INFO" ":" "platform[" PLATFORM_ID
"]";
359 char const* info_arch
= "INFO" ":" "arch[" ARCHITECTURE_ID
"]";