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