1 // archdetect.c -- Detect compiler architecture and raise preprocessor error
2 //                 containing a simple arch identifier.
3 // Copyright (C) 2019 Hans Kristian Rosbach
4 // Licensed under the Zlib license, see LICENSE.md for details
5 
6 // x86_64
7 #if defined(__x86_64__) || defined(_M_X64)
8     #error archfound x86_64
9 
10 // x86
11 #elif defined(__i386) || defined(_M_IX86)
12     #error archfound i686
13 
14 // ARM
15 #elif defined(__aarch64__) || defined(_M_ARM64)
16     #error archfound aarch64
17 #elif defined(__arm__) || defined(__arm) || defined(_M_ARM) || defined(__TARGET_ARCH_ARM)
18     #if defined(__ARM64_ARCH_8__) || defined(__ARMv8__) || defined(__ARMv8_A__)
19         #error archfound armv8
20     #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__)
21         #error archfound armv7
22     #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6M__)
23         #error archfound armv6
24     #elif defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
25         #error archfound armv5
26     #elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARCH_5E__)
27         #error archfound armv4
28     #elif defined(__ARM_ARCH_3__) || defined(__TARGET_ARCH_3M__)
29         #error archfound armv3
30     #elif defined(__ARM_ARCH_2__)
31         #error archfound armv2
32     #endif
33 
34 // PowerPC
35 #elif defined(__powerpc__) || defined(_ppc__) || defined(__PPC__)
36     #if defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__)
37         #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
38             #error archfound powerpc64le
39         #else
40             #error archfound powerpc64
41         #endif
42     #else
43         #error archfound powerpc
44     #endif
45 
46 // --------------- Less common architectures alphabetically below ---------------
47 
48 // ALPHA
49 #elif defined(__alpha__) || defined(__alpha)
50     #error archfound alpha
51 
52 // Blackfin
53 #elif defined(__BFIN__)
54     #error archfound blackfin
55 
56 // Itanium
57 #elif defined(__ia64) || defined(_M_IA64)
58     #error archfound ia64
59 
60 // MIPS
61 #elif defined(__mips__) || defined(__mips)
62     #error archfound mips
63 
64 // Motorola 68000-series
65 #elif defined(__m68k__)
66     #error archfound m68k
67 
68 // SuperH
69 #elif defined(__sh__)
70     #error archfound sh
71 
72 // SPARC
73 #elif defined(__sparc__) || defined(__sparc)
74     #if defined(__sparcv9) || defined(__sparc_v9__)
75         #error archfound sparc9
76     #elif defined(__sparcv8) || defined(__sparc_v8__)
77         #error archfound sparc8
78     #endif
79 
80 // SystemZ
81 #elif defined(__370__)
82     #error archfound s370
83 #elif defined(__s390__)
84     #error archfound s390
85 #elif defined(__s390x) || defined(__zarch__)
86     #error archfound s390x
87 
88 // PARISC
89 #elif defined(__hppa__)
90     #error archfound parisc
91 
92 // RS-6000
93 #elif defined(__THW_RS6000)
94     #error archfound rs6000
95 
96 // return 'unrecognized' if we do not know what architecture this is
97 #else
98     #error archfound unrecognized
99 #endif
100