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