CMakeCompilerABI.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /* Size of a pointer-to-data in bytes. */
  2. #define SIZEOF_DPTR (sizeof(void*))
  3. char const info_sizeof_dptr[] = {
  4. /* clang-format off */
  5. 'I', 'N', 'F', 'O', ':', 's', 'i', 'z', 'e', 'o', 'f', '_', 'd', 'p', 't',
  6. 'r', '[', ('0' + ((SIZEOF_DPTR / 10) % 10)), ('0' + (SIZEOF_DPTR % 10)), ']',
  7. '\0'
  8. /* clang-format on */
  9. };
  10. /* Byte order. Only one of these will have bytes in the right order. */
  11. static unsigned short const info_byte_order_big_endian[] = {
  12. /* INFO:byte_order string for BIG_ENDIAN */
  13. 0x494E, 0x464F, 0x3A62, 0x7974, 0x655F, 0x6F72, 0x6465, 0x725B,
  14. 0x4249, 0x475F, 0x454E, 0x4449, 0x414E, 0x5D00, 0x0000
  15. };
  16. static unsigned short const info_byte_order_little_endian[] = {
  17. /* INFO:byte_order string for LITTLE_ENDIAN */
  18. 0x4E49, 0x4F46, 0x623A, 0x7479, 0x5F65, 0x726F, 0x6564, 0x5B72,
  19. 0x494C, 0x5454, 0x454C, 0x455F, 0x444E, 0x4149, 0x5D4E, 0x0000
  20. };
  21. /* Application Binary Interface. */
  22. /* Check for (some) ARM ABIs.
  23. * See e.g. http://wiki.debian.org/ArmEabiPort for some information on this. */
  24. #if defined(__GNU__) && defined(__ELF__) && defined(__ARM_EABI__)
  25. # define ABI_ID "ELF ARMEABI"
  26. #elif defined(__GNU__) && defined(__ELF__) && defined(__ARMEB__)
  27. # define ABI_ID "ELF ARM"
  28. #elif defined(__GNU__) && defined(__ELF__) && defined(__ARMEL__)
  29. # define ABI_ID "ELF ARM"
  30. #elif defined(__linux__) && defined(__ELF__) && defined(__amd64__) && \
  31. defined(__ILP32__)
  32. # define ABI_ID "ELF X32"
  33. #elif defined(__ELF__)
  34. # define ABI_ID "ELF"
  35. #endif
  36. /* Sync with:
  37. * Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst
  38. * Modules/CMakeFortranCompilerABI.F
  39. * Modules/CMakeFortranCompilerABI.F90
  40. * Modules/Internal/CMakeParseCompilerArchitectureId.cmake
  41. */
  42. #if defined(__APPLE__) && defined(__arm64__)
  43. # if defined(__ARM64_ARCH_8_32__)
  44. # define ARCHITECTURE_ID "arm64_32"
  45. # elif defined(__arm64e__)
  46. # define ARCHITECTURE_ID "arm64e"
  47. # else
  48. # define ARCHITECTURE_ID "arm64"
  49. # endif
  50. #elif defined(_MSC_VER) && defined(_M_ARM64EC)
  51. # define ARCHITECTURE_ID "arm64ec"
  52. #elif defined(_MSC_VER) && defined(_M_ARM64)
  53. # define ARCHITECTURE_ID "arm64"
  54. #elif defined(__arm64ec__)
  55. # define ARCHITECTURE_ID "arm64ec"
  56. #elif defined(__aarch64__)
  57. # define ARCHITECTURE_ID "aarch64"
  58. #elif __ARM_ARCH == 7 || _M_ARM == 7 || defined(__ARM_ARCH_7__) || \
  59. defined(__TI_ARM_V7__)
  60. # if defined(__APPLE__) && defined(__ARM_ARCH_7K__)
  61. # define ARCHITECTURE_ID "armv7k"
  62. # elif defined(__APPLE__) && defined(__ARM_ARCH_7S__)
  63. # define ARCHITECTURE_ID "armv7s"
  64. # else
  65. # define ARCHITECTURE_ID "armv7"
  66. # endif
  67. #elif __ARM_ARCH == 6 || _M_ARM == 6 || defined(__ARM_ARCH_6__) || \
  68. defined(__TI_ARM_V6__)
  69. # define ARCHITECTURE_ID "armv6"
  70. #elif __ARM_ARCH == 5 || _M_ARM == 5 || defined(__ARM_ARCH_5__) || \
  71. defined(__TI_ARM_V5__)
  72. # define ARCHITECTURE_ID "armv5"
  73. #elif defined(__alpha) || defined(__alpha) || defined(_M_ALPHA)
  74. # define ARCHITECTURE_ID "alpha"
  75. #elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || \
  76. defined(__amd64__) || defined(_M_X64) || defined(_M_AMD64)
  77. # define ARCHITECTURE_ID "x86_64"
  78. #elif defined(__i686) || defined(__i686__) || _M_IX86 == 600
  79. # define ARCHITECTURE_ID "i686"
  80. #elif defined(__i586) || defined(__i586__) || _M_IX86 == 500
  81. # define ARCHITECTURE_ID "i586"
  82. #elif defined(__i486) || defined(__i486__) || _M_IX86 == 400
  83. # define ARCHITECTURE_ID "i486"
  84. #elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
  85. # define ARCHITECTURE_ID "i386"
  86. #elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
  87. # define ARCHITECTURE_ID "ia64"
  88. #elif defined(__loongarch64)
  89. # define ARCHITECTURE_ID "loongarch64"
  90. #elif defined(__loongarch__)
  91. # define ARCHITECTURE_ID "loongarch32"
  92. #elif defined(__m68k__)
  93. # define ARCHITECTURE_ID "m68k"
  94. #elif defined(__mips64) || defined(__mips64__)
  95. # if defined(_MIPSEL)
  96. # define ARCHITECTURE_ID "mips64el"
  97. # else
  98. # define ARCHITECTURE_ID "mips64"
  99. # endif
  100. #elif defined(__mips) || defined(__mips__)
  101. # if defined(_MIPSEL)
  102. # define ARCHITECTURE_ID "mipsel"
  103. # else
  104. # define ARCHITECTURE_ID "mips"
  105. # endif
  106. #elif defined(__riscv) && __riscv_xlen == 64
  107. # define ARCHITECTURE_ID "riscv64"
  108. #elif defined(__riscv) && __riscv_xlen == 32
  109. # define ARCHITECTURE_ID "riscv32"
  110. #elif defined(__sw_64)
  111. # define ARCHITECTURE_ID "sw_64"
  112. #elif defined(__s390x__)
  113. # define ARCHITECTURE_ID "s390x"
  114. #elif defined(__s390__)
  115. # define ARCHITECTURE_ID "s390"
  116. #elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
  117. # define ARCHITECTURE_ID "sparcv9"
  118. #elif defined(__sparc) || defined(__sparc__)
  119. # define ARCHITECTURE_ID "sparc"
  120. #elif defined(__hppa) || defined(__hppa__)
  121. # if defined(__LP64__)
  122. # define ARCHITECTURE_ID "parisc64"
  123. # else
  124. # define ARCHITECTURE_ID "parisc"
  125. # endif
  126. #elif defined(__ppc64__) || defined(__powerpc64__) || defined(__PPC64__) || \
  127. defined(_ARCH_PPC64)
  128. # if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
  129. # define ARCHITECTURE_ID "ppc64le"
  130. # else
  131. # define ARCHITECTURE_ID "ppc64"
  132. # endif
  133. #elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) || \
  134. defined(_ARCH_PPC)
  135. # if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
  136. # define ARCHITECTURE_ID "ppcle"
  137. # else
  138. # define ARCHITECTURE_ID "ppc"
  139. # endif
  140. #endif
  141. /* Construct the string literal in pieces to prevent the source from
  142. getting matched. Store it in a pointer rather than an array
  143. because some compilers will just produce instructions to fill the
  144. array rather than assigning a pointer to a static array. */
  145. #if defined(ABI_ID)
  146. static char const* info_abi = "INFO"
  147. ":"
  148. "abi[" ABI_ID "]";
  149. #endif
  150. #if defined(ARCHITECTURE_ID)
  151. static char const* info_arch = "INFO"
  152. ":"
  153. "arch[" ARCHITECTURE_ID "]";
  154. #endif