detect-arch.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. // x86_64
  6. #if defined(__x86_64__) || defined(_M_X64)
  7. #error archfound x86_64
  8. // x86
  9. #elif defined(__i386) || defined(_M_IX86)
  10. #error archfound i686
  11. // ARM
  12. #elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
  13. #error archfound aarch64
  14. #elif defined(__arm__) || defined(__arm) || defined(_M_ARM) || defined(__TARGET_ARCH_ARM)
  15. #if defined(__ARM64_ARCH_8__) || defined(__ARMv8__) || defined(__ARMv8_A__)
  16. #error archfound armv8
  17. #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__)
  18. #error archfound armv7
  19. #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__)
  20. #error archfound armv6
  21. #elif defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
  22. #error archfound armv5
  23. #elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARCH_5E__)
  24. #error archfound armv4
  25. #elif defined(__ARM_ARCH_3__) || defined(__TARGET_ARCH_3M__)
  26. #error archfound armv3
  27. #elif defined(__ARM_ARCH_2__)
  28. #error archfound armv2
  29. #endif
  30. // PowerPC
  31. #elif defined(__powerpc__) || defined(_ppc__) || defined(__PPC__)
  32. #if defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__)
  33. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  34. #error archfound powerpc64le
  35. #else
  36. #error archfound powerpc64
  37. #endif
  38. #else
  39. #error archfound powerpc
  40. #endif
  41. // --------------- Less common architectures alphabetically below ---------------
  42. // ALPHA
  43. #elif defined(__alpha__) || defined(__alpha)
  44. #error archfound alpha
  45. // Blackfin
  46. #elif defined(__BFIN__)
  47. #error archfound blackfin
  48. // Itanium
  49. #elif defined(__ia64) || defined(_M_IA64)
  50. #error archfound ia64
  51. // MIPS
  52. #elif defined(__mips__) || defined(__mips)
  53. #error archfound mips
  54. // Motorola 68000-series
  55. #elif defined(__m68k__)
  56. #error archfound m68k
  57. // SuperH
  58. #elif defined(__sh__)
  59. #error archfound sh
  60. // SPARC
  61. #elif defined(__sparc__) || defined(__sparc)
  62. #if defined(__sparcv9) || defined(__sparc_v9__)
  63. #error archfound sparc9
  64. #elif defined(__sparcv8) || defined(__sparc_v8__)
  65. #error archfound sparc8
  66. #endif
  67. // SystemZ
  68. #elif defined(__370__)
  69. #error archfound s370
  70. #elif defined(__s390__)
  71. #error archfound s390
  72. #elif defined(__s390x) || defined(__zarch__)
  73. #error archfound s390x
  74. // PARISC
  75. #elif defined(__hppa__)
  76. #error archfound parisc
  77. // RS-6000
  78. #elif defined(__THW_RS6000)
  79. #error archfound rs6000
  80. // RISC-V
  81. #elif defined(__riscv)
  82. #if __riscv_xlen == 64
  83. #error archfound riscv64
  84. #elif __riscv_xlen == 32
  85. #error archfound riscv32
  86. #endif
  87. // LOONGARCH
  88. #elif defined(__loongarch_lp64)
  89. #error archfound loongarch64
  90. // Emscripten (WebAssembly)
  91. #elif defined(__EMSCRIPTEN__)
  92. #error archfound wasm32
  93. // return 'unrecognized' if we do not know what architecture this is
  94. #else
  95. #error archfound unrecognized
  96. #endif