| # | |
| #//===----------------------------------------------------------------------===// | |
| #// | |
| #// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| #// See https://llvm.org/LICENSE.txt for license information. | |
| #// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #// | |
| #//===----------------------------------------------------------------------===// | |
| # | |
| # Determine the architecture from predefined compiler macros | |
| # The architecture name can only contain alphanumeric characters and underscores (i.e., C identifier) | |
| # void get_architecture(string* return_arch) | |
| # - Returns the architecture in return_arch | |
| function(libomp_get_architecture return_arch) | |
| set(detect_arch_src_txt " | |
| #if defined(__KNC__) | |
| #error ARCHITECTURE=mic | |
| // arm64ec also defines _M_AMD64 so this needs to be checked before that | |
| #elif defined(_M_ARM64EC) || defined(__arm64ec__) | |
| #error ARCHITECTURE=arm64ec | |
| #elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) | |
| #error ARCHITECTURE=x86_64 | |
| #elif defined(__i386) || defined(__i386__) || defined(__IA32__) || defined(_M_I86) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) | |
| #error ARCHITECTURE=i386 | |
| #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) | |
| #error ARCHITECTURE=arm | |
| #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6ZK__) | |
| #error ARCHITECTURE=arm | |
| #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) | |
| #error ARCHITECTURE=arm | |
| #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) | |
| #error ARCHITECTURE=arm | |
| #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) | |
| #error ARCHITECTURE=arm | |
| #elif defined(__ARM_ARCH_2__) | |
| #error ARCHITECTURE=arm | |
| #elif defined(__arm__) || defined(_M_ARM) || defined(_ARM) | |
| #error ARCHITECTURE=arm | |
| #elif defined(__ARM64_ARCH_8_32__) | |
| #error ARCHITECTURE=aarch64_32 | |
| #elif defined(__aarch64__) || defined(_M_ARM64) | |
| #error ARCHITECTURE=aarch64 | |
| #elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__) | |
| #error ARCHITECTURE=ppc64le | |
| #elif defined(__powerpc64__) | |
| #error ARCHITECTURE=ppc64 | |
| #elif defined(__powerpc__) && !defined(__powerpc64__) | |
| #error ARCHITECTURE=ppc | |
| #elif defined(__mips__) && defined(__mips64) | |
| #error ARCHITECTURE=mips64 | |
| #elif defined(__mips__) && !defined(__mips64) | |
| #error ARCHITECTURE=mips | |
| #elif defined(__riscv) && __riscv_xlen == 64 | |
| #error ARCHITECTURE=riscv64 | |
| #elif defined(__loongarch__) && __loongarch_grlen == 64 | |
| #error ARCHITECTURE=loongarch64 | |
| #elif defined(__ve__) | |
| #error ARCHITECTURE=ve | |
| #elif defined(__s390x__) | |
| #error ARCHITECTURE=s390x | |
| #elif defined(__wasm32__) | |
| #error ARCHITECTURE=wasm32 | |
| #elif defined(__wasm64__) | |
| #error ARCHITECTURE=wasm64 | |
| #elif defined(__sparcv9) | |
| #error ARCHITECTURE=sparcv9 | |
| #elif defined(__sparc) | |
| #error ARCHITECTURE=sparc | |
| #else | |
| #error ARCHITECTURE=UnknownArchitecture | |
| #endif | |
| ") | |
| # Write out ${detect_arch_src_txt} to a file within the cmake/ subdirectory | |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" ${detect_arch_src_txt}) | |
| # Try to compile using the C Compiler. It will always error out with an #error directive, so store error output to ${local_architecture} | |
| try_run(run_dummy compile_dummy "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" COMPILE_OUTPUT_VARIABLE local_architecture) | |
| # Match the important architecture line and store only that matching string in ${local_architecture} | |
| string(REGEX MATCH "ARCHITECTURE=([a-zA-Z0-9_]+)" local_architecture "${local_architecture}") | |
| # Get rid of the ARCHITECTURE= part of the string | |
| string(REPLACE "ARCHITECTURE=" "" local_architecture "${local_architecture}") | |
| # set the return value to the architecture detected (e.g., 32e, 32, arm, ppc64, etc.) | |
| set(${return_arch} "${local_architecture}" PARENT_SCOPE) | |
| # Remove ${detect_arch_src_txt} from cmake/ subdirectory | |
| file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c") | |
| endfunction() | |
| function(libomp_is_aarch64_a64fx return_is_aarch64_a64fx) | |
| set(is_aarch64_a64fx FALSE) | |
| if (EXISTS "/proc/cpuinfo") | |
| file(READ "/proc/cpuinfo" cpu_info_content) | |
| string(REGEX MATCH "CPU implementer[ \t]*: 0x46\n" cpu_implementer ${cpu_info_content}) | |
| string(REGEX MATCH "CPU architecture[ \t]*: 8\n" cpu_architecture ${cpu_info_content}) | |
| if (cpu_architecture AND cpu_implementer) | |
| set(is_aarch64_a64fx TRUE) | |
| endif() | |
| endif() | |
| set(${return_is_aarch64_a64fx} "${is_aarch64_a64fx}" PARENT_SCOPE) | |
| endfunction(libomp_is_aarch64_a64fx) |