1 /* Identify known platforms by name. */
2 #if defined(__linux) || defined(__linux__) || defined(linux)
3 # define PLATFORM_ID "Linux"
5 #elif defined(__CYGWIN__)
6 # define PLATFORM_ID "Cygwin"
8 #elif defined(__MINGW32__)
9 # define PLATFORM_ID "MinGW"
11 #elif defined(__APPLE__)
12 # define PLATFORM_ID "Darwin"
14 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
15 # define PLATFORM_ID "Windows"
17 #elif defined(__FreeBSD__) || defined(__FreeBSD)
18 # define PLATFORM_ID "FreeBSD"
20 #elif defined(__NetBSD__) || defined(__NetBSD)
21 # define PLATFORM_ID "NetBSD"
23 #elif defined(__OpenBSD__) || defined(__OPENBSD)
24 # define PLATFORM_ID "OpenBSD"
26 #elif defined(__sun) || defined(sun)
27 # define PLATFORM_ID "SunOS"
29 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
30 # define PLATFORM_ID "AIX"
32 #elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
33 # define PLATFORM_ID "IRIX"
35 #elif defined(__hpux) || defined(__hpux__)
36 # define PLATFORM_ID "HP-UX"
38 #elif defined(__HAIKU__)
39 # define PLATFORM_ID "Haiku"
41 #elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
42 # define PLATFORM_ID "BeOS"
44 #elif defined(__QNX__) || defined(__QNXNTO__)
45 # define PLATFORM_ID "QNX"
47 #elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
48 # define PLATFORM_ID "Tru64"
50 #elif defined(__riscos) || defined(__riscos__)
51 # define PLATFORM_ID "RISCos"
53 #elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
54 # define PLATFORM_ID "SINIX"
56 #elif defined(__UNIX_SV__)
57 # define PLATFORM_ID "UNIX_SV"
59 #elif defined(__bsdos__)
60 # define PLATFORM_ID "BSDOS"
62 #elif defined(_MPRAS) || defined(MPRAS)
63 # define PLATFORM_ID "MP-RAS"
65 #elif defined(__osf) || defined(__osf__)
66 # define PLATFORM_ID "OSF1"
68 #elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
69 # define PLATFORM_ID "SCO_SV"
71 #elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
72 # define PLATFORM_ID "ULTRIX"
74 #elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
75 # define PLATFORM_ID "Xenix"
77 #else /* unknown platform */
78 # define PLATFORM_ID ""
82 /* For windows compilers MSVC and Intel we can determine
83 the architecture of the compiler being used. This is because
84 the compilers do not have flags that can change the architecture,
85 but rather depend on which compiler is being used
87 #if defined(_WIN32) && defined(_MSC_VER)
89 # define ARCHITECTURE_ID "IA64"
91 # elif defined(_M_X64) || defined(_M_AMD64)
92 # define ARCHITECTURE_ID "x64"
94 # elif defined(_M_IX86)
95 # define ARCHITECTURE_ID "X86"
97 # elif defined(_M_ARM)
98 # define ARCHITECTURE_ID "ARM"
100 # elif defined(_M_MIPS)
101 # define ARCHITECTURE_ID "MIPS"
103 # elif defined(_M_SH)
104 # define ARCHITECTURE_ID "SHx"
106 # else /* unknown architecture */
107 # define ARCHITECTURE_ID ""
111 # define ARCHITECTURE_ID ""
114 /* Convert integer to decimal digit literals. */
116 ('0' + (((n) / 10000000)%10)), \
117 ('0' + (((n) / 1000000)%10)), \
118 ('0' + (((n) / 100000)%10)), \
119 ('0' + (((n) / 10000)%10)), \
120 ('0' + (((n) / 1000)%10)), \
121 ('0' + (((n) / 100)%10)), \
122 ('0' + (((n) / 10)%10)), \
125 /* Convert integer to hex digit literals. */
127 ('0' + ((n)>>28 & 0xF)), \
128 ('0' + ((n)>>24 & 0xF)), \
129 ('0' + ((n)>>20 & 0xF)), \
130 ('0' + ((n)>>16 & 0xF)), \
131 ('0' + ((n)>>12 & 0xF)), \
132 ('0' + ((n)>>8 & 0xF)), \
133 ('0' + ((n)>>4 & 0xF)), \
136 /* Construct a string literal encoding the version number components. */
137 #ifdef COMPILER_VERSION_MAJOR
138 char const info_version[] = {
139 'I', 'N', 'F', 'O', ':',
140 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
141 COMPILER_VERSION_MAJOR,
142 # ifdef COMPILER_VERSION_MINOR
143 '.', COMPILER_VERSION_MINOR,
144 # ifdef COMPILER_VERSION_PATCH
145 '.', COMPILER_VERSION_PATCH,
146 # ifdef COMPILER_VERSION_TWEAK
147 '.', COMPILER_VERSION_TWEAK,
154 /* Construct the string literal in pieces to prevent the source from
155 getting matched. Store it in a pointer rather than an array
156 because some compilers will just produce instructions to fill the
157 array rather than assigning a pointer to a static array. */
158 char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
159 char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";