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