blob: 1773330de4cb562fd4c3c47c0a3108f92ed563c8 [file] [log] [blame]
Andrey Churbanov17cce422015-01-13 14:35:23 +00001#
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
Jonathan Peyton2e013352015-07-15 16:05:30 +000017function(libomp_get_architecture return_arch)
Andrey Churbanov17cce422015-01-13 14:35:23 +000018 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)
Jonathan Peyton2e013352015-07-15 16:05:30 +000022 #error ARCHITECTURE=x86_64
Andrey Churbanov17cce422015-01-13 14:35:23 +000023 #elif defined(__i386) || defined(__i386__) || defined(__IA32__) || defined(_M_I86) || defined(_M_IX86) || defined(__X86__) || defined(_X86_)
Jonathan Peyton2e013352015-07-15 16:05:30 +000024 #error ARCHITECTURE=i386
Andrey Churbanov17cce422015-01-13 14:35:23 +000025 #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
Jonathan Peyton2e013352015-07-15 16:05:30 +000031 #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
Andrey Churbanov17cce422015-01-13 14:35:23 +000032 #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 #else
46 #error ARCHITECTURE=UnknownArchitecture
47 #endif
48 "
49 )
50 # Write out ${detect_arch_src_txt} to a file within the cmake/ subdirectory
Jonathan Peyton2e013352015-07-15 16:05:30 +000051 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" ${detect_arch_src_txt})
Andrey Churbanov17cce422015-01-13 14:35:23 +000052
53 # Try to compile using the C Compiler. It will always error out with an #error directive, so store error output to ${local_architecture}
Jonathan Peyton2e013352015-07-15 16:05:30 +000054 try_run(run_dummy compile_dummy "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c" COMPILE_OUTPUT_VARIABLE local_architecture)
Andrey Churbanov17cce422015-01-13 14:35:23 +000055
56 # Match the important architecture line and store only that matching string in ${local_architecture}
57 string(REGEX MATCH "ARCHITECTURE=([a-zA-Z0-9_]+)" local_architecture "${local_architecture}")
58
59 # Get rid of the ARCHITECTURE= part of the string
60 string(REPLACE "ARCHITECTURE=" "" local_architecture "${local_architecture}")
61
62 # set the return value to the architecture detected (e.g., 32e, 32, arm, ppc64, etc.)
63 set(${return_arch} "${local_architecture}" PARENT_SCOPE)
64
65 # Remove ${detect_arch_src_txt} from cmake/ subdirectory
Jonathan Peyton2e013352015-07-15 16:05:30 +000066 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c")
Andrey Churbanov17cce422015-01-13 14:35:23 +000067endfunction()