1# 2#//===----------------------------------------------------------------------===// 3#// 4#// The LLVM Compiler Infrastructure 5#// 6#// This file is dual licensed under the MIT and the University of Illinois Open 7#// Source Licenses. See LICENSE.txt for details. 8#// 9#//===----------------------------------------------------------------------===// 10# 11 12# Determine the architecture from predefined compiler macros 13# The architecture name can only contain alphanumeric characters and underscores (i.e., C identifier) 14 15# void get_architecture(string* return_arch) 16# - Returns the architecture in return_arch 17function(libomp_get_architecture return_arch) 18 set(detect_arch_src_txt " 19 #if defined(__KNC__) 20 #error ARCHITECTURE=mic 21 #elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) 22 #error ARCHITECTURE=x86_64 23 #elif defined(__i386) || defined(__i386__) || defined(__IA32__) || defined(_M_I86) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) 24 #error ARCHITECTURE=i386 25 #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) 26 #error ARCHITECTURE=arm 27 #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__) 28 #error ARCHITECTURE=arm 29 #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) 30 #error ARCHITECTURE=arm 31 #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) 32 #error ARCHITECTURE=arm 33 #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) 34 #error ARCHITECTURE=arm 35 #elif defined(__ARM_ARCH_2__) 36 #error ARCHITECTURE=arm 37 #elif defined(__arm__) || defined(_M_ARM) || defined(_ARM) 38 #error ARCHITECTURE=arm 39 #elif defined(__aarch64__) 40 #error ARCHITECTURE=aarch64 41 #elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__) 42 #error ARCHITECTURE=ppc64le 43 #elif defined(__powerpc64__) 44 #error ARCHITECTURE=ppc64 45 #elif defined(__mips__) && defined(__mips64) 46 #error ARCHITECTURE=mips64 47 #elif defined(__mips__) && !defined(__mips64) 48 #error ARCHITECTURE=mips 49 #else 50 #error ARCHITECTURE=UnknownArchitecture 51 #endif 52 ") 53 # Write out ${detect_arch_src_txt} to a file within the cmake/ subdirectory 54 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" ${detect_arch_src_txt}) 55 56 # Try to compile using the C Compiler. It will always error out with an #error directive, so store error output to ${local_architecture} 57 try_run(run_dummy compile_dummy "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" COMPILE_OUTPUT_VARIABLE local_architecture) 58 59 # Match the important architecture line and store only that matching string in ${local_architecture} 60 string(REGEX MATCH "ARCHITECTURE=([a-zA-Z0-9_]+)" local_architecture "${local_architecture}") 61 62 # Get rid of the ARCHITECTURE= part of the string 63 string(REPLACE "ARCHITECTURE=" "" local_architecture "${local_architecture}") 64 65 # set the return value to the architecture detected (e.g., 32e, 32, arm, ppc64, etc.) 66 set(${return_arch} "${local_architecture}" PARENT_SCOPE) 67 68 # Remove ${detect_arch_src_txt} from cmake/ subdirectory 69 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c") 70endfunction() 71