Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 1 | # |
| 2 | #//===----------------------------------------------------------------------===// |
| 3 | #// |
Chandler Carruth | 57b08b0 | 2019-01-19 10:56:40 +0000 | [diff] [blame] | 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 |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 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 |
Jonathan Peyton | 2e01335 | 2015-07-15 16:05:30 +0000 | [diff] [blame] | 16 | function(libomp_get_architecture return_arch) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 17 | set(detect_arch_src_txt " |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 18 | #if defined(__KNC__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 19 | #error ARCHITECTURE=mic |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 20 | #elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 21 | #error ARCHITECTURE=x86_64 |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 22 | #elif defined(__i386) || defined(__i386__) || defined(__IA32__) || defined(_M_I86) || defined(_M_IX86) || defined(__X86__) || defined(_X86_) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 23 | #error ARCHITECTURE=i386 |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 24 | #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 25 | #error ARCHITECTURE=arm |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 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__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 27 | #error ARCHITECTURE=arm |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 28 | #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 29 | #error ARCHITECTURE=arm |
Jonathan Peyton | 2e01335 | 2015-07-15 16:05:30 +0000 | [diff] [blame] | 30 | #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 31 | #error ARCHITECTURE=arm |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 32 | #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 33 | #error ARCHITECTURE=arm |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 34 | #elif defined(__ARM_ARCH_2__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 35 | #error ARCHITECTURE=arm |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 36 | #elif defined(__arm__) || defined(_M_ARM) || defined(_ARM) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 37 | #error ARCHITECTURE=arm |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 38 | #elif defined(__aarch64__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 39 | #error ARCHITECTURE=aarch64 |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 40 | #elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 41 | #error ARCHITECTURE=ppc64le |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 42 | #elif defined(__powerpc64__) |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 43 | #error ARCHITECTURE=ppc64 |
Sylvestre Ledru | cd9d374 | 2016-12-08 09:22:24 +0000 | [diff] [blame] | 44 | #elif defined(__mips__) && defined(__mips64) |
| 45 | #error ARCHITECTURE=mips64 |
| 46 | #elif defined(__mips__) && !defined(__mips64) |
| 47 | #error ARCHITECTURE=mips |
Jonas Hahnfeld | 2488ae9 | 2019-07-25 14:36:20 +0000 | [diff] [blame] | 48 | #elif defined(__riscv) && __riscv_xlen == 64 |
| 49 | #error ARCHITECTURE=riscv64 |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 50 | #else |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 51 | #error ARCHITECTURE=UnknownArchitecture |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 52 | #endif |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 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}) |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 56 | |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 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) |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 59 | |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 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}") |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 62 | |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 63 | # Get rid of the ARCHITECTURE= part of the string |
| 64 | string(REPLACE "ARCHITECTURE=" "" local_architecture "${local_architecture}") |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 65 | |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 66 | # set the return value to the architecture detected (e.g., 32e, 32, arm, ppc64, etc.) |
| 67 | set(${return_arch} "${local_architecture}" PARENT_SCOPE) |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 68 | |
Jonathan Peyton | 5b4acbd | 2015-07-15 16:57:19 +0000 | [diff] [blame] | 69 | # Remove ${detect_arch_src_txt} from cmake/ subdirectory |
| 70 | file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/libomp_detect_arch.c") |
Andrey Churbanov | 17cce42 | 2015-01-13 14:35:23 +0000 | [diff] [blame] | 71 | endfunction() |