1# 2#//===----------------------------------------------------------------------===// 3#// 4#// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5#// See https://llvm.org/LICENSE.txt for license information. 6#// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7#// 8#//===----------------------------------------------------------------------===// 9# 10 11# Determine the architecture from predefined compiler macros 12# The architecture name can only contain alphanumeric characters and underscores (i.e., C identifier) 13 14# void get_architecture(string* return_arch) 15# - Returns the architecture in return_arch 16function(libomp_get_architecture return_arch) 17 set(detect_arch_src_txt " 18 #if defined(__KNC__) 19 #error ARCHITECTURE=mic 20 #elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) 21 #error ARCHITECTURE=x86_64 22 #elif defined(__i386) || defined(__i386__) || defined(__IA32__) || defined(_M_I86) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) 23 #error ARCHITECTURE=i386 24 #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) 25 #error ARCHITECTURE=arm 26 #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__) 27 #error ARCHITECTURE=arm 28 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) 29 #error ARCHITECTURE=arm 30 #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) 31 #error ARCHITECTURE=arm 32 #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) 33 #error ARCHITECTURE=arm 34 #elif defined(__ARM_ARCH_2__) 35 #error ARCHITECTURE=arm 36 #elif defined(__arm__) || defined(_M_ARM) || defined(_ARM) 37 #error ARCHITECTURE=arm 38 #elif defined(__aarch64__) 39 #error ARCHITECTURE=aarch64 40 #elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__) 41 #error ARCHITECTURE=ppc64le 42 #elif defined(__powerpc64__) 43 #error ARCHITECTURE=ppc64 44 #elif defined(__mips__) && defined(__mips64) 45 #error ARCHITECTURE=mips64 46 #elif defined(__mips__) && !defined(__mips64) 47 #error ARCHITECTURE=mips 48 #elif defined(__riscv) && __riscv_xlen == 64 49 #error ARCHITECTURE=riscv64 50 #else 51 #error ARCHITECTURE=UnknownArchitecture 52 #endif 53 ") 54 # Write out ${detect_arch_src_txt} to a file within the cmake/ subdirectory 55 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" ${detect_arch_src_txt}) 56 57 # Try to compile using the C Compiler. It will always error out with an #error directive, so store error output to ${local_architecture} 58 try_run(run_dummy compile_dummy "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" COMPILE_OUTPUT_VARIABLE local_architecture) 59 60 # Match the important architecture line and store only that matching string in ${local_architecture} 61 string(REGEX MATCH "ARCHITECTURE=([a-zA-Z0-9_]+)" local_architecture "${local_architecture}") 62 63 # Get rid of the ARCHITECTURE= part of the string 64 string(REPLACE "ARCHITECTURE=" "" local_architecture "${local_architecture}") 65 66 # set the return value to the architecture detected (e.g., 32e, 32, arm, ppc64, etc.) 67 set(${return_arch} "${local_architecture}" PARENT_SCOPE) 68 69 # Remove ${detect_arch_src_txt} from cmake/ subdirectory 70 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c") 71endfunction() 72 73function(libomp_is_aarch64_a64fx return_is_aarch64_a64fx) 74 set(is_aarch64_a64fx FALSE) 75 if (EXISTS "/proc/cpuinfo") 76 file(READ "/proc/cpuinfo" cpu_info_content) 77 string(REGEX MATCH "CPU implementer[ \t]*: 0x46\n" cpu_implementer ${cpu_info_content}) 78 string(REGEX MATCH "CPU architecture[ \t]*: 8\n" cpu_architecture ${cpu_info_content}) 79 80 if (cpu_architecture AND cpu_implementer) 81 set(is_aarch64_a64fx TRUE) 82 endif() 83 endif() 84 85 set(${return_is_aarch64_a64fx} "${is_aarch64_a64fx}" PARENT_SCOPE) 86endfunction(libomp_is_aarch64_a64fx) 87