[Flang] LLVM_ENABLE_RUNTIMES=flang-rt (#110217)
Extract Flang's runtime library to use the LLVM_ENABLE_RUNTIME mechanism. It will only become active when `LLVM_ENABLE_RUNTIMES=flang-rt` is used, which also changes the `FLANG_INCLUDE_RUNTIME` to `OFF` so the old runtime build rules do not conflict. This also means that unless `LLVM_ENABLE_RUNTIMES=flang-rt` is passed, nothing changes with the current build process. Motivation: * Consistency with LLVM's other runtime libraries (compiler-rt, libc, libcxx, openmp offload, ...) * Allows compiling the runtime for multiple targets at once using the LLVM_RUNTIME_TARGETS configuration options * Installs the runtime into the compiler's per-target resource directory so it can be automatically found even when cross-compiling Also see RFC discussion at https://discourse.llvm.org/t/rfc-use-llvm-enable-runtimes-for-flangs-runtime/80826
This commit is contained in:
parent
17d508f30d
commit
b55f7512a7
2
flang-rt/.clang-tidy
Normal file
2
flang-rt/.clang-tidy
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Checks: '-llvm-include-order,readability-braces-around-statements,-readability-identifier-naming,-clang-diagnostic-*'
|
||||||
|
InheritParentConfig: true
|
261
flang-rt/CMakeLists.txt
Normal file
261
flang-rt/CMakeLists.txt
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
#===-- CMakeLists.txt ------------------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
#
|
||||||
|
# Build instructions for the flang-rt library. This is file is intended to be
|
||||||
|
# included using the LLVM_ENABLE_RUNTIMES mechanism.
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
if (NOT LLVM_RUNTIMES_BUILD)
|
||||||
|
message(FATAL_ERROR "Use this CMakeLists.txt from LLVM's runtimes build system.
|
||||||
|
Example:
|
||||||
|
cmake <llvm-project>/runtimes -DLLVM_ENABLE_RUNTIMES=flang-rt
|
||||||
|
")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set(LLVM_SUBPROJECT_TITLE "Flang-RT")
|
||||||
|
set(FLANG_RT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
set(FLANG_RT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../flang")
|
||||||
|
|
||||||
|
# CMake 3.24 is the first version of CMake that directly recognizes Flang.
|
||||||
|
# LLVM's requirement is only CMake 3.20, teach CMake 3.20-3.23 how to use Flang.
|
||||||
|
if (CMAKE_VERSION VERSION_LESS "3.24")
|
||||||
|
cmake_path(GET CMAKE_Fortran_COMPILER STEM _Fortran_COMPILER_STEM)
|
||||||
|
if (_Fortran_COMPILER_STEM STREQUAL "flang-new" OR _Fortran_COMPILER_STEM STREQUAL "flang")
|
||||||
|
include(CMakeForceCompiler)
|
||||||
|
CMAKE_FORCE_Fortran_COMPILER("${CMAKE_Fortran_COMPILER}" "LLVMFlang")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_COMPILER_ID "LLVMFlang")
|
||||||
|
set(CMAKE_Fortran_COMPILER_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_SUBMODULE_SEP "-")
|
||||||
|
set(CMAKE_Fortran_SUBMODULE_EXT ".mod")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_PREPROCESS_SOURCE
|
||||||
|
"<CMAKE_Fortran_COMPILER> -cpp <DEFINES> <INCLUDES> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-ffixed-form")
|
||||||
|
set(CMAKE_Fortran_FORMAT_FREE_FLAG "-ffree-form")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_MODDIR_FLAG "-module-dir")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_ON "-cpp")
|
||||||
|
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_OFF "-nocpp")
|
||||||
|
set(CMAKE_Fortran_POSTPROCESS_FLAG "-ffixed-line-length-72")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_COMPILE_OPTIONS_TARGET "--target=")
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_LINKER_WRAPPER_FLAG "-Wl,")
|
||||||
|
set(CMAKE_Fortran_LINKER_WRAPPER_FLAG_SEP ",")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
enable_language(Fortran)
|
||||||
|
|
||||||
|
|
||||||
|
list(APPEND CMAKE_MODULE_PATH
|
||||||
|
"${FLANG_RT_SOURCE_DIR}/cmake/modules"
|
||||||
|
"${FLANG_SOURCE_DIR}/cmake/modules"
|
||||||
|
)
|
||||||
|
include(AddFlangRT)
|
||||||
|
include(GetToolchainDirs)
|
||||||
|
include(FlangCommon)
|
||||||
|
include(HandleCompilerRT)
|
||||||
|
include(ExtendPath)
|
||||||
|
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Build Mode Introspection #
|
||||||
|
############################
|
||||||
|
|
||||||
|
# Determine whether we are in the runtimes/runtimes-bins directory of a
|
||||||
|
# bootstrap build.
|
||||||
|
set(LLVM_TREE_AVAILABLE OFF)
|
||||||
|
if (LLVM_LIBRARY_OUTPUT_INTDIR AND LLVM_RUNTIME_OUTPUT_INTDIR AND PACKAGE_VERSION)
|
||||||
|
set(LLVM_TREE_AVAILABLE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Path to LLVM development tools (FileCheck, llvm-lit, not, ...)
|
||||||
|
set(LLVM_TOOLS_DIR "${LLVM_BINARY_DIR}/bin")
|
||||||
|
|
||||||
|
# Determine build and install paths.
|
||||||
|
# The build path is absolute, but the install dir is relative, CMake's install
|
||||||
|
# command has to apply CMAKE_INSTALL_PREFIX itself.
|
||||||
|
get_toolchain_library_subdir(toolchain_lib_subdir)
|
||||||
|
if (LLVM_TREE_AVAILABLE)
|
||||||
|
# In a bootstrap build emit the libraries into a default search path in the
|
||||||
|
# build directory of the just-built compiler. This allows using the
|
||||||
|
# just-built compiler without specifying paths to runtime libraries.
|
||||||
|
#
|
||||||
|
# Despite Clang in the name, get_clang_resource_dir does not depend on Clang
|
||||||
|
# being added to the build. Flang uses the same resource dir as clang.
|
||||||
|
include(GetClangResourceDir)
|
||||||
|
get_clang_resource_dir(FLANG_RT_OUTPUT_RESOURCE_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/..")
|
||||||
|
get_clang_resource_dir(FLANG_RT_INSTALL_RESOURCE_PATH)
|
||||||
|
|
||||||
|
extend_path(FLANG_RT_OUTPUT_RESOURCE_LIB_DIR "${FLANG_RT_OUTPUT_RESOURCE_DIR}" "${toolchain_lib_subdir}")
|
||||||
|
else ()
|
||||||
|
# In a standalone runtimes build, do not write into LLVM_BINARY_DIR. It may be
|
||||||
|
# read-only and/or shared by multiple runtimes with different build
|
||||||
|
# configurations (e.g. Debug/Release). Use the runtime's own lib dir like any
|
||||||
|
# non-toolchain library.
|
||||||
|
# For the install prefix, still use the resource dir assuming that Flang will
|
||||||
|
# be installed there using the same prefix. This is to not have a difference
|
||||||
|
# between bootstrap and standalone runtimes builds.
|
||||||
|
set(FLANG_RT_OUTPUT_RESOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
set(FLANG_RT_INSTALL_RESOURCE_PATH "lib${LLVM_LIBDIR_SUFFIX}/clang/${LLVM_VERSION_MAJOR}")
|
||||||
|
|
||||||
|
extend_path(FLANG_RT_OUTPUT_RESOURCE_LIB_DIR "${FLANG_RT_OUTPUT_RESOURCE_DIR}" "lib${LLVM_LIBDIR_SUFFIX}")
|
||||||
|
endif ()
|
||||||
|
extend_path(FLANG_RT_INSTALL_RESOURCE_LIB_PATH "${FLANG_RT_INSTALL_RESOURCE_PATH}" "${toolchain_lib_subdir}")
|
||||||
|
cmake_path(NORMAL_PATH FLANG_RT_OUTPUT_RESOURCE_DIR)
|
||||||
|
cmake_path(NORMAL_PATH FLANG_RT_INSTALL_RESOURCE_PATH)
|
||||||
|
cmake_path(NORMAL_PATH FLANG_RT_OUTPUT_RESOURCE_LIB_DIR)
|
||||||
|
cmake_path(NORMAL_PATH FLANG_RT_INSTALL_RESOURCE_LIB_PATH)
|
||||||
|
|
||||||
|
|
||||||
|
#################
|
||||||
|
# Build Options #
|
||||||
|
#################
|
||||||
|
|
||||||
|
# Important: flang-rt user options must be prefixed with "FLANG_RT_". Variables
|
||||||
|
# with this prefix will be forwarded in bootstrap builds.
|
||||||
|
|
||||||
|
option(FLANG_RT_INCLUDE_TESTS "Generate build targets for the flang-rt unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
|
||||||
|
|
||||||
|
|
||||||
|
set(FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT "" CACHE STRING "Compile Flang-RT with GPU support (CUDA or OpenMP)")
|
||||||
|
set_property(CACHE FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT PROPERTY STRINGS
|
||||||
|
""
|
||||||
|
CUDA
|
||||||
|
OpenMP
|
||||||
|
)
|
||||||
|
if (NOT FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT)
|
||||||
|
# Support for GPUs disabled
|
||||||
|
elseif (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
|
||||||
|
# Support for CUDA
|
||||||
|
set(FLANG_RT_LIBCUDACXX_PATH "" CACHE PATH "Path to libcu++ package installation")
|
||||||
|
option(FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS "Do not compile global variables' definitions when producing PTX library" OFF)
|
||||||
|
elseif (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
|
||||||
|
# Support for OpenMP offloading
|
||||||
|
set(FLANG_RT_DEVICE_ARCHITECTURES "all" CACHE STRING
|
||||||
|
"List of OpenMP device architectures to be used to compile the Fortran runtime (e.g. 'gfx1103;sm_90')"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (FLANG_RT_DEVICE_ARCHITECTURES STREQUAL "all")
|
||||||
|
# TODO: support auto detection on the build system.
|
||||||
|
set(all_amdgpu_architectures
|
||||||
|
"gfx700;gfx701;gfx801;gfx803;gfx900;gfx902;gfx906"
|
||||||
|
"gfx908;gfx90a;gfx90c;gfx940;gfx1010;gfx1030"
|
||||||
|
"gfx1031;gfx1032;gfx1033;gfx1034;gfx1035;gfx1036"
|
||||||
|
"gfx1100;gfx1101;gfx1102;gfx1103;gfx1150;gfx1151"
|
||||||
|
"gfx1152;gfx1153")
|
||||||
|
set(all_nvptx_architectures
|
||||||
|
"sm_35;sm_37;sm_50;sm_52;sm_53;sm_60;sm_61;sm_62"
|
||||||
|
"sm_70;sm_72;sm_75;sm_80;sm_86;sm_89;sm_90")
|
||||||
|
set(all_gpu_architectures
|
||||||
|
"${all_amdgpu_architectures};${all_nvptx_architectures}")
|
||||||
|
set(FLANG_RT_DEVICE_ARCHITECTURES ${all_gpu_architectures})
|
||||||
|
endif()
|
||||||
|
list(REMOVE_DUPLICATES FLANG_RT_DEVICE_ARCHITECTURES)
|
||||||
|
else ()
|
||||||
|
message(FATAL_ERROR "Invalid value '${FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT}' for FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT; must be empty, 'CUDA', or 'OpenMP'")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
option(FLANG_RT_INCLUDE_CUF "Build the CUDA Fortran runtime (libflang_rt.cuda.a)" OFF)
|
||||||
|
if (FLANG_RT_INCLUDE_CUF)
|
||||||
|
find_package(CUDAToolkit REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
########################
|
||||||
|
# System Introspection #
|
||||||
|
########################
|
||||||
|
|
||||||
|
include(CheckCXXSymbolExists)
|
||||||
|
include(CheckCXXSourceCompiles)
|
||||||
|
check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
|
||||||
|
# Can't use symbol exists here as the function is overloaded in C++
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"#include <string.h>
|
||||||
|
int main() {
|
||||||
|
char buf[4096];
|
||||||
|
return strerror_s(buf, 4096, 0);
|
||||||
|
}
|
||||||
|
"
|
||||||
|
HAVE_DECL_STRERROR_S)
|
||||||
|
|
||||||
|
|
||||||
|
# Search for clang_rt.builtins library. Need in addition to msvcrt.
|
||||||
|
if (WIN32)
|
||||||
|
find_compiler_rt_library(builtins FLANG_RT_BUILTINS_LIBRARY)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether the compiler can undefine a macro using the "-U" flag.
|
||||||
|
# Aternatively, we could use
|
||||||
|
# CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU"
|
||||||
|
# but some older versions of CMake don't define it for GCC itself.
|
||||||
|
check_cxx_compiler_flag("-UTESTFLAG" FLANG_RT_SUPPORTS_UNDEFINE_FLAG)
|
||||||
|
|
||||||
|
# Check whether -fno-lto is supported.
|
||||||
|
check_cxx_compiler_flag(-fno-lto FLANG_RT_HAS_FNO_LTO_FLAG)
|
||||||
|
|
||||||
|
|
||||||
|
# function checks
|
||||||
|
find_package(Backtrace)
|
||||||
|
set(HAVE_BACKTRACE ${Backtrace_FOUND})
|
||||||
|
set(BACKTRACE_HEADER ${Backtrace_HEADER})
|
||||||
|
|
||||||
|
|
||||||
|
#####################
|
||||||
|
# Build Preparation #
|
||||||
|
#####################
|
||||||
|
|
||||||
|
if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT AND FLANG_RT_INCLUDE_TESTS)
|
||||||
|
# If Fortran runtime is built as CUDA library, the linking
|
||||||
|
# of targets that link flang-rt must be done
|
||||||
|
# with CUDA_RESOLVE_DEVICE_SYMBOLS.
|
||||||
|
# CUDA language must be enabled for CUDA_RESOLVE_DEVICE_SYMBOLS
|
||||||
|
# to take effect.
|
||||||
|
enable_language(CUDA)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# C++17 is required for flang-rt; user or other runtimes may override this.
|
||||||
|
# GTest included later also requires C++17.
|
||||||
|
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
||||||
|
|
||||||
|
|
||||||
|
configure_file(cmake/config.h.cmake.in config.h)
|
||||||
|
|
||||||
|
|
||||||
|
# The bootstrap build will create a phony target with the same as the top-level
|
||||||
|
# directory ("flang-rt") and delegate it to the runtimes build dir.
|
||||||
|
# AddFlangRT will add all non-EXCLUDE_FROM_ALL targets to it.
|
||||||
|
add_custom_target(flang-rt)
|
||||||
|
|
||||||
|
|
||||||
|
###################
|
||||||
|
# Build Artifacts #
|
||||||
|
###################
|
||||||
|
|
||||||
|
add_subdirectory(lib)
|
||||||
|
|
||||||
|
if (LLVM_INCLUDE_EXAMPLES)
|
||||||
|
add_subdirectory(examples)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (FLANG_RT_INCLUDE_TESTS)
|
||||||
|
add_subdirectory(unittests)
|
||||||
|
add_subdirectory(test)
|
||||||
|
else ()
|
||||||
|
add_custom_target(check-flang-rt)
|
||||||
|
endif()
|
14
flang-rt/CODE_OWNERS.TXT
Normal file
14
flang-rt/CODE_OWNERS.TXT
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
This file is a list of the people responsible for ensuring that patches for a
|
||||||
|
particular part of Flang are reviewed, either by themself or by someone else.
|
||||||
|
They are also the gatekeepers for their part of Flang, with the final word on
|
||||||
|
what goes in or not.
|
||||||
|
|
||||||
|
The list is sorted by surname and formatted to allow easy grepping and
|
||||||
|
beautification by scripts. The fields are: name (N), email (E), web-address
|
||||||
|
(W), PGP key ID and fingerprint (P), description (D), snail-mail address
|
||||||
|
(S) and (I) IRC handle. Each entry should contain at least the (N), (E) and
|
||||||
|
(D) fields.
|
||||||
|
|
||||||
|
N: Steve Scalpone
|
||||||
|
E: sscalpone@nvidia.com
|
||||||
|
D: Anything not covered by others
|
234
flang-rt/LICENSE.TXT
Normal file
234
flang-rt/LICENSE.TXT
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
==============================================================================
|
||||||
|
The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
|
---- LLVM Exceptions to the Apache 2.0 License ----
|
||||||
|
|
||||||
|
As an exception, if, as a result of your compiling your source code, portions
|
||||||
|
of this Software are embedded into an Object form of such source code, you
|
||||||
|
may redistribute such embedded portions in such Object form without complying
|
||||||
|
with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
|
||||||
|
|
||||||
|
In addition, if you combine or link compiled forms of this Software with
|
||||||
|
software that is licensed under the GPLv2 ("Combined Software") and if a
|
||||||
|
court of competent jurisdiction determines that the patent provision (Section
|
||||||
|
3), the indemnity provision (Section 9) or other Section of the License
|
||||||
|
conflicts with the conditions of the GPLv2, you may retroactively and
|
||||||
|
prospectively choose to deem waived or otherwise exclude such Section(s) of
|
||||||
|
the License, but only in their entirety and only with respect to the Combined
|
||||||
|
Software.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
Software from third parties included in the LLVM Project:
|
||||||
|
==============================================================================
|
||||||
|
The LLVM Project contains third party software which is under different license
|
||||||
|
terms. All such code will be identified clearly using at least one of two
|
||||||
|
mechanisms:
|
||||||
|
1) It will be in a separate directory tree with its own `LICENSE.txt` or
|
||||||
|
`LICENSE` file at the top containing the specific license and restrictions
|
||||||
|
which apply to that software, or
|
||||||
|
2) It will contain specific license and restriction terms at the top of every
|
||||||
|
file.
|
188
flang-rt/README.md
Normal file
188
flang-rt/README.md
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
<!--===- README.md
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Fortran Runtime (Flang-RT)
|
||||||
|
|
||||||
|
Flang-RT is the runtime library for code emitted by the Flang compiler
|
||||||
|
(https://flang.llvm.org).
|
||||||
|
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
There are two build modes for the Flang-RT. The bootstrap build, also
|
||||||
|
called the in-tree build, and the runtime-only build, also called the
|
||||||
|
out-of-tree build.
|
||||||
|
Not to be confused with the terms
|
||||||
|
[in-source and out-of-source](https://cmake.org/cmake/help/latest/manual/cmake.1.html#introduction-to-cmake-buildsystems)
|
||||||
|
builds as defined by CMake. In an in-source build, the source directory and the
|
||||||
|
build directory are identical, whereas with an out-of-source build the
|
||||||
|
build artifacts are stored somewhere else, possibly in a subdirectory of the
|
||||||
|
source directory. LLVM does not support in-source builds.
|
||||||
|
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
* [Same as LLVM](https://llvm.org/docs/GettingStarted.html#requirements).
|
||||||
|
|
||||||
|
|
||||||
|
### Bootstrapping Runtimes Build
|
||||||
|
|
||||||
|
The bootstrapping build will first build Clang and Flang, then use these
|
||||||
|
compilers to compile Flang-RT. CMake will create a secondary build tree
|
||||||
|
configured to use these just-built compilers. The secondary build will reuse
|
||||||
|
the same build options (Flags, Debug/Release, ...) as the primary build.
|
||||||
|
It will also ensure that once built, Flang-RT is found by Flang from either
|
||||||
|
the build- or install-prefix. To enable, add `flang-rt` to
|
||||||
|
`LLVM_ENABLE_RUNTIMES`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -S <path-to-llvm-project-source>/llvm \
|
||||||
|
-GNinja \
|
||||||
|
-DLLVM_ENABLE_PROJECTS="clang;flang" \
|
||||||
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
It is recommended to enable building OpenMP alongside Flang and Flang-RT
|
||||||
|
as well. This will build `omp_lib.mod` required to use OpenMP from Fortran.
|
||||||
|
Building Compiler-RT may also be required, particularly on platforms that do
|
||||||
|
not provide all C-ABI functionality (such as Windows).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -S <path-to-llvm-project-source>/llvm \
|
||||||
|
-GNinja \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DLLVM_ENABLE_PROJECTS="clang;flang;openmp" \
|
||||||
|
-DLLVM_ENABLE_RUNTIMES="compiler-rt;flang-rt" \
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, the enabled runtimes will only be built for the host platform
|
||||||
|
(`-DLLVM_RUNTIME_TARGETS=default`). To add additional targets to support
|
||||||
|
cross-compilation via `flang --target=<target-triple>`, add more triples to
|
||||||
|
`LLVM_RUNTIME_TARGETS`, such as
|
||||||
|
`-DLLVM_RUNTIME_TARGETS="default;aarch64-linux-gnu"`.
|
||||||
|
|
||||||
|
After configuration, build, test, and install the runtime(s) via
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ ninja flang-rt
|
||||||
|
$ ninja check-flang-rt
|
||||||
|
$ ninja install
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Standalone Runtimes Build
|
||||||
|
|
||||||
|
Instead of building Clang and Flang from scratch, the standalone Runtime build
|
||||||
|
uses CMake's environment introspection to find a C, C++, and Fortran compiler.
|
||||||
|
The compiler to be used can be controlled using CMake's standard mechanisms such
|
||||||
|
as `CMAKE_CXX_COMPILER`, `CMAKE_CXX_COMPILER`, and `CMAKE_Fortran_COMPILER`.
|
||||||
|
`CMAKE_Fortran_COMPILER` must be `flang` built from the same Git commit as
|
||||||
|
Flang-RT to ensure they are using the same ABI. The C and C++ compiler
|
||||||
|
can be any compiler supporting the same ABI.
|
||||||
|
|
||||||
|
In addition to the compiler, the build be able to find LLVM development tools
|
||||||
|
such as `lit` and `FileCheck` that are not found in an LLVM's install
|
||||||
|
directory. Use `CMAKE_BINARY_DIR` to point to directory where LLVM has
|
||||||
|
been built. A simple build configuration might look like the following:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -S <path-to-llvm-project-source>/runtimes \
|
||||||
|
-GNinja \
|
||||||
|
-DLLVM_BINARY_DIR=<path-to-llvm-builddir> \
|
||||||
|
-DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir>/bin/flang \
|
||||||
|
-DCMAKE_Fortran_COMPILER_WORKS=yes \
|
||||||
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
The `CMAKE_Fortran_COMPILER_WORKS` parameter must be set because otherwise CMake
|
||||||
|
will test whether the Fortran compiler can compile and link programs which will
|
||||||
|
obviously fail without a runtime library available yet.
|
||||||
|
|
||||||
|
Building Flang-RT for cross-compilation triple, the target triple can
|
||||||
|
be selected using `LLVM_DEFAULT_TARGET_TRIPLE` AND `LLVM_RUNTIMES_TARGET`.
|
||||||
|
Of course, Flang-RT can be built multiple times with different build
|
||||||
|
configurations, but have to be located manually when using with the Flang
|
||||||
|
driver using the `-L` option.
|
||||||
|
|
||||||
|
After configuration, build, test, and install the runtime via
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ ninja
|
||||||
|
$ ninja check-flang-rt
|
||||||
|
$ ninja install
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Configuration Option Reference
|
||||||
|
|
||||||
|
Flang-RT has the followign configuration options. This is in
|
||||||
|
addition to the build options the LLVM_ENABLE_RUNTIMES mechanism and
|
||||||
|
CMake itself provide.
|
||||||
|
|
||||||
|
* `FLANG_RT_INCLUDE_TESTS` (boolean; default: `ON`)
|
||||||
|
|
||||||
|
When `OFF`, does not add any tests and unittests. The `check-flang-rt`
|
||||||
|
build target will do nothing.
|
||||||
|
|
||||||
|
* `FLANG_RUNTIME_F128_MATH_LIB` (default: `""`)
|
||||||
|
|
||||||
|
Determines the implementation of `REAL(16)` math functions. If set to
|
||||||
|
`libquadmath`, uses `quadmath.h` and `-lquadmath` typically distributed with
|
||||||
|
gcc. If empty, disables `REAL(16)` support. For any other value, introspects
|
||||||
|
the compiler for `__float128` or 128-bit `long double` support.
|
||||||
|
[More details](docs/Real16MathSupport.md).
|
||||||
|
|
||||||
|
* `FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT` (values: `"CUDA"`,`"OpenMP"`, `""` default: `""`)
|
||||||
|
|
||||||
|
When set to `CUDA`, builds Flang-RT with experimental support for GPU
|
||||||
|
accelerators using CUDA. `CMAKE_CUDA_COMPILER` must be set if not
|
||||||
|
automatically detected by CMake. `nvcc` as well as `clang` are supported.
|
||||||
|
|
||||||
|
When set to `OpenMP`, builds Flang-RT with experimental support for
|
||||||
|
GPU accelerators using OpenMP offloading. Only Clang is supported for
|
||||||
|
`CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER`.
|
||||||
|
|
||||||
|
* `FLANG_RT_INCLUDE_CUF` (bool, default: `OFF`)
|
||||||
|
|
||||||
|
Compiles the `libflang_rt.cuda_<CUDA-version>.a/.so` library. This is
|
||||||
|
independent of `FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA` and only
|
||||||
|
requires a
|
||||||
|
[CUDA Toolkit installation](https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html)
|
||||||
|
(no `CMAKE_CUDA_COMPILER`).
|
||||||
|
|
||||||
|
|
||||||
|
### Experimental CUDA Support
|
||||||
|
|
||||||
|
With `-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following
|
||||||
|
additional configuration options become available.
|
||||||
|
|
||||||
|
* `FLANG_RT_LIBCUDACXX_PATH` (path, default: `""`)
|
||||||
|
|
||||||
|
Path to libcu++ package installation.
|
||||||
|
|
||||||
|
* `FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS` (boolean, default: `OFF`)
|
||||||
|
|
||||||
|
Do not compile global variables' definitions when producing PTX library.
|
||||||
|
Default is `OFF`, meaning global variable definitions are compiled by
|
||||||
|
default.
|
||||||
|
|
||||||
|
|
||||||
|
### Experimental OpenMP Offload Support
|
||||||
|
|
||||||
|
With `-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=OpenMP`, the following
|
||||||
|
additional configuration options become available.
|
||||||
|
|
||||||
|
* `FLANG_RT_DEVICE_ARCHITECTURES` (default: `"all"`)
|
||||||
|
|
||||||
|
A list of device architectures that Flang-RT is going to support.
|
||||||
|
If `"all"` uses a pre-defined list of architectures. Same purpose as
|
||||||
|
`LIBOMPTARGET_DEVICE_ARCHITECTURES` from liboffload.
|
@ -16,4 +16,9 @@
|
|||||||
don't. */
|
don't. */
|
||||||
#cmakedefine01 HAVE_DECL_STRERROR_S
|
#cmakedefine01 HAVE_DECL_STRERROR_S
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `backtrace' function. */
|
||||||
|
#cmakedefine HAVE_BACKTRACE ${HAVE_BACKTRACE}
|
||||||
|
|
||||||
|
#define BACKTRACE_HEADER <${BACKTRACE_HEADER}>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
199
flang-rt/cmake/modules/AddFlangRT.cmake
Normal file
199
flang-rt/cmake/modules/AddFlangRT.cmake
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
#===-- cmake/modules/AddFlangRT.cmake --------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
# Builds a library with common options for Flang-RT.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# add_flangrt_library(name sources ...
|
||||||
|
# SHARED
|
||||||
|
# Build a dynamic (.so/.dll) library
|
||||||
|
# STATIC
|
||||||
|
# Build a static (.a/.lib) library
|
||||||
|
# OBJECT
|
||||||
|
# Create only object files without static/dynamic library
|
||||||
|
# INSTALL_WITH_TOOLCHAIN
|
||||||
|
# Install library into Clang's resource directory so it can be found by the
|
||||||
|
# Flang driver during compilation, including tests
|
||||||
|
# EXCLUDE_FROM_ALL
|
||||||
|
# Do not build library by default; typically used for libraries needed for
|
||||||
|
# testing only, no install
|
||||||
|
# LINK_TO_LLVM
|
||||||
|
# Library requires include path and linking to LLVM's Support component
|
||||||
|
# ADDITIONAL_HEADERS
|
||||||
|
# May specify header files for IDE generators.
|
||||||
|
# INCLUDE_DIRECTORIES
|
||||||
|
# Additional target_include_directories for all added targets
|
||||||
|
# LINK_LIBRARIES
|
||||||
|
# Additional target_link_libraries for all added targets
|
||||||
|
# TARGET_PROPERTIES
|
||||||
|
# Set target properties of all added targets
|
||||||
|
# )
|
||||||
|
function (add_flangrt_library name)
|
||||||
|
set(options STATIC SHARED OBJECT INSTALL_WITH_TOOLCHAIN EXCLUDE_FROM_ALL LINK_TO_LLVM)
|
||||||
|
set(multiValueArgs ADDITIONAL_HEADERS INCLUDE_DIRECTORIES LINK_LIBRARIES TARGET_PROPERTIES)
|
||||||
|
cmake_parse_arguments(ARG
|
||||||
|
"${options}"
|
||||||
|
""
|
||||||
|
"${multiValueArgs}"
|
||||||
|
${ARGN})
|
||||||
|
|
||||||
|
if (ARG_INSTALL_WITH_TOOLCHAIN AND ARG_EXCLUDE_FROM_ALL)
|
||||||
|
message(SEND_ERROR "add_flangrt_library(${name} ...):
|
||||||
|
INSTALL_WITH_TOOLCHAIN and EXCLUDE_FROM_ALL are in conflict. When
|
||||||
|
installing an artifact it must have been built first in the 'all' target.
|
||||||
|
")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Forward libtype to add_library
|
||||||
|
set(extra_args "")
|
||||||
|
if (ARG_SHARED)
|
||||||
|
list(APPEND extra_args SHARED)
|
||||||
|
endif ()
|
||||||
|
if (ARG_STATIC)
|
||||||
|
list(APPEND extra_args STATIC)
|
||||||
|
endif ()
|
||||||
|
if (ARG_OBJECT)
|
||||||
|
list(APPEND extra_args OBJECT)
|
||||||
|
endif ()
|
||||||
|
if (ARG_EXCLUDE_FROM_ALL)
|
||||||
|
list(APPEND extra_args EXCLUDE_FROM_ALL)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Also add header files to IDEs to list as part of the library.
|
||||||
|
set_source_files_properties(${ARG_ADDITIONAL_HEADERS} PROPERTIES HEADER_FILE_ONLY ON)
|
||||||
|
|
||||||
|
add_library(${name} ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
|
||||||
|
|
||||||
|
if (ARG_INSTALL_WITH_TOOLCHAIN)
|
||||||
|
set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Toolchain Libraries")
|
||||||
|
elseif (ARG_OBJECT)
|
||||||
|
set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Object Libraries")
|
||||||
|
else ()
|
||||||
|
set_target_properties(${name} PROPERTIES FOLDER "Flang-RT/Libraries")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Minimum required C++ version for Flang-RT, even if CMAKE_CXX_STANDARD is defined to something else.
|
||||||
|
target_compile_features(${name} PRIVATE cxx_std_17)
|
||||||
|
|
||||||
|
# Use compiler-specific options to disable exceptions and RTTI.
|
||||||
|
if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
|
||||||
|
target_compile_options(${name} PRIVATE
|
||||||
|
$<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>
|
||||||
|
)
|
||||||
|
elseif (MSVC)
|
||||||
|
target_compile_options(${name} PRIVATE
|
||||||
|
$<$<COMPILE_LANGUAGE:CXX>:/EHs-c- /GR->
|
||||||
|
)
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
|
||||||
|
target_compile_options(${name} PRIVATE
|
||||||
|
$<$<COMPILE_LANGUAGE:CXX>:-qnoeh -qnortti>
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Also for CUDA source when compiling with FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA
|
||||||
|
if (CMAKE_CUDA_COMPILER_ID MATCHES "NVIDIA")
|
||||||
|
# Assuming gcc as host compiler.
|
||||||
|
target_compile_options(${name} PRIVATE
|
||||||
|
$<$<COMPILE_LANGUAGE:CUDA>:--no-exceptions -Xcompiler -fno-rtti -Xcompiler -fno-unwind-tables -Xcompiler -fno-asynchronous-unwind-tables>
|
||||||
|
)
|
||||||
|
else ()
|
||||||
|
# Assuming a clang-compatible CUDA compiler.
|
||||||
|
target_compile_options(${name} PRIVATE
|
||||||
|
$<$<COMPILE_LANGUAGE:CUDA>:-fno-exceptions -fno-rtti -fno-unwind-tables -fno-asynchronous-unwind-tables>
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Flang-RT's public headers
|
||||||
|
target_include_directories(${name} PUBLIC "${FLANG_RT_SOURCE_DIR}/include")
|
||||||
|
|
||||||
|
# For ISO_Fortran_binding.h to be found by the runtime itself (Accessed as #include "flang/ISO_Fortran_binding.h")
|
||||||
|
# User applications can use #include <ISO_Fortran_binding.h>
|
||||||
|
target_include_directories(${name} PUBLIC "${FLANG_SOURCE_DIR}/include")
|
||||||
|
|
||||||
|
# For Flang-RT's configured config.h to be found
|
||||||
|
target_include_directories(${name} PRIVATE "${FLANG_RT_BINARY_DIR}")
|
||||||
|
|
||||||
|
# Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS
|
||||||
|
# build, to avoid an unwanted dependency on libstdc++/libc++.so.
|
||||||
|
if (FLANG_RT_SUPPORTS_UNDEFINE_FLAG)
|
||||||
|
target_compile_options(${name} PUBLIC -U_GLIBCXX_ASSERTIONS)
|
||||||
|
target_compile_options(${name} PUBLIC -U_LIBCPP_ENABLE_ASSERTIONS)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# When building the flang runtime if LTO is enabled the archive file
|
||||||
|
# contains LLVM IR rather than object code. Currently flang is not
|
||||||
|
# LTO aware so cannot link this file to compiled Fortran code.
|
||||||
|
if (FLANG_RT_HAS_FNO_LTO_FLAG)
|
||||||
|
target_compile_options(${name} PRIVATE -fno-lto)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Flang/Clang (including clang-cl) -compiled programs targeting the MSVC ABI
|
||||||
|
# should only depend on msvcrt/ucrt. LLVM still emits libgcc/compiler-rt
|
||||||
|
# functions in some cases like 128-bit integer math (__udivti3, __modti3,
|
||||||
|
# __fixsfti, __floattidf, ...) that msvc does not support. We are injecting a
|
||||||
|
# dependency to Compiler-RT's builtin library where these are implemented.
|
||||||
|
if (MSVC AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
if (FLANG_RT_BUILTINS_LIBRARY)
|
||||||
|
target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:CXX,C>:-Xclang>" "$<$<COMPILE_LANGUAGE:CXX,C>:--dependent-lib=${FLANG_RT_BUILTINS_LIBRARY}>")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
if (MSVC AND CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
|
||||||
|
if (FLANG_RT_BUILTINS_LIBRARY)
|
||||||
|
target_compile_options(${name} PRIVATE "$<$<COMPILE_LANGUAGE:Fortran>:-Xflang>" "$<$<COMPILE_LANGUAGE:Fortran>:--dependent-lib=${FLANG_RT_BUILTINS_LIBRARY}>")
|
||||||
|
else ()
|
||||||
|
message(WARNING "Did not find libclang_rt.builtins.lib.
|
||||||
|
LLVM may emit builtins that are not implemented in msvcrt/ucrt and
|
||||||
|
instead falls back to builtins from Compiler-RT. Linking with ${name}
|
||||||
|
may result in a linker error.")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Non-GTest unittests depend on LLVMSupport
|
||||||
|
if (ARG_LINK_TO_LLVM)
|
||||||
|
if (LLVM_LINK_LLVM_DYLIB)
|
||||||
|
set(llvm_libs LLVM)
|
||||||
|
else()
|
||||||
|
llvm_map_components_to_libnames(llvm_libs Support)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(${name} PUBLIC ${llvm_libs})
|
||||||
|
target_include_directories(${name} PUBLIC ${LLVM_INCLUDE_DIRS})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (ARG_INCLUDE_DIRECTORIES)
|
||||||
|
target_include_directories(${name} ${ARG_INCLUDE_DIRECTORIES})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (ARG_LINK_LIBRARIES)
|
||||||
|
target_link_libraries(${name} PUBLIC ${ARG_LINK_LIBRARIES})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# If this is part of the toolchain, put it into the compiler's resource
|
||||||
|
# directory. Otherwise it is part of testing and is not installed at all.
|
||||||
|
# TODO: Consider multi-configuration builds (MSVC_IDE, "Ninja Multi-Config")
|
||||||
|
if (ARG_INSTALL_WITH_TOOLCHAIN)
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
ARCHIVE_OUTPUT_DIRECTORY "${FLANG_RT_OUTPUT_RESOURCE_LIB_DIR}"
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS ${name}
|
||||||
|
ARCHIVE DESTINATION "${FLANG_RT_INSTALL_RESOURCE_LIB_PATH}"
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (ARG_TARGET_PROPERTIES)
|
||||||
|
set_target_properties(${name} PROPERTIES ${ARG_TARGET_PROPERTIES})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# flang-rt should build all the Flang-RT targets that are built in an
|
||||||
|
# 'all' build.
|
||||||
|
if (NOT ARG_EXCLUDE_FROM_ALL)
|
||||||
|
add_dependencies(flang-rt ${name})
|
||||||
|
endif ()
|
||||||
|
endfunction (add_flangrt_library)
|
100
flang-rt/cmake/modules/AddFlangRTOffload.cmake
Normal file
100
flang-rt/cmake/modules/AddFlangRTOffload.cmake
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
#===-- cmake/modules/AddFlangRTOffload.cmake -------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
macro(enable_cuda_compilation name files)
|
||||||
|
if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
|
||||||
|
enable_language(CUDA)
|
||||||
|
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
CUDA_SEPARABLE_COMPILATION ON
|
||||||
|
)
|
||||||
|
|
||||||
|
# Treat all supported sources as CUDA files.
|
||||||
|
set_source_files_properties(${files} PROPERTIES LANGUAGE CUDA)
|
||||||
|
set(CUDA_COMPILE_OPTIONS)
|
||||||
|
if ("${CMAKE_CUDA_COMPILER_ID}" MATCHES "Clang")
|
||||||
|
# Allow varargs.
|
||||||
|
set(CUDA_COMPILE_OPTIONS
|
||||||
|
-Xclang -fcuda-allow-variadic-functions
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if ("${CMAKE_CUDA_COMPILER_ID}" MATCHES "NVIDIA")
|
||||||
|
set(CUDA_COMPILE_OPTIONS
|
||||||
|
--expt-relaxed-constexpr
|
||||||
|
# Disable these warnings:
|
||||||
|
# 'long double' is treated as 'double' in device code
|
||||||
|
-Xcudafe --diag_suppress=20208
|
||||||
|
-Xcudafe --display_error_number
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
set_source_files_properties(${files} PROPERTIES COMPILE_OPTIONS
|
||||||
|
"${CUDA_COMPILE_OPTIONS}")
|
||||||
|
|
||||||
|
# Create a .a library consisting of CUDA PTX.
|
||||||
|
# This is different from a regular static library. The CUDA_PTX_COMPILATION
|
||||||
|
# property can only be applied to object libraries and create *.ptx files
|
||||||
|
# instead of *.o files. The .a will consist of those *.ptx files only.
|
||||||
|
add_flangrt_library(obj.${name}PTX OBJECT ${files})
|
||||||
|
set_property(TARGET obj.${name}PTX PROPERTY CUDA_PTX_COMPILATION ON)
|
||||||
|
add_flangrt_library(${name}PTX STATIC "$<TARGET_OBJECTS:obj.${name}PTX>")
|
||||||
|
|
||||||
|
# Apply configuration options
|
||||||
|
if (FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS)
|
||||||
|
target_compile_definitions(obj.${name}PTX
|
||||||
|
PRIVATE FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# When using libcudacxx headers files, we have to use them
|
||||||
|
# for all files of Flang-RT.
|
||||||
|
if (EXISTS "${FLANG_RT_LIBCUDACXX_PATH}/include")
|
||||||
|
foreach (tgt IN ITEMS "${name}" "obj.${name}PTX")
|
||||||
|
target_include_directories(${tgt} AFTER PRIVATE "${FLANG_RT_LIBCUDACXX_PATH}/include")
|
||||||
|
target_compile_definitions(${tgt} PRIVATE RT_USE_LIBCUDACXX=1)
|
||||||
|
endforeach ()
|
||||||
|
endif ()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
macro(enable_omp_offload_compilation name files)
|
||||||
|
if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
|
||||||
|
# OpenMP offload build only works with Clang compiler currently.
|
||||||
|
|
||||||
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
|
||||||
|
"${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
|
||||||
|
|
||||||
|
string(REPLACE ";" "," compile_for_architectures
|
||||||
|
"${FLANG_RT_DEVICE_ARCHITECTURES}"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(OMP_COMPILE_OPTIONS
|
||||||
|
-fopenmp
|
||||||
|
-fvisibility=hidden
|
||||||
|
-fopenmp-cuda-mode
|
||||||
|
--offload-arch=${compile_for_architectures}
|
||||||
|
# Force LTO for the device part.
|
||||||
|
-foffload-lto
|
||||||
|
)
|
||||||
|
set_source_files_properties(${files} PROPERTIES COMPILE_OPTIONS
|
||||||
|
"${OMP_COMPILE_OPTIONS}"
|
||||||
|
)
|
||||||
|
target_link_options(${name} PUBLIC ${OMP_COMPILE_OPTIONS})
|
||||||
|
|
||||||
|
# Enable "declare target" in the source code.
|
||||||
|
set_source_files_properties(${files}
|
||||||
|
PROPERTIES COMPILE_DEFINITIONS OMP_OFFLOAD_BUILD
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Flang-rt build with OpenMP offload is not supported for these compilers:\n"
|
||||||
|
"CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}\n"
|
||||||
|
"CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
125
flang-rt/cmake/modules/GetToolchainDirs.cmake
Normal file
125
flang-rt/cmake/modules/GetToolchainDirs.cmake
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
#===-- cmake/modules/GetToolchainDirs.cmake --------------------------------===#
|
||||||
|
#
|
||||||
|
# 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 subdirectory relative to Clang's resource dir/sysroot where to
|
||||||
|
# install target-specific libraries, to be found by Clang/Flang driver. This was
|
||||||
|
# adapted from Compiler-RT's mechanism to find the path for
|
||||||
|
# libclang_rt.builtins.a.
|
||||||
|
#
|
||||||
|
# Compiler-RT has two mechanisms for the path (simplified):
|
||||||
|
#
|
||||||
|
# * LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=1: lib/${oslibname}/libclang_rt.builtins-${arch}.a
|
||||||
|
# * LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=0: lib/${triple}/libclang_rt.builtins.a
|
||||||
|
#
|
||||||
|
# LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON is the newer scheme, but the old one is
|
||||||
|
# currently still used for some platforms such as Windows. Clang looks for which
|
||||||
|
# of the files exist before passing the path to the linker. Hence, the
|
||||||
|
# directories have to match what Clang is looking for, which is done in
|
||||||
|
# ToolChain::getArchSpecificLibPaths(..), ToolChain::getRuntimePath(),
|
||||||
|
# ToolChain::getCompilerRTPath(), and ToolChain::getCompilerRT(..), not entirely
|
||||||
|
# consistent between these functions, Compiler-RT's CMake code, and overrides
|
||||||
|
# in different toolchains.
|
||||||
|
#
|
||||||
|
# For Fortran, Flang always assumes the library name libflang_rt.a without
|
||||||
|
# architecture suffix. Hence, we always use the second scheme even as if
|
||||||
|
# LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON, even if it actually set to OFF. It as
|
||||||
|
# added unconditionally to the library search path by
|
||||||
|
# ToolChain::getArchSpecificLibPaths(...).
|
||||||
|
function (get_toolchain_library_subdir outvar)
|
||||||
|
if (NOT APPLE)
|
||||||
|
set(outval "lib")
|
||||||
|
else ()
|
||||||
|
# Required to be "darwin" for MachO toolchain.
|
||||||
|
get_toolchain_os_dirname(os_dirname)
|
||||||
|
set(outval "lib/${os_dirname}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
get_toolchain_arch_dirname(arch_dirname)
|
||||||
|
set(outval "lib/${arch_dirname}")
|
||||||
|
|
||||||
|
set(${outvar} "${outval}" PARENT_SCOPE)
|
||||||
|
endfunction ()
|
||||||
|
|
||||||
|
|
||||||
|
# Corresponds to Clang's ToolChain::getOSLibName(). Adapted from Compiler-RT.
|
||||||
|
function (get_toolchain_os_dirname outvar)
|
||||||
|
if (ANDROID)
|
||||||
|
# The CMAKE_SYSTEM_NAME for Android is "Android", but the OS is Linux and the
|
||||||
|
# driver will search for libraries in the "linux" directory.
|
||||||
|
set(outval "linux")
|
||||||
|
else ()
|
||||||
|
string(TOLOWER "${CMAKE_SYSTEM_NAME}" outval)
|
||||||
|
endif ()
|
||||||
|
set(${outvar} "${outval}" PARENT_SCOPE)
|
||||||
|
endfunction ()
|
||||||
|
|
||||||
|
|
||||||
|
# Corresponds to Clang's ToolChain::getRuntimePath(). Adapted from Compiler-RT.
|
||||||
|
function (get_toolchain_arch_dirname outvar)
|
||||||
|
string(REPLACE "-" ";" triple_list ${LLVM_TARGET_TRIPLE})
|
||||||
|
list(GET triple_list 0 arch)
|
||||||
|
|
||||||
|
if("${arch}" MATCHES "^i.86$")
|
||||||
|
# Android uses i686, but that's remapped at a later stage.
|
||||||
|
set(arch "i386")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(FIND ${LLVM_TARGET_TRIPLE} "-" dash_index)
|
||||||
|
string(SUBSTRING ${LLVM_TARGET_TRIPLE} ${dash_index} -1 triple_suffix)
|
||||||
|
string(SUBSTRING ${LLVM_TARGET_TRIPLE} 0 ${dash_index} triple_cpu)
|
||||||
|
set(arch "${triple_cpu}")
|
||||||
|
if("${arch}" MATCHES "^i.86$")
|
||||||
|
# Android uses i686, but that's remapped at a later stage.
|
||||||
|
set(arch "i386")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(ANDROID AND ${arch} STREQUAL "i386")
|
||||||
|
set(target "i686${triple_suffix}")
|
||||||
|
elseif(${arch} STREQUAL "amd64")
|
||||||
|
set(target "x86_64${triple_suffix}")
|
||||||
|
elseif(${arch} STREQUAL "sparc64")
|
||||||
|
set(target "sparcv9${triple_suffix}")
|
||||||
|
elseif("${arch}" MATCHES "mips64|mips64el")
|
||||||
|
string(REGEX REPLACE "-gnu.*" "-gnuabi64" triple_suffix_gnu "${triple_suffix}")
|
||||||
|
string(REGEX REPLACE "mipsisa32" "mipsisa64" triple_cpu_mips "${triple_cpu}")
|
||||||
|
string(REGEX REPLACE "^mips$" "mips64" triple_cpu_mips "${triple_cpu_mips}")
|
||||||
|
string(REGEX REPLACE "^mipsel$" "mips64el" triple_cpu_mips "${triple_cpu_mips}")
|
||||||
|
set(target "${triple_cpu_mips}${triple_suffix_gnu}")
|
||||||
|
elseif("${arch}" MATCHES "mips|mipsel")
|
||||||
|
string(REGEX REPLACE "-gnuabi.*" "-gnu" triple_suffix_gnu "${triple_suffix}")
|
||||||
|
string(REGEX REPLACE "mipsisa64" "mipsisa32" triple_cpu_mips "${triple_cpu}")
|
||||||
|
string(REGEX REPLACE "mips64" "mips" triple_cpu_mips "${triple_cpu_mips}")
|
||||||
|
set(target "${triple_cpu_mips}${triple_suffix_gnu}")
|
||||||
|
elseif("${arch}" MATCHES "^arm")
|
||||||
|
# FIXME: Handle arch other than arm, armhf, armv6m
|
||||||
|
if (${arch} STREQUAL "armhf")
|
||||||
|
# If we are building for hard float but our ABI is soft float.
|
||||||
|
if ("${triple_suffix}" MATCHES ".*eabi$")
|
||||||
|
# Change "eabi" -> "eabihf"
|
||||||
|
set(triple_suffix "${triple_suffix}hf")
|
||||||
|
endif()
|
||||||
|
# ABI is already set in the triple, don't repeat it in the architecture.
|
||||||
|
set(arch "arm")
|
||||||
|
else ()
|
||||||
|
# If we are building for soft float, but the triple's ABI is hard float.
|
||||||
|
if ("${triple_suffix}" MATCHES ".*eabihf$")
|
||||||
|
# Change "eabihf" -> "eabi"
|
||||||
|
string(REGEX REPLACE "hf$" "" triple_suffix "${triple_suffix}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
set(target "${arch}${triple_suffix}")
|
||||||
|
elseif("${arch}" MATCHES "^amdgcn")
|
||||||
|
set(target "amdgcn-amd-amdhsa")
|
||||||
|
elseif("${arch}" MATCHES "^nvptx")
|
||||||
|
set(target "nvptx64-nvidia-cuda")
|
||||||
|
else()
|
||||||
|
set(target "${arch}${triple_suffix}")
|
||||||
|
endif()
|
||||||
|
set(${outvar} "${target}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
9
flang-rt/examples/CMakeLists.txt
Normal file
9
flang-rt/examples/CMakeLists.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#===-- examples/CMakeLists.txt ---------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
add_subdirectory(ExternalHelloWorld)
|
17
flang-rt/examples/ExternalHelloWorld/CMakeLists.txt
Normal file
17
flang-rt/examples/ExternalHelloWorld/CMakeLists.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#===-- examples/ExternalHelloWorld/CMakeLists.txt --------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
# This test is not run by default as it requires input.
|
||||||
|
add_llvm_example(external-hello-world
|
||||||
|
external-hello.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(external-hello-world
|
||||||
|
PRIVATE
|
||||||
|
flang_rt.runtime
|
||||||
|
)
|
17
flang-rt/lib/CMakeLists.txt
Normal file
17
flang-rt/lib/CMakeLists.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#===-- lib/CMakeLists.txt --------------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
add_subdirectory(quadmath)
|
||||||
|
add_subdirectory(runtime)
|
||||||
|
if (FLANG_RT_INCLUDE_CUF)
|
||||||
|
add_subdirectory(cuda)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (FLANG_RT_INCLUDE_TESTS)
|
||||||
|
add_subdirectory(Testing)
|
||||||
|
endif ()
|
20
flang-rt/lib/Testing/CMakeLists.txt
Normal file
20
flang-rt/lib/Testing/CMakeLists.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#===-- lib/Testing/CMakeLists.txt ------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
set(public_headers "")
|
||||||
|
file(GLOB_RECURSE public_headers
|
||||||
|
"${FLANG_SOURCE_DIR}/lib/Testing/*.h"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_flangrt_library(NonGTestTesting EXCLUDE_FROM_ALL LINK_TO_LLVM
|
||||||
|
${FLANG_SOURCE_DIR}/lib/Testing/testing.cpp
|
||||||
|
${FLANG_SOURCE_DIR}/lib/Testing/fp-testing.cpp
|
||||||
|
|
||||||
|
ADDITIONAL_HEADERS
|
||||||
|
${public_headers}
|
||||||
|
)
|
34
flang-rt/lib/cuda/CMakeLists.txt
Normal file
34
flang-rt/lib/cuda/CMakeLists.txt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#===-- lib/cuda/CMakeLists.txt ---------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
|
||||||
|
add_flangrt_library(flang_rt.cuda STATIC
|
||||||
|
allocatable.cpp
|
||||||
|
allocator.cpp
|
||||||
|
descriptor.cpp
|
||||||
|
init.cpp
|
||||||
|
kernel.cpp
|
||||||
|
memmove-function.cpp
|
||||||
|
memory.cpp
|
||||||
|
registration.cpp
|
||||||
|
|
||||||
|
# libflang_rt.runtime depends on a certain version of CUDA. To be able to have
|
||||||
|
# multiple build of this library with different CUDA version, the version is
|
||||||
|
# added to the library name.
|
||||||
|
TARGET_PROPERTIES
|
||||||
|
OUTPUT_NAME "flang_rt.cuda_${CUDAToolkit_VERSION_MAJOR}"
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES
|
||||||
|
PRIVATE ${CUDAToolkit_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(flang_rt.cuda
|
||||||
|
PUBLIC
|
||||||
|
flang_rt.runtime
|
||||||
|
CUDA::cudart_static
|
||||||
|
)
|
136
flang-rt/lib/quadmath/CMakeLists.txt
Normal file
136
flang-rt/lib/quadmath/CMakeLists.txt
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
#===-- lib/quadmath/CMakeLists.txt -----------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
# FortranFloat128 implements IEEE-754 128-bit float math functions.
|
||||||
|
# It is a thin wapper and it currently relies on third-party
|
||||||
|
# libraries available for the target.
|
||||||
|
# It is distributed as a static library only.
|
||||||
|
# Fortran programs/libraries that end up linking any of the provided
|
||||||
|
# will have a dependency on the third-party library that is being
|
||||||
|
# used for building this libflang_rt.quadmath library.
|
||||||
|
|
||||||
|
include(CheckLibraryExists)
|
||||||
|
include(CheckIncludeFile)
|
||||||
|
|
||||||
|
set(sources
|
||||||
|
acos.cpp
|
||||||
|
acosh.cpp
|
||||||
|
asin.cpp
|
||||||
|
asinh.cpp
|
||||||
|
atan.cpp
|
||||||
|
atan2.cpp
|
||||||
|
atanh.cpp
|
||||||
|
ceil.cpp
|
||||||
|
complex-math.c
|
||||||
|
cos.cpp
|
||||||
|
cosh.cpp
|
||||||
|
erf.cpp
|
||||||
|
erfc.cpp
|
||||||
|
exp.cpp
|
||||||
|
exponent.cpp
|
||||||
|
floor.cpp
|
||||||
|
fma.cpp
|
||||||
|
fraction.cpp
|
||||||
|
hypot.cpp
|
||||||
|
j0.cpp
|
||||||
|
j1.cpp
|
||||||
|
jn.cpp
|
||||||
|
lgamma.cpp
|
||||||
|
llround.cpp
|
||||||
|
log.cpp
|
||||||
|
log10.cpp
|
||||||
|
lround.cpp
|
||||||
|
mod-real.cpp
|
||||||
|
modulo-real.cpp
|
||||||
|
nearest.cpp
|
||||||
|
nearbyint.cpp
|
||||||
|
norm2.cpp
|
||||||
|
pow.cpp
|
||||||
|
random.cpp
|
||||||
|
remainder.cpp
|
||||||
|
round.cpp
|
||||||
|
rrspacing.cpp
|
||||||
|
scale.cpp
|
||||||
|
set-exponent.cpp
|
||||||
|
sin.cpp
|
||||||
|
sinh.cpp
|
||||||
|
spacing.cpp
|
||||||
|
sqrt.cpp
|
||||||
|
tan.cpp
|
||||||
|
tanh.cpp
|
||||||
|
tgamma.cpp
|
||||||
|
trunc.cpp
|
||||||
|
y0.cpp
|
||||||
|
y1.cpp
|
||||||
|
yn.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(AFTER "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
||||||
|
add_library(FortranFloat128MathILib INTERFACE)
|
||||||
|
target_include_directories(FortranFloat128MathILib INTERFACE
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
|
||||||
|
)
|
||||||
|
|
||||||
|
if (FLANG_RUNTIME_F128_MATH_LIB)
|
||||||
|
if (${FLANG_RUNTIME_F128_MATH_LIB} STREQUAL "libquadmath")
|
||||||
|
check_include_file(quadmath.h FOUND_QUADMATH_HEADER)
|
||||||
|
if(FOUND_QUADMATH_HEADER)
|
||||||
|
add_compile_definitions(HAS_QUADMATHLIB)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"FLANG_RUNTIME_F128_MATH_LIB setting requires quadmath.h "
|
||||||
|
"to be available: ${FLANG_RUNTIME_F128_MATH_LIB}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Unsupported third-party library for Fortran F128 math runtime: "
|
||||||
|
"${FLANG_RUNTIME_F128_MATH_LIB}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
# Do not create a flang_rt.quadmath library under Windows, the Flang
|
||||||
|
# driver never links it. Instead, add the sources to flang_rt.runtime.
|
||||||
|
target_sources(FortranFloat128MathILib INTERFACE ${sources})
|
||||||
|
target_compile_definitions(FortranFloat128MathILib INTERFACE HAS_QUADMATHLIB)
|
||||||
|
else ()
|
||||||
|
add_flangrt_library(flang_rt.quadmath STATIC INSTALL_WITH_TOOLCHAIN
|
||||||
|
${sources})
|
||||||
|
target_include_directories(flang_rt.quadmath PRIVATE
|
||||||
|
"${FLANG_RT_SOURCE_DIR}/lib/flang_rt"
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
elseif (HAVE_LDBL_MANT_DIG_113)
|
||||||
|
# We can use 'long double' versions from libc.
|
||||||
|
check_library_exists(m sinl "" FOUND_LIBM)
|
||||||
|
if (FOUND_LIBM)
|
||||||
|
target_compile_definitions(FortranFloat128MathILib INTERFACE
|
||||||
|
HAS_LIBM
|
||||||
|
)
|
||||||
|
target_include_directories(FortranFloat128MathILib INTERFACE
|
||||||
|
"${FLANG_RT_SOURCE_DIR}/lib/flang_rt"
|
||||||
|
)
|
||||||
|
target_sources(FortranFloat128MathILib INTERFACE ${sources})
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Flang-RT cannot build without libm")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
# We can use '__float128' version from libc, if it has them.
|
||||||
|
check_library_exists(m sinf128 "" FOUND_LIBMF128)
|
||||||
|
if (FOUND_LIBMF128)
|
||||||
|
target_compile_definitions(FortranFloat128MathILib INTERFACE
|
||||||
|
HAS_LIBMF128
|
||||||
|
)
|
||||||
|
target_include_directories(FortranFloat128MathILib INTERFACE
|
||||||
|
"${FLANG_RT_SOURCE_DIR}/lib/flang_rt"
|
||||||
|
)
|
||||||
|
# Enable this, when math-entries.h and complex-math.h is ready.
|
||||||
|
# target_sources(FortranFloat128MathILib INTERFACE ${sources})
|
||||||
|
endif()
|
||||||
|
endif()
|
215
flang-rt/lib/runtime/CMakeLists.txt
Normal file
215
flang-rt/lib/runtime/CMakeLists.txt
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
#===-- lib/runtime/CMakeLists.txt ------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
include(AddFlangRTOffload)
|
||||||
|
# function checks
|
||||||
|
find_package(Backtrace)
|
||||||
|
set(HAVE_BACKTRACE ${Backtrace_FOUND})
|
||||||
|
set(BACKTRACE_HEADER ${Backtrace_HEADER})
|
||||||
|
|
||||||
|
|
||||||
|
# List of files that are buildable for all devices.
|
||||||
|
set(supported_sources
|
||||||
|
${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp
|
||||||
|
${FLANG_SOURCE_DIR}/lib/Decimal/decimal-to-binary.cpp
|
||||||
|
ISO_Fortran_binding.cpp
|
||||||
|
allocator-registry.cpp
|
||||||
|
allocatable.cpp
|
||||||
|
array-constructor.cpp
|
||||||
|
assign.cpp
|
||||||
|
buffer.cpp
|
||||||
|
character.cpp
|
||||||
|
connection.cpp
|
||||||
|
copy.cpp
|
||||||
|
derived-api.cpp
|
||||||
|
derived.cpp
|
||||||
|
descriptor-io.cpp
|
||||||
|
descriptor.cpp
|
||||||
|
dot-product.cpp
|
||||||
|
edit-input.cpp
|
||||||
|
edit-output.cpp
|
||||||
|
environment.cpp
|
||||||
|
external-unit.cpp
|
||||||
|
extrema.cpp
|
||||||
|
file.cpp
|
||||||
|
findloc.cpp
|
||||||
|
format.cpp
|
||||||
|
inquiry.cpp
|
||||||
|
internal-unit.cpp
|
||||||
|
io-api.cpp
|
||||||
|
io-api-minimal.cpp
|
||||||
|
io-error.cpp
|
||||||
|
io-stmt.cpp
|
||||||
|
iostat.cpp
|
||||||
|
matmul-transpose.cpp
|
||||||
|
matmul.cpp
|
||||||
|
memory.cpp
|
||||||
|
misc-intrinsic.cpp
|
||||||
|
namelist.cpp
|
||||||
|
non-tbp-dio.cpp
|
||||||
|
numeric.cpp
|
||||||
|
pointer.cpp
|
||||||
|
product.cpp
|
||||||
|
pseudo-unit.cpp
|
||||||
|
ragged.cpp
|
||||||
|
stat.cpp
|
||||||
|
sum.cpp
|
||||||
|
support.cpp
|
||||||
|
terminator.cpp
|
||||||
|
tools.cpp
|
||||||
|
transformational.cpp
|
||||||
|
type-code.cpp
|
||||||
|
type-info.cpp
|
||||||
|
unit.cpp
|
||||||
|
unit-map.cpp
|
||||||
|
utf.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
# List of source not used for GPU offloading.
|
||||||
|
set(host_sources
|
||||||
|
${FLANG_SOURCE_DIR}/module/iso_fortran_env_impl.f90
|
||||||
|
command.cpp
|
||||||
|
complex-powi.cpp
|
||||||
|
complex-reduction.c
|
||||||
|
exceptions.cpp
|
||||||
|
execute.cpp
|
||||||
|
extensions.cpp
|
||||||
|
main.cpp
|
||||||
|
random.cpp
|
||||||
|
reduce.cpp
|
||||||
|
reduction.cpp
|
||||||
|
stop.cpp
|
||||||
|
temporary-stack.cpp
|
||||||
|
time-intrinsic.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE public_headers
|
||||||
|
"${FLANG_RT_SOURCE_DIR}/include/flang_rt/*.h"
|
||||||
|
"${FLANG_SOURCE_DIR}/include/flang/Common/*.h"
|
||||||
|
)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE private_headers
|
||||||
|
"${FLANG_RT_SOURCE_DIR}/lib/flang_rt/*.h"
|
||||||
|
"${FLANG_SOURCE_DIR}/lib/Common/*.h"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Import changes from flang_rt.quadmath
|
||||||
|
get_target_property(f128_sources
|
||||||
|
FortranFloat128MathILib INTERFACE_SOURCES
|
||||||
|
)
|
||||||
|
if (f128_sources)
|
||||||
|
# The interface may define special macros for Float128Math files,
|
||||||
|
# so we need to propagate them.
|
||||||
|
get_target_property(f128_defs
|
||||||
|
FortranFloat128MathILib INTERFACE_COMPILE_DEFINITIONS
|
||||||
|
)
|
||||||
|
set_property(SOURCE ${f128_sources}
|
||||||
|
APPEND PROPERTY COMPILE_DEFINITIONS
|
||||||
|
${f128_defs}
|
||||||
|
)
|
||||||
|
get_target_property(f128_include_dirs
|
||||||
|
FortranFloat128MathILib INTERFACE_INCLUDE_DIRECTORIES
|
||||||
|
)
|
||||||
|
set_property(SOURCE ${f128_sources}
|
||||||
|
APPEND PROPERTY INCLUDE_DIRECTORIES
|
||||||
|
${f128_include_dirs}
|
||||||
|
)
|
||||||
|
else ()
|
||||||
|
set(f128_sources "")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set(sources ${supported_sources} ${host_sources} ${f128_sources})
|
||||||
|
|
||||||
|
|
||||||
|
if (NOT WIN32)
|
||||||
|
add_flangrt_library(flang_rt.runtime STATIC
|
||||||
|
${sources}
|
||||||
|
LINK_LIBRARIES ${Backtrace_LIBRARY}
|
||||||
|
INSTALL_WITH_TOOLCHAIN
|
||||||
|
ADDITIONAL_HEADERS ${public_headers} ${private_headers}
|
||||||
|
)
|
||||||
|
|
||||||
|
enable_cuda_compilation(flang_rt.runtime "${supported_sources}")
|
||||||
|
enable_omp_offload_compilation(flang_rt.runtime "${supported_sources}")
|
||||||
|
|
||||||
|
# For unittests that depend on flang_rt. Should link to the static version
|
||||||
|
# of the library.
|
||||||
|
add_library(flang_rt.runtime.static ALIAS flang_rt.runtime)
|
||||||
|
add_library(flang_rt.runtime.unittest ALIAS flang_rt.runtime)
|
||||||
|
else()
|
||||||
|
# Target for building all versions of the runtime
|
||||||
|
add_custom_target(flang_rt.runtime)
|
||||||
|
set_target_properties(flang_rt.runtime PROPERTIES FOLDER "Flang-RT/Meta")
|
||||||
|
|
||||||
|
function (add_win_flangrt_runtime libtype suffix msvc_lib)
|
||||||
|
set(name "flang_rt.runtime.${suffix}")
|
||||||
|
add_flangrt_library(${name} ${libtype}
|
||||||
|
${sources}
|
||||||
|
${ARGN}
|
||||||
|
LINK_LIBRARIES ${Backtrace_LIBRARY}
|
||||||
|
ADDITIONAL_HEADERS ${public_headers} ${private_headers}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (msvc_lib)
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
MSVC_RUNTIME_LIBRARY "${msvc_lib}"
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Setting an unique Fortran_MODULE_DIRECTORY is required for each variant to
|
||||||
|
# write a different .mod file.
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
Fortran_MODULE_DIRECTORY "module.${suffix}"
|
||||||
|
)
|
||||||
|
|
||||||
|
enable_cuda_compilation(${name} "${supported_sources}")
|
||||||
|
enable_omp_offload_compilation(${name} "${supported_sources}")
|
||||||
|
add_dependencies(flang_rt.runtime ${name})
|
||||||
|
endfunction ()
|
||||||
|
|
||||||
|
# Variants of the static flang_rt for different versions of the msvc runtime.
|
||||||
|
#
|
||||||
|
# The dynamic/dynamic_dbg variants are not DLLs themselves, only require
|
||||||
|
# linking to msvcrt(d).dll.
|
||||||
|
# FIXME: Generating actual runtime DLLs is currently not possible. There are
|
||||||
|
# two roadblocks:
|
||||||
|
#
|
||||||
|
# * Flang emits /DEFAULTLIB:flang_rt.dynamic.lib into
|
||||||
|
# iso_fortran_env_impl.f90.obj. Because that file is itself part of
|
||||||
|
# flang_rt.dynamic, this results in a recursive dependency when invoking
|
||||||
|
# the linker.
|
||||||
|
#
|
||||||
|
# * The externally-visible functions must either be annotated with
|
||||||
|
# __declspec(dllexport), or listed in an exports file. A possible workaround
|
||||||
|
# is CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS which would also export the internal
|
||||||
|
# C++ symbols and still requires global data symbols to be annotated
|
||||||
|
# manually.
|
||||||
|
add_win_flangrt_runtime(STATIC static MultiThreaded INSTALL_WITH_TOOLCHAIN)
|
||||||
|
add_win_flangrt_runtime(STATIC static_dbg MultiThreadedDebug INSTALL_WITH_TOOLCHAIN)
|
||||||
|
add_win_flangrt_runtime(STATIC dynamic MultiThreadedDLL INSTALL_WITH_TOOLCHAIN)
|
||||||
|
add_win_flangrt_runtime(STATIC dynamic_dbg MultiThreadedDebugDLL INSTALL_WITH_TOOLCHAIN)
|
||||||
|
|
||||||
|
# Unittests link against LLVMSupport which is using CMake's default runtime
|
||||||
|
# library selection, which is either MultiThreadedDLL or MultiThreadedDebugDLL
|
||||||
|
# depending on the configuration. They have to match or linking will fail.
|
||||||
|
if (GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
# We cannot select an ALIAS library because it may be different
|
||||||
|
# per configuration. Fallback to CMake's default.
|
||||||
|
add_win_flangrt_runtime(STATIC unittest "" EXCLUDE_FROM_ALL)
|
||||||
|
else ()
|
||||||
|
string(TOLOWER ${CMAKE_BUILD_TYPE} build_type)
|
||||||
|
if (build_type STREQUAL "debug")
|
||||||
|
add_library(flang_rt.runtime.unittest ALIAS flang_rt.runtime.dynamic_dbg)
|
||||||
|
else ()
|
||||||
|
add_library(flang_rt.runtime.unittest ALIAS flang_rt.runtime.dynamic)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
endif()
|
59
flang-rt/test/CMakeLists.txt
Normal file
59
flang-rt/test/CMakeLists.txt
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#===-- test/CMakeLists.txt -------------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
# Test runner infrastructure for Flang. This configures the Flang test trees
|
||||||
|
# for use by Lit, and delegates to LLVM's lit test handlers.
|
||||||
|
|
||||||
|
llvm_canonicalize_cmake_booleans(
|
||||||
|
FLANG_STANDALONE_BUILD
|
||||||
|
LLVM_BUILD_EXAMPLES
|
||||||
|
LLVM_BYE_LINK_INTO_TOOLS
|
||||||
|
LLVM_ENABLE_PLUGINS
|
||||||
|
)
|
||||||
|
|
||||||
|
configure_lit_site_cfg(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py
|
||||||
|
MAIN_CONFIG
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py
|
||||||
|
)
|
||||||
|
|
||||||
|
if (TARGET FlangRTUnitTests)
|
||||||
|
configure_lit_site_cfg(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.py.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg.py
|
||||||
|
MAIN_CONFIG
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.cfg.py
|
||||||
|
)
|
||||||
|
|
||||||
|
configure_lit_site_cfg(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/NonGtestUnit/lit.site.cfg.py.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/NonGtestUnit/lit.site.cfg.py
|
||||||
|
MAIN_CONFIG
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/NonGtestUnit/lit.cfg.py
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
add_custom_target(flang-rt-test-depends)
|
||||||
|
set_target_properties(flang-rt-test-depends PROPERTIES FOLDER "Flang-RT/Meta")
|
||||||
|
add_dependencies(flang-rt-test-depends
|
||||||
|
FlangRTUnitTests
|
||||||
|
flang_rt.runtime
|
||||||
|
flang_rt.runtime.unittest
|
||||||
|
)
|
||||||
|
|
||||||
|
add_lit_testsuite(check-flang-rt "Running the Flang-RT regression tests"
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
DEPENDS flang-rt-test-depends
|
||||||
|
)
|
||||||
|
set_target_properties(check-flang-rt PROPERTIES FOLDER "Flang-RT/Meta")
|
||||||
|
|
||||||
|
add_lit_testsuites(flang-rt ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
DEPENDS flang-rt-test-depends
|
||||||
|
)
|
@ -1,8 +1,10 @@
|
|||||||
! UNSUPPORTED: system-windows
|
! UNSUPPORTED: system-windows
|
||||||
! REQUIRES: flang-rt
|
! UNSUPPORTED: offload-cuda
|
||||||
|
|
||||||
! RUN: split-file %s %t
|
! RUN: split-file %s %t
|
||||||
! RUN: chmod +x %t/runtest.sh
|
! RUN: %clang -I"%include/flang" -c %t/cfile.c -o %t/cfile.o
|
||||||
! RUN: %t/runtest.sh %t %t/ffile.f90 %t/cfile.c %flang | FileCheck %s
|
! RUN: %flang -L"%libdir" %t/ffile.f90 %t/cfile.o -o %t/ctofortran
|
||||||
|
! RUN: env LD_LIBRARY_PATH="$LD_LIBRARY_PATH:%libdir" %t/ctofortran | FileCheck %s
|
||||||
|
|
||||||
!--- ffile.f90
|
!--- ffile.f90
|
||||||
program fmain
|
program fmain
|
||||||
@ -66,24 +68,3 @@ void csub() {
|
|||||||
foo(desc);
|
foo(desc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
!--- runtest.sh
|
|
||||||
#!/bin/bash
|
|
||||||
TMPDIR=$1
|
|
||||||
FFILE=$2
|
|
||||||
CFILE=$3
|
|
||||||
FLANG=$4
|
|
||||||
shift 4
|
|
||||||
FLAGS="$*"
|
|
||||||
BINDIR=`dirname $FLANG`
|
|
||||||
LIBDIR=$BINDIR/../lib
|
|
||||||
CCOMP=$BINDIR/clang
|
|
||||||
if [ -x $CCOMP ]
|
|
||||||
then
|
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBDIR
|
|
||||||
$CCOMP $FLAGS -c $CFILE -o $TMPDIR/cfile.o
|
|
||||||
$FLANG $FLAGS $FFILE $TMPDIR/cfile.o -o $TMPDIR/ctofortran
|
|
||||||
$TMPDIR/ctofortran # should print "PASS"
|
|
||||||
else
|
|
||||||
# No clang compiler, just pass by default
|
|
||||||
echo "PASS"
|
|
||||||
fi
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
! UNSUPPORTED: system-windows
|
|
||||||
! REQUIRES: flang-rt
|
! REQUIRES: flang-rt
|
||||||
|
! UNSUPPORTED: offload-cuda
|
||||||
|
|
||||||
! Verify that flang can correctly build executables.
|
! Verify that flang can correctly build executables.
|
||||||
|
|
||||||
! RUN: %flang %s -o %t
|
! RUN: %flang -L"%libdir" %s -o %t
|
||||||
! RUN: env LD_LIBRARY_PATH="$LD_LIBRARY_PATH:%llvmshlibdir" %t | FileCheck %s
|
! RUN: env LD_LIBRARY_PATH="$LD_LIBRARY_PATH:%libdir" %t | FileCheck %s
|
||||||
! RUN: rm -f %t
|
|
||||||
|
|
||||||
! CHECK: Hello, World!
|
! CHECK: Hello, World!
|
||||||
program hello
|
program hello
|
||||||
|
22
flang-rt/test/NonGtestUnit/lit.cfg.py
Normal file
22
flang-rt/test/NonGtestUnit/lit.cfg.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# -*- Python -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
import lit.formats
|
||||||
|
|
||||||
|
# name: The name of this test suite.
|
||||||
|
config.name = "flang-rt-OldUnit"
|
||||||
|
|
||||||
|
# suffixes: A list of file extensions to treat as test files.
|
||||||
|
# On Windows, ".exe" also matches the GTests and will execited redundantly.
|
||||||
|
config.suffixes = [".test", ".exe"]
|
||||||
|
|
||||||
|
# test_source_root: The root path where unit test binaries are located.
|
||||||
|
config.test_source_root = os.path.join(config.flangrt_binary_dir, "unittests")
|
||||||
|
|
||||||
|
# test_exec_root: The root path where tests should be run.
|
||||||
|
# lit writes a '.lit_test_times.txt' file into this directory.
|
||||||
|
config.test_exec_root = config.flang_rt_binary_test_dir
|
||||||
|
|
||||||
|
# testFormat: The test format to use to interpret tests.
|
||||||
|
config.test_format = lit.formats.ExecutableTest()
|
14
flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
Normal file
14
flang-rt/test/NonGtestUnit/lit.site.cfg.py.in
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
@LIT_SITE_CFG_IN_HEADER@
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
|
||||||
|
config.flang_rt_source_dir = "@FLANG_RT_SOURCE_DIR@"
|
||||||
|
config.flangrt_binary_dir = "@FLANG_RT_BINARY_DIR@"
|
||||||
|
config.flang_rt_binary_test_dir = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
import lit.llvm
|
||||||
|
lit.llvm.initialize(lit_config, config)
|
||||||
|
|
||||||
|
# Let the main config do the real work.
|
||||||
|
lit_config.load_config(config, os.path.join(config.flang_rt_source_dir, 'test', 'NonGtestUnit', 'lit.cfg.py'))
|
@ -3,10 +3,11 @@ This test makes sure that flang's runtime does not depend on the C++ runtime
|
|||||||
library. It tries to link this simple file against libflang_rt.runtime.a with
|
library. It tries to link this simple file against libflang_rt.runtime.a with
|
||||||
a C compiler.
|
a C compiler.
|
||||||
|
|
||||||
REQUIRES: c-compiler, flang-rt
|
UNSUPPORTED: system-windows
|
||||||
|
UNSUPPORTED: offload-cuda
|
||||||
|
|
||||||
RUN: %if system-aix %{ export OBJECT_MODE=64 %}
|
RUN: %if system-aix %{ export OBJECT_MODE=64 %}
|
||||||
RUN: %cc -std=c99 %s -I%include %libruntime -lm \
|
RUN: %cc -std=c99 %s -I%include -L"%libdir" -lflang_rt.runtime -lm \
|
||||||
RUN: %if system-aix %{-lpthread %}
|
RUN: %if system-aix %{-lpthread %}
|
||||||
RUN: rm a.out
|
RUN: rm a.out
|
||||||
*/
|
*/
|
||||||
|
21
flang-rt/test/Unit/lit.cfg.py
Normal file
21
flang-rt/test/Unit/lit.cfg.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# -*- Python -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
import lit.formats
|
||||||
|
|
||||||
|
# name: The name of this test suite.
|
||||||
|
config.name = "flang-rt-Unit"
|
||||||
|
|
||||||
|
# suffixes: A list of file extensions to treat as test files.
|
||||||
|
config.suffixes = []
|
||||||
|
|
||||||
|
# test_source_root: The root path where unit test binaries are located.
|
||||||
|
config.test_source_root = os.path.join(config.flangrt_binary_dir, "unittests")
|
||||||
|
|
||||||
|
# test_exec_root: The root path where tests should be run.
|
||||||
|
# lit writes a '.lit_test_times.txt' file into this directory.
|
||||||
|
config.test_exec_root = config.flang_rt_binary_test_dir
|
||||||
|
|
||||||
|
# testFormat: The test format to use to interpret tests.
|
||||||
|
config.test_format = lit.formats.GoogleTest(config.llvm_build_mode, "Tests")
|
15
flang-rt/test/Unit/lit.site.cfg.py.in
Normal file
15
flang-rt/test/Unit/lit.site.cfg.py.in
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
@LIT_SITE_CFG_IN_HEADER@
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
|
||||||
|
config.llvm_build_mode = "@LLVM_BUILD_MODE@"
|
||||||
|
config.flang_rt_source_dir = "@FLANG_RT_SOURCE_DIR@"
|
||||||
|
config.flangrt_binary_dir = "@FLANG_RT_BINARY_DIR@"
|
||||||
|
config.flang_rt_binary_test_dir = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
import lit.llvm
|
||||||
|
lit.llvm.initialize(lit_config, config)
|
||||||
|
|
||||||
|
# Let the main config do the real work.
|
||||||
|
lit_config.load_config(config, os.path.join(config.flang_rt_source_dir, 'test', 'Unit', 'lit.cfg.py'))
|
100
flang-rt/test/lit.cfg.py
Normal file
100
flang-rt/test/lit.cfg.py
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
# -*- Python -*-
|
||||||
|
|
||||||
|
import shlex
|
||||||
|
import lit.util
|
||||||
|
|
||||||
|
from lit.llvm import llvm_config
|
||||||
|
from lit.llvm.subst import ToolSubst, FindTool
|
||||||
|
|
||||||
|
|
||||||
|
def shjoin(args, sep=" "):
|
||||||
|
return sep.join([shlex.quote(arg) for arg in args])
|
||||||
|
|
||||||
|
|
||||||
|
# Configuration file for the 'lit' test runner.
|
||||||
|
|
||||||
|
# name: The name of this test suite.
|
||||||
|
config.name = "flang-rt"
|
||||||
|
|
||||||
|
# testFormat: The test format to use to interpret tests.
|
||||||
|
#
|
||||||
|
# For now we require '&&' between commands, until they get globally killed and
|
||||||
|
# the test runner updated.
|
||||||
|
config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell)
|
||||||
|
|
||||||
|
# suffixes: A list of file extensions to treat as test files.
|
||||||
|
config.suffixes = [
|
||||||
|
".c",
|
||||||
|
".cpp",
|
||||||
|
".f",
|
||||||
|
".F",
|
||||||
|
".ff",
|
||||||
|
".FOR",
|
||||||
|
".for",
|
||||||
|
".f77",
|
||||||
|
".f90",
|
||||||
|
".F90",
|
||||||
|
".ff90",
|
||||||
|
".f95",
|
||||||
|
".F95",
|
||||||
|
".ff95",
|
||||||
|
".fpp",
|
||||||
|
".FPP",
|
||||||
|
".cuf",
|
||||||
|
".CUF",
|
||||||
|
".f18",
|
||||||
|
".F18",
|
||||||
|
".f03",
|
||||||
|
".F03",
|
||||||
|
".f08",
|
||||||
|
".F08",
|
||||||
|
".ll",
|
||||||
|
".fir",
|
||||||
|
".mlir",
|
||||||
|
]
|
||||||
|
|
||||||
|
llvm_config.use_default_substitutions()
|
||||||
|
|
||||||
|
# test_source_root: The root path where tests are located.
|
||||||
|
config.test_source_root = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
# test_exec_root: The root path where tests should be run.
|
||||||
|
# lit writes a '.lit_test_times.txt' file into this directory.
|
||||||
|
config.test_exec_root = config.flang_rt_binary_test_dir
|
||||||
|
|
||||||
|
# On MacOS, -isysroot is needed to build binaries.
|
||||||
|
isysroot_flag = []
|
||||||
|
if config.osx_sysroot:
|
||||||
|
isysroot_flag = ["-isysroot", config.osx_sysroot]
|
||||||
|
|
||||||
|
tools = [
|
||||||
|
ToolSubst(
|
||||||
|
"%flang",
|
||||||
|
command=config.flang,
|
||||||
|
extra_args=isysroot_flag,
|
||||||
|
unresolved="fatal",
|
||||||
|
),
|
||||||
|
ToolSubst(
|
||||||
|
"%clang",
|
||||||
|
command=FindTool("clang"),
|
||||||
|
extra_args=isysroot_flag,
|
||||||
|
unresolved="fatal",
|
||||||
|
),
|
||||||
|
ToolSubst("%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal"),
|
||||||
|
]
|
||||||
|
llvm_config.add_tool_substitutions(tools)
|
||||||
|
|
||||||
|
# Let tests find LLVM's standard tools (FileCheck, split-file, not, ...)
|
||||||
|
llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True)
|
||||||
|
|
||||||
|
# Include path for C headers that define Flang's Fortran ABI.
|
||||||
|
config.substitutions.append(
|
||||||
|
("%include", os.path.join(config.flang_source_dir, "include"))
|
||||||
|
)
|
||||||
|
|
||||||
|
# Library path of libflang_rt.runtime.a (for lib search path when using non-Flang driver for linking)
|
||||||
|
config.substitutions.append(("%libdir", config.flang_rt_output_resource_lib_dir))
|
||||||
|
|
||||||
|
# For CUDA offloading, additional steps (device linking) and libraries (cudart) are needed.
|
||||||
|
if config.flang_rt_experimental_offload_support == "CUDA":
|
||||||
|
config.available_features.add("offload-cuda")
|
19
flang-rt/test/lit.site.cfg.py.in
Normal file
19
flang-rt/test/lit.site.cfg.py.in
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
@LIT_SITE_CFG_IN_HEADER@
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
|
||||||
|
config.flang_source_dir = "@FLANG_SOURCE_DIR@"
|
||||||
|
config.flang_rt_source_dir = "@FLANG_RT_SOURCE_DIR@"
|
||||||
|
config.flang_rt_binary_test_dir = os.path.dirname(__file__)
|
||||||
|
config.flang_rt_output_resource_lib_dir = "@FLANG_RT_OUTPUT_RESOURCE_LIB_DIR@"
|
||||||
|
config.flang_rt_experimental_offload_support = "@FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT@"
|
||||||
|
config.cc = "@CMAKE_C_COMPILER@"
|
||||||
|
config.flang = "@CMAKE_Fortran_COMPILER@"
|
||||||
|
config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
|
||||||
|
|
||||||
|
import lit.llvm
|
||||||
|
lit.llvm.initialize(lit_config, config)
|
||||||
|
|
||||||
|
# Let the main config do the real work.
|
||||||
|
lit_config.load_config(config, os.path.join(config.flang_rt_source_dir, 'test', 'lit.cfg.py'))
|
105
flang-rt/unittests/CMakeLists.txt
Normal file
105
flang-rt/unittests/CMakeLists.txt
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#===-- unittests/CMakeLists.txt --------------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
# LLVM uses a modified version of GTest that uses LLVMSupport for console
|
||||||
|
# output. Therefore it also needs to include files from LLVM. Unfortunately,
|
||||||
|
# LLVM/GTest doesn't add the include search path itself. Limiting the scope
|
||||||
|
# using target_include_directories does not work because with
|
||||||
|
# LLVM_INSTALL_GTEST=ON, as llvm_gtest is an IMPORT library.
|
||||||
|
include_directories("${LLVM_INCLUDE_DIR}" "${LLVM_MAIN_INCLUDE_DIR}")
|
||||||
|
|
||||||
|
# Add GTest if not already present.
|
||||||
|
# Using a function so LLVM_SUBPROJECT_TITLE does not propagate.
|
||||||
|
function (build_gtest)
|
||||||
|
set(LLVM_SUBPROJECT_TITLE "Third-Party/Google Test")
|
||||||
|
add_subdirectory("${LLVM_THIRD_PARTY_DIR}/unittest" "${CMAKE_CURRENT_BINARY_DIR}/third-party/unittest")
|
||||||
|
endfunction ()
|
||||||
|
if (NOT TARGET llvm_gtest)
|
||||||
|
build_gtest()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (CXX_SUPPORTS_SUGGEST_OVERRIDE_FLAG)
|
||||||
|
add_compile_options("-Wno-suggest-override")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# Target that depends on all unittests
|
||||||
|
add_custom_target(FlangRTUnitTests)
|
||||||
|
set_target_properties(FlangRTUnitTests PROPERTIES FOLDER "Flang-RT/Meta")
|
||||||
|
|
||||||
|
|
||||||
|
function(add_flangrt_unittest_offload_properties target)
|
||||||
|
# Set CUDA_RESOLVE_DEVICE_SYMBOLS.
|
||||||
|
if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
|
||||||
|
set_target_properties(${target}
|
||||||
|
PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
# Enable OpenMP offload during linking. We may need to replace
|
||||||
|
# LINK_OPTIONS with COMPILE_OPTIONS when there are OpenMP offload
|
||||||
|
# unittests.
|
||||||
|
#
|
||||||
|
# FIXME: replace 'native' in --offload-arch option with the list
|
||||||
|
# of targets that Fortran Runtime was built for.
|
||||||
|
if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
|
||||||
|
set_target_properties(${target}
|
||||||
|
PROPERTIES LINK_OPTIONS
|
||||||
|
"-fopenmp;--offload-arch=native"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
function(add_flangrt_unittest test_dirname)
|
||||||
|
cmake_parse_arguments(ARG
|
||||||
|
""
|
||||||
|
""
|
||||||
|
"LINK_LIBS"
|
||||||
|
${ARGN})
|
||||||
|
|
||||||
|
add_unittest(FlangRTUnitTests ${test_dirname} ${ARG_UNPARSED_ARGUMENTS})
|
||||||
|
|
||||||
|
target_link_libraries(${test_dirname} PRIVATE ${ARG_LINK_LIBS})
|
||||||
|
add_flangrt_unittest_offload_properties(${test_dirname})
|
||||||
|
|
||||||
|
# Required because LLVMSupport is compiled with this option.
|
||||||
|
# FIXME: According to CMake documentation, this is the default. Why is it
|
||||||
|
# needed? LLVM's add_unittest doesn't set it either.
|
||||||
|
set_target_properties(${test_dirname}
|
||||||
|
PROPERTIES
|
||||||
|
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL"
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(add_flangrt_nongtest_unittest test_name)
|
||||||
|
cmake_parse_arguments(ARG
|
||||||
|
"SLOW_TEST"
|
||||||
|
""
|
||||||
|
"LINK_LIBS"
|
||||||
|
${ARGN})
|
||||||
|
|
||||||
|
if(ARG_SLOW_TEST)
|
||||||
|
set(suffix .slow)
|
||||||
|
else()
|
||||||
|
set(suffix .test)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(${test_name}${suffix} EXCLUDE_FROM_ALL ${ARG_UNPARSED_ARGUMENTS})
|
||||||
|
set_target_properties(${test_name}${suffix} PROPERTIES FOLDER "Flang-RT/Tests/Unit")
|
||||||
|
|
||||||
|
target_link_libraries(${test_name}${suffix} PRIVATE NonGTestTesting ${ARG_LINK_LIBS})
|
||||||
|
|
||||||
|
if(NOT ARG_SLOW_TEST)
|
||||||
|
add_dependencies(FlangRTUnitTests ${test_name}${suffix})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_flangrt_unittest_offload_properties(${test_name}${suffix})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
add_subdirectory(Evaluate)
|
||||||
|
add_subdirectory(Runtime)
|
21
flang-rt/unittests/Evaluate/CMakeLists.txt
Normal file
21
flang-rt/unittests/Evaluate/CMakeLists.txt
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#===-- unittests/Evaluate/CMakeLists.txt -----------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
add_flangrt_nongtest_unittest(reshape
|
||||||
|
reshape.cpp
|
||||||
|
|
||||||
|
LINK_LIBS
|
||||||
|
flang_rt.runtime.unittest
|
||||||
|
)
|
||||||
|
|
||||||
|
add_flangrt_nongtest_unittest(ISO-Fortran-binding
|
||||||
|
ISO-Fortran-binding.cpp
|
||||||
|
|
||||||
|
LINK_LIBS
|
||||||
|
flang_rt.runtime.unittest
|
||||||
|
)
|
48
flang-rt/unittests/Runtime/CMakeLists.txt
Normal file
48
flang-rt/unittests/Runtime/CMakeLists.txt
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#===-- unittests/Runtime/CMakeLists.txt ------------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
add_flangrt_unittest(RuntimeTests
|
||||||
|
AccessTest.cpp
|
||||||
|
Allocatable.cpp
|
||||||
|
ArrayConstructor.cpp
|
||||||
|
BufferTest.cpp
|
||||||
|
CharacterTest.cpp
|
||||||
|
CommandTest.cpp
|
||||||
|
Complex.cpp
|
||||||
|
CrashHandlerFixture.cpp
|
||||||
|
Derived.cpp
|
||||||
|
ExternalIOTest.cpp
|
||||||
|
Format.cpp
|
||||||
|
Inquiry.cpp
|
||||||
|
ListInputTest.cpp
|
||||||
|
LogicalFormatTest.cpp
|
||||||
|
Matmul.cpp
|
||||||
|
MatmulTranspose.cpp
|
||||||
|
MiscIntrinsic.cpp
|
||||||
|
Namelist.cpp
|
||||||
|
Numeric.cpp
|
||||||
|
NumericalFormatTest.cpp
|
||||||
|
Pointer.cpp
|
||||||
|
Ragged.cpp
|
||||||
|
Random.cpp
|
||||||
|
Reduction.cpp
|
||||||
|
RuntimeCrashTest.cpp
|
||||||
|
Stop.cpp
|
||||||
|
Support.cpp
|
||||||
|
Time.cpp
|
||||||
|
TemporaryStack.cpp
|
||||||
|
Transformational.cpp
|
||||||
|
|
||||||
|
LINK_LIBS
|
||||||
|
flang_rt.runtime.unittest
|
||||||
|
)
|
||||||
|
target_compile_definitions(RuntimeTests PRIVATE NOT_EXE="${LLVM_TOOLS_DIR}/not${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
|
|
||||||
|
if (FLANG_RT_INCLUDE_CUF)
|
||||||
|
add_subdirectory(CUDA)
|
||||||
|
endif ()
|
18
flang-rt/unittests/Runtime/CUDA/CMakeLists.txt
Normal file
18
flang-rt/unittests/Runtime/CUDA/CMakeLists.txt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#===-- unittests/Runtime/CUDA/CMakeLists.txt -------------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
add_flangrt_unittest(FlangCufRuntimeTests
|
||||||
|
Allocatable.cpp
|
||||||
|
AllocatorCUF.cpp
|
||||||
|
Memory.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(FlangCufRuntimeTests
|
||||||
|
PRIVATE
|
||||||
|
flang_rt.cuda
|
||||||
|
)
|
@ -35,17 +35,6 @@ endif()
|
|||||||
|
|
||||||
option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF)
|
option(FLANG_ENABLE_WERROR "Fail and stop building flang if a warning is triggered." OFF)
|
||||||
|
|
||||||
# The out of tree builds of the compiler and the Fortran runtime
|
|
||||||
# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
|
|
||||||
# to be composable. Failure to synchronize this setting may result
|
|
||||||
# in linking errors or fatal failures in F128 runtime functions.
|
|
||||||
set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
|
|
||||||
"Specifies the target library used for implementing IEEE-754 128-bit float \
|
|
||||||
math in F18 runtime, e.g. it might be libquadmath for targets where \
|
|
||||||
REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
|
|
||||||
is mapped to long double, etc."
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check for a standalone build and configure as appropriate from
|
# Check for a standalone build and configure as appropriate from
|
||||||
# there.
|
# there.
|
||||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||||
@ -254,7 +243,25 @@ else()
|
|||||||
include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR})
|
include_directories(SYSTEM ${MLIR_TABLEGEN_OUTPUT_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(FLANG_INCLUDE_RUNTIME "Build the runtime in-tree (deprecated; to be replaced with LLVM_ENABLE_RUNTIMES=flang-rt)" ON)
|
set(FLANG_INCLUDE_RUNTIME_default ON)
|
||||||
|
if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
|
||||||
|
set(FLANG_INCLUDE_RUNTIME_default OFF)
|
||||||
|
endif ()
|
||||||
|
option(FLANG_INCLUDE_RUNTIME "Build the runtime in-tree (deprecated; to be replaced with LLVM_ENABLE_RUNTIMES=flang-rt)" ${FLANG_INCLUDE_RUNTIME_default})
|
||||||
|
if (FLANG_INCLUDE_RUNTIME)
|
||||||
|
if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
|
||||||
|
message(WARNING "Building Flang-RT using LLVM_ENABLE_RUNTIMES. FLANG_INCLUDE_RUNTIME=${FLANG_INCLUDE_RUNTIME} ignored.")
|
||||||
|
set(FLANG_INCLUDE_RUNTIME OFF)
|
||||||
|
else ()
|
||||||
|
message(STATUS "Building Flang-RT in-tree")
|
||||||
|
endif ()
|
||||||
|
else ()
|
||||||
|
if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
|
||||||
|
message(STATUS "Building Flang-RT using LLVM_ENABLE_RUNTIMES")
|
||||||
|
else ()
|
||||||
|
message(STATUS "Not building Flang-RT. For a usable Fortran toolchain, either add LLVM_ENABLE_RUNTIMES=flang-rt, or compile a standalone Flang-RT.")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
set(FLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
|
set(FLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
|
||||||
"Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
|
"Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
|
||||||
@ -364,20 +371,6 @@ if (FLANG_REPOSITORY_STRING)
|
|||||||
add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")
|
add_definitions(-DFLANG_REPOSITORY_STRING="${FLANG_REPOSITORY_STRING}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (FLANG_RUNTIME_F128_MATH_LIB)
|
|
||||||
add_compile_definitions(
|
|
||||||
FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(TestBigEndian)
|
|
||||||
test_big_endian(IS_BIGENDIAN)
|
|
||||||
if (IS_BIGENDIAN)
|
|
||||||
add_compile_definitions(FLANG_BIG_ENDIAN=1)
|
|
||||||
else ()
|
|
||||||
add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Configure Flang's Version.inc file.
|
# Configure Flang's Version.inc file.
|
||||||
configure_file(
|
configure_file(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in
|
${CMAKE_CURRENT_SOURCE_DIR}/include/flang/Version.inc.in
|
||||||
@ -475,6 +468,7 @@ if (APPLE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(AddFlang)
|
include(AddFlang)
|
||||||
|
include(FlangCommon)
|
||||||
|
|
||||||
if (FLANG_INCLUDE_TESTS)
|
if (FLANG_INCLUDE_TESTS)
|
||||||
add_compile_definitions(FLANG_INCLUDE_TESTS=1)
|
add_compile_definitions(FLANG_INCLUDE_TESTS=1)
|
||||||
@ -568,7 +562,13 @@ include(GetClangResourceDir)
|
|||||||
get_clang_resource_dir(HEADER_BINARY_DIR PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include)
|
get_clang_resource_dir(HEADER_BINARY_DIR PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include)
|
||||||
configure_file(
|
configure_file(
|
||||||
${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h
|
${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h
|
||||||
${HEADER_BINARY_DIR}/ISO_Fortran_binding.h)
|
${HEADER_BINARY_DIR}/ISO_Fortran_binding.h COPYONLY)
|
||||||
|
|
||||||
|
# llvm-test-suite explicitly searches for this header file
|
||||||
|
# (`ISO_FORTRAN_C_HEADER`), cannot hide it in Clang's resource dir.
|
||||||
|
configure_file(
|
||||||
|
${FLANG_SOURCE_DIR}/include/flang/ISO_Fortran_binding.h
|
||||||
|
${LLVM_RUNTIME_OUTPUT_INTDIR}/../include/flang/ISO_Fortran_binding.h COPYONLY)
|
||||||
|
|
||||||
# And also install it into the install area
|
# And also install it into the install area
|
||||||
get_clang_resource_dir(HEADER_INSTALL_DIR SUBDIR include)
|
get_clang_resource_dir(HEADER_INSTALL_DIR SUBDIR include)
|
||||||
|
43
flang/cmake/modules/FlangCommon.cmake
Normal file
43
flang/cmake/modules/FlangCommon.cmake
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#===-- cmake/modules/FlangCommon.txt ----------------------------===#
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
#
|
||||||
|
# CMake definitions shared between Flang and Flang-RT
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
# The out of tree builds of the compiler and the Fortran runtime
|
||||||
|
# must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
|
||||||
|
# to be composable. Failure to synchronize this setting may result
|
||||||
|
# in linking errors or fatal failures in F128 runtime functions.
|
||||||
|
set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
|
||||||
|
"Specifies the target library used for implementing IEEE-754 128-bit float \
|
||||||
|
math in F18 runtime, e.g. it might be libquadmath for targets where \
|
||||||
|
REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
|
||||||
|
is mapped to long double, etc."
|
||||||
|
)
|
||||||
|
if (FLANG_RUNTIME_F128_MATH_LIB)
|
||||||
|
add_compile_definitions(FLANG_RUNTIME_F128_MATH_LIB="${FLANG_RUNTIME_F128_MATH_LIB}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check if 128-bit float computations can be done via long double
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"#include <cfloat>
|
||||||
|
#if LDBL_MANT_DIG != 113
|
||||||
|
#error LDBL_MANT_DIG != 113
|
||||||
|
#endif
|
||||||
|
int main() { return 0; }
|
||||||
|
"
|
||||||
|
HAVE_LDBL_MANT_DIG_113)
|
||||||
|
|
||||||
|
include(TestBigEndian)
|
||||||
|
test_big_endian(IS_BIGENDIAN)
|
||||||
|
if (IS_BIGENDIAN)
|
||||||
|
add_compile_definitions(FLANG_BIG_ENDIAN=1)
|
||||||
|
else ()
|
||||||
|
add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
|
||||||
|
endif ()
|
@ -30,7 +30,7 @@ https://llvm.org/docs/GettingStarted.html.
|
|||||||
All of the examples below use GCC as the C/C++ compilers and ninja as the build
|
All of the examples below use GCC as the C/C++ compilers and ninja as the build
|
||||||
tool.
|
tool.
|
||||||
|
|
||||||
### Building flang in tree
|
### Building flang in tree with bootstrapped Flang-RT
|
||||||
Building flang in tree means building flang along with all of the projects on
|
Building flang in tree means building flang along with all of the projects on
|
||||||
which it depends. These projects include mlir, clang, flang, openmp, and
|
which it depends. These projects include mlir, clang, flang, openmp, and
|
||||||
compiler-rt. Note that compiler-rt is only needed to access libraries that
|
compiler-rt. Note that compiler-rt is only needed to access libraries that
|
||||||
@ -82,7 +82,7 @@ cmake \
|
|||||||
-DLLVM_TARGETS_TO_BUILD=host \
|
-DLLVM_TARGETS_TO_BUILD=host \
|
||||||
-DLLVM_LIT_ARGS=-v \
|
-DLLVM_LIT_ARGS=-v \
|
||||||
-DLLVM_ENABLE_PROJECTS="clang;mlir;flang;openmp" \
|
-DLLVM_ENABLE_PROJECTS="clang;mlir;flang;openmp" \
|
||||||
-DLLVM_ENABLE_RUNTIMES="compiler-rt" \
|
-DLLVM_ENABLE_RUNTIMES="compiler-rt;flang-rt" \
|
||||||
../llvm-project/llvm
|
../llvm-project/llvm
|
||||||
|
|
||||||
ninja
|
ninja
|
||||||
@ -101,7 +101,7 @@ the cmake command above:
|
|||||||
To run the flang tests on this build, execute the command in the "build"
|
To run the flang tests on this build, execute the command in the "build"
|
||||||
directory:
|
directory:
|
||||||
```bash
|
```bash
|
||||||
ninja check-flang
|
ninja check-flang check-flang-rt
|
||||||
```
|
```
|
||||||
|
|
||||||
To create the installed files:
|
To create the installed files:
|
||||||
@ -111,34 +111,6 @@ ninja install
|
|||||||
echo "latest" > $INSTALLDIR/bin/versionrc
|
echo "latest" > $INSTALLDIR/bin/versionrc
|
||||||
```
|
```
|
||||||
|
|
||||||
To build compiler-rt:
|
|
||||||
```bash
|
|
||||||
cd $ROOTDIR
|
|
||||||
rm -rf compiler-rt
|
|
||||||
mkdir compiler-rt
|
|
||||||
cd compiler-rt
|
|
||||||
CC=$INSTALLDIR/bin/clang \
|
|
||||||
CXX=$INSTALLDIR/bin/clang++ \
|
|
||||||
cmake \
|
|
||||||
-G Ninja \
|
|
||||||
../llvm-project/compiler-rt \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=$INSTALLDIR \
|
|
||||||
-DCMAKE_CXX_STANDARD=11 \
|
|
||||||
-DCMAKE_C_CFLAGS=-mlong-double-128 \
|
|
||||||
-DCMAKE_CXX_CFLAGS=-mlong-double-128 \
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
||||||
-DCOMPILER_RT_BUILD_ORC=OFF \
|
|
||||||
-DCOMPILER_RT_BUILD_XRAY=OFF \
|
|
||||||
-DCOMPILER_RT_BUILD_MEMPROF=OFF \
|
|
||||||
-DCOMPILER_RT_BUILD_LIBFUZZER=OFF \
|
|
||||||
-DCOMPILER_RT_BUILD_SANITIZERS=OFF \
|
|
||||||
-DLLVM_CONFIG_PATH=$INSTALLDIR/bin/llvm-config
|
|
||||||
|
|
||||||
ninja
|
|
||||||
ninja install
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that these instructions specify flang as one of the projects to build in
|
Note that these instructions specify flang as one of the projects to build in
|
||||||
the in tree build. This is not strictly necessary for subsequent standalone
|
the in tree build. This is not strictly necessary for subsequent standalone
|
||||||
builds, but doing so lets you run the flang tests to verify that the source
|
builds, but doing so lets you run the flang tests to verify that the source
|
||||||
@ -192,7 +164,32 @@ directory:
|
|||||||
ninja check-flang
|
ninja check-flang
|
||||||
```
|
```
|
||||||
|
|
||||||
### Building flang runtime for accelerators
|
To build Flang-RT (required for linking executables):
|
||||||
|
```bash
|
||||||
|
cd $ROOTDIR
|
||||||
|
rm -rf flang-rt
|
||||||
|
mkdir flang-rt
|
||||||
|
cd flang-rt
|
||||||
|
CC=$INSTALLDIR/bin/clang \
|
||||||
|
CXX=$INSTALLDIR/bin/clang++ \
|
||||||
|
cmake \
|
||||||
|
-G Ninja \
|
||||||
|
../llvm-project/runtimes \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=$INSTALLDIR \
|
||||||
|
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
||||||
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
-DLLVM_BINARY_DIR=$ROOTDIR/build \
|
||||||
|
-DLLVM_Fortran_COMPILER=$INSTALLDIR/bin/flang \
|
||||||
|
-DLLVM_Fortran_COMPILER_WORKS=ON
|
||||||
|
|
||||||
|
ninja
|
||||||
|
ninja check-flang-rt
|
||||||
|
ninja install
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Building Flang-RT for accelerators
|
||||||
Flang runtime can be built for accelerators in experimental mode, i.e.
|
Flang runtime can be built for accelerators in experimental mode, i.e.
|
||||||
complete enabling is WIP. CUDA and OpenMP target offload builds
|
complete enabling is WIP. CUDA and OpenMP target offload builds
|
||||||
are currently supported.
|
are currently supported.
|
||||||
@ -203,20 +200,21 @@ are currently supported.
|
|||||||
Clang with NVPTX backend and NVCC compilers are supported.
|
Clang with NVPTX backend and NVCC compilers are supported.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd llvm-project/flang
|
cd llvm-project
|
||||||
rm -rf build_flang_runtime
|
rm -rf build_flang_runtime
|
||||||
mkdir build_flang_runtime
|
mkdir build_flang_runtime
|
||||||
cd build_flang_runtime
|
cd build_flang_runtime
|
||||||
|
|
||||||
cmake \
|
cmake \
|
||||||
-DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
|
||||||
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
||||||
-DCMAKE_C_COMPILER=clang \
|
-DCMAKE_C_COMPILER=clang \
|
||||||
-DCMAKE_CXX_COMPILER=clang++ \
|
-DCMAKE_CXX_COMPILER=clang++ \
|
||||||
-DCMAKE_CUDA_COMPILER=clang \
|
-DCMAKE_CUDA_COMPILER=clang \
|
||||||
-DCMAKE_CUDA_HOST_COMPILER=clang++ \
|
-DCMAKE_CUDA_HOST_COMPILER=clang++ \
|
||||||
../runtime/
|
../runtimes/
|
||||||
make -j flang-rt
|
make flang-rt
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that the used version of `clang` must [support](https://releases.llvm.org/16.0.0/tools/clang/docs/ReleaseNotes.html#cuda-support)
|
Note that the used version of `clang` must [support](https://releases.llvm.org/16.0.0/tools/clang/docs/ReleaseNotes.html#cuda-support)
|
||||||
@ -225,21 +223,22 @@ CUDA toolkit installations, please use `-DCUDAToolkit_ROOT=/some/path`
|
|||||||
to specify the compatible version.
|
to specify the compatible version.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd llvm-project/flang
|
cd llvm-project
|
||||||
rm -rf build_flang_runtime
|
rm -rf build_flang_runtime
|
||||||
mkdir build_flang_runtime
|
mkdir build_flang_runtime
|
||||||
cd build_flang_runtime
|
cd build_flang_runtime
|
||||||
|
|
||||||
cmake \
|
cmake \
|
||||||
-DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
|
||||||
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
||||||
-DCMAKE_C_COMPILER=clang \
|
-DCMAKE_C_COMPILER=clang \
|
||||||
-DCMAKE_CXX_COMPILER=clang++ \
|
-DCMAKE_CXX_COMPILER=clang++ \
|
||||||
-DCMAKE_CUDA_COMPILER=nvcc \
|
-DCMAKE_CUDA_COMPILER=nvcc \
|
||||||
-DCMAKE_CUDA_HOST_COMPILER=clang++ \
|
-DCMAKE_CUDA_HOST_COMPILER=clang++ \
|
||||||
../runtime/
|
../runtimes/
|
||||||
|
|
||||||
make -j flang-rt
|
make flang-rt
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that `nvcc` might limit support to certain
|
Note that `nvcc` might limit support to certain
|
||||||
@ -251,50 +250,59 @@ code. Note that the packaging of the libraries is different
|
|||||||
between [Clang](https://clang.llvm.org/docs/OffloadingDesign.html#linking-target-device-code) and NVCC, so the library must be linked using
|
between [Clang](https://clang.llvm.org/docs/OffloadingDesign.html#linking-target-device-code) and NVCC, so the library must be linked using
|
||||||
compatible compiler drivers.
|
compatible compiler drivers.
|
||||||
|
|
||||||
#### Building in-tree
|
#### Building in-tree (bootstrapping build)
|
||||||
One may build Flang runtime library along with building Flang itself
|
One may build Flang runtime library along with building Flang itself
|
||||||
by providing these additional CMake variables on top of the Flang in-tree
|
by providing these additional CMake variables on top of the Flang in-tree
|
||||||
build config:
|
build config:
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
```bash
|
```bash
|
||||||
-DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
|
||||||
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
||||||
-DCMAKE_C_COMPILER=clang \
|
-DCMAKE_C_COMPILER=clang \
|
||||||
-DCMAKE_CXX_COMPILER=clang++ \
|
-DCMAKE_CXX_COMPILER=clang++ \
|
||||||
-DCMAKE_CUDA_COMPILER=clang \
|
-DCMAKE_CUDA_COMPILER=clang \
|
||||||
-DCMAKE_CUDA_HOST_COMPILER=clang++ \
|
-DCMAKE_CUDA_HOST_COMPILER=clang++ \
|
||||||
|
../llvm
|
||||||
```
|
```
|
||||||
|
|
||||||
Or:
|
Or:
|
||||||
```bash
|
```bash
|
||||||
-DFLANG_EXPERIMENTAL_CUDA_RUNTIME=ON \
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA \
|
||||||
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
-DCMAKE_CUDA_ARCHITECTURES=80 \
|
||||||
-DCMAKE_C_COMPILER=gcc \
|
-DCMAKE_C_COMPILER=gcc \
|
||||||
-DCMAKE_CXX_COMPILER=g++ \
|
-DCMAKE_CXX_COMPILER=g++ \
|
||||||
-DCMAKE_CUDA_COMPILER=nvcc \
|
-DCMAKE_CUDA_COMPILER=nvcc \
|
||||||
-DCMAKE_CUDA_HOST_COMPILER=g++ \
|
-DCMAKE_CUDA_HOST_COMPILER=g++ \
|
||||||
|
../llvm
|
||||||
```
|
```
|
||||||
|
|
||||||
Normal `make -j check-flang` will work with such CMake configuration.
|
Normal `make check-flang` will work with such CMake configuration.
|
||||||
|
Consider building in parallel using the `-j<jobs>` flag, where `<jobs>` is a
|
||||||
|
number sufficiently low for all build jobs to fit into the available RAM. Using
|
||||||
|
the number of harware threads (`nprocs`) is likely too much for most
|
||||||
|
commodity machines.
|
||||||
|
|
||||||
##### OpenMP target offload build
|
##### OpenMP target offload build
|
||||||
Only Clang compiler is currently supported.
|
Only Clang compiler is currently supported.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd llvm-project/flang
|
cd llvm-project
|
||||||
rm -rf build_flang_runtime
|
rm -rf build_flang_runtime
|
||||||
mkdir build_flang_runtime
|
mkdir build_flang_runtime
|
||||||
cd build_flang_runtime
|
cd build_flang_runtime
|
||||||
|
|
||||||
cmake \
|
cmake \
|
||||||
-DFLANG_EXPERIMENTAL_OMP_OFFLOAD_BUILD="host_device" \
|
-DLLVM_ENABLE_RUNTIMES=flang-rt \
|
||||||
|
-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT="OpenMP" \
|
||||||
-DCMAKE_C_COMPILER=clang \
|
-DCMAKE_C_COMPILER=clang \
|
||||||
-DCMAKE_CXX_COMPILER=clang++ \
|
-DCMAKE_CXX_COMPILER=clang++ \
|
||||||
-DFLANG_OMP_DEVICE_ARCHITECTURES="all" \
|
-DFLANG_RT_DEVICE_ARCHITECTURES=all \
|
||||||
../runtime/
|
../runtimes/
|
||||||
|
|
||||||
make -j flang-rt
|
make flang-rt
|
||||||
```
|
```
|
||||||
|
|
||||||
The result of the build is a "device-only" library, i.e. the host
|
The result of the build is a "device-only" library, i.e. the host
|
||||||
|
@ -43,6 +43,12 @@ page](https://llvm.org/releases/).
|
|||||||
* The CufRuntime_cuda_${version} library has been renamed to
|
* The CufRuntime_cuda_${version} library has been renamed to
|
||||||
`flang_rt.cuda_${version}`.
|
`flang_rt.cuda_${version}`.
|
||||||
|
|
||||||
|
* The Fortran Runtime library has been move to a new top-level directory
|
||||||
|
named "flang-rt". It now supports the LLVM_ENABLE_RUNTIMES mechanism to
|
||||||
|
build Flang-RT for multiple target triples. libflang_rt.runtime.{a|so} will
|
||||||
|
now be emitted into Clang's per-target resource directory
|
||||||
|
(next to libclang_rt.*.*) where it is also found by Flang's driver.
|
||||||
|
|
||||||
## New Issues Found
|
## New Issues Found
|
||||||
|
|
||||||
|
|
||||||
|
@ -166,26 +166,6 @@ else:
|
|||||||
if config.flang_include_runtime:
|
if config.flang_include_runtime:
|
||||||
config.available_features.add("flang-rt")
|
config.available_features.add("flang-rt")
|
||||||
|
|
||||||
# Define some variables to help us test that the flang runtime doesn't depend on
|
|
||||||
# the C++ runtime libraries. For this we need a C compiler. If for some reason
|
|
||||||
# we don't have one, we can just disable the test.
|
|
||||||
if config.flang_include_runtime and config.cc:
|
|
||||||
libruntime = os.path.join(config.flang_lib_dir, "libflang_rt.runtime.a")
|
|
||||||
include = os.path.join(config.flang_src_dir, "include")
|
|
||||||
|
|
||||||
if (
|
|
||||||
os.path.isfile(libruntime)
|
|
||||||
and os.path.isdir(include)
|
|
||||||
):
|
|
||||||
config.available_features.add("c-compiler")
|
|
||||||
tools.append(
|
|
||||||
ToolSubst(
|
|
||||||
"%cc", command=config.cc, extra_args=isysroot_flag, unresolved="fatal"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
tools.append(ToolSubst("%libruntime", command=libruntime, unresolved="fatal"))
|
|
||||||
tools.append(ToolSubst("%include", command=include, unresolved="fatal"))
|
|
||||||
|
|
||||||
# Add all the tools and their substitutions (if applicable). Use the search paths provided for
|
# Add all the tools and their substitutions (if applicable). Use the search paths provided for
|
||||||
# finding the tools.
|
# finding the tools.
|
||||||
if config.flang_standalone_build:
|
if config.flang_standalone_build:
|
||||||
|
@ -11,18 +11,15 @@ config.llvm_target_triple_env = "@LLVM_TARGET_TRIPLE_ENV@"
|
|||||||
config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@"
|
config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@"
|
||||||
config.errc_messages = "@LLVM_LIT_ERRC_MESSAGES@"
|
config.errc_messages = "@LLVM_LIT_ERRC_MESSAGES@"
|
||||||
config.flang_obj_root = "@FLANG_BINARY_DIR@"
|
config.flang_obj_root = "@FLANG_BINARY_DIR@"
|
||||||
config.flang_src_dir = "@FLANG_SOURCE_DIR@"
|
|
||||||
config.flang_tools_dir = lit_config.substitute("@FLANG_TOOLS_DIR@")
|
config.flang_tools_dir = lit_config.substitute("@FLANG_TOOLS_DIR@")
|
||||||
config.flang_intrinsic_modules_dir = "@FLANG_INTRINSIC_MODULES_DIR@"
|
config.flang_intrinsic_modules_dir = "@FLANG_INTRINSIC_MODULES_DIR@"
|
||||||
config.flang_llvm_tools_dir = "@CMAKE_BINARY_DIR@/bin"
|
config.flang_llvm_tools_dir = "@CMAKE_BINARY_DIR@/bin"
|
||||||
config.flang_lib_dir = "@CMAKE_BINARY_DIR@/lib"
|
|
||||||
config.flang_test_triple = "@FLANG_TEST_TARGET_TRIPLE@"
|
config.flang_test_triple = "@FLANG_TEST_TARGET_TRIPLE@"
|
||||||
config.flang_examples = @LLVM_BUILD_EXAMPLES@
|
config.flang_examples = @LLVM_BUILD_EXAMPLES@
|
||||||
config.python_executable = "@PYTHON_EXECUTABLE@"
|
config.python_executable = "@PYTHON_EXECUTABLE@"
|
||||||
config.flang_standalone_build = @FLANG_STANDALONE_BUILD@
|
config.flang_standalone_build = @FLANG_STANDALONE_BUILD@
|
||||||
config.has_plugins = @LLVM_ENABLE_PLUGINS@
|
config.has_plugins = @LLVM_ENABLE_PLUGINS@
|
||||||
config.linked_bye_extension = @LLVM_BYE_LINK_INTO_TOOLS@
|
config.linked_bye_extension = @LLVM_BYE_LINK_INTO_TOOLS@
|
||||||
config.cc = "@CMAKE_C_COMPILER@"
|
|
||||||
config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
|
config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
|
||||||
config.targets_to_build = "@TARGETS_TO_BUILD@"
|
config.targets_to_build = "@TARGETS_TO_BUILD@"
|
||||||
config.default_sysroot = "@DEFAULT_SYSROOT@"
|
config.default_sysroot = "@DEFAULT_SYSROOT@"
|
||||||
|
@ -164,12 +164,18 @@ if ("compiler-rt" IN_LIST LLVM_ENABLE_PROJECTS)
|
|||||||
"https://compiler-rt.llvm.org/ for building the runtimes.")
|
"https://compiler-rt.llvm.org/ for building the runtimes.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
|
||||||
|
if (NOT "flang" IN_LIST LLVM_ENABLE_PROJECTS)
|
||||||
|
message(FATAL_ERROR "Flang is not enabled, but is required for the Flang-RT runtime")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
# Select the runtimes to build
|
# Select the runtimes to build
|
||||||
#
|
#
|
||||||
# As we migrate runtimes to using the bootstrapping build, the set of default runtimes
|
# As we migrate runtimes to using the bootstrapping build, the set of default runtimes
|
||||||
# should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above.
|
# should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above.
|
||||||
set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind")
|
set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind")
|
||||||
set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;offload")
|
set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;offload;flang-rt")
|
||||||
set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
|
set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
|
||||||
"Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
|
"Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
|
||||||
if(LLVM_ENABLE_RUNTIMES STREQUAL "all")
|
if(LLVM_ENABLE_RUNTIMES STREQUAL "all")
|
||||||
|
@ -38,6 +38,8 @@ endfunction()
|
|||||||
|
|
||||||
|
|
||||||
# llvm_ExternalProject_Add(name source_dir ...
|
# llvm_ExternalProject_Add(name source_dir ...
|
||||||
|
# ENABLE_FORTRAN
|
||||||
|
# External project requires the Flang compiler
|
||||||
# USE_TOOLCHAIN
|
# USE_TOOLCHAIN
|
||||||
# Use just-built tools (see TOOLCHAIN_TOOLS)
|
# Use just-built tools (see TOOLCHAIN_TOOLS)
|
||||||
# EXCLUDE_FROM_ALL
|
# EXCLUDE_FROM_ALL
|
||||||
@ -65,7 +67,7 @@ endfunction()
|
|||||||
# )
|
# )
|
||||||
function(llvm_ExternalProject_Add name source_dir)
|
function(llvm_ExternalProject_Add name source_dir)
|
||||||
cmake_parse_arguments(ARG
|
cmake_parse_arguments(ARG
|
||||||
"USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
|
"ENABLE_FORTRAN;USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN"
|
||||||
"SOURCE_DIR;FOLDER"
|
"SOURCE_DIR;FOLDER"
|
||||||
"CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE"
|
"CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;STRIP_TOOL;TARGET_TRIPLE"
|
||||||
${ARGN})
|
${ARGN})
|
||||||
@ -93,6 +95,9 @@ function(llvm_ExternalProject_Add name source_dir)
|
|||||||
|
|
||||||
if(NOT ARG_TOOLCHAIN_TOOLS)
|
if(NOT ARG_TOOLCHAIN_TOOLS)
|
||||||
set(ARG_TOOLCHAIN_TOOLS clang)
|
set(ARG_TOOLCHAIN_TOOLS clang)
|
||||||
|
if (ARG_ENABLE_FORTRAN)
|
||||||
|
list(APPEND ARG_TOOLCHAIN_TOOLS flang)
|
||||||
|
endif ()
|
||||||
# AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.
|
# AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.
|
||||||
if(NOT _cmake_system_name STREQUAL AIX)
|
if(NOT _cmake_system_name STREQUAL AIX)
|
||||||
list(APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)
|
list(APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)
|
||||||
@ -143,6 +148,10 @@ function(llvm_ExternalProject_Add name source_dir)
|
|||||||
set(CLANG_IN_TOOLCHAIN On)
|
set(CLANG_IN_TOOLCHAIN On)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(flang IN_LIST TOOLCHAIN_TOOLS)
|
||||||
|
set(FLANG_IN_TOOLCHAIN On)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(RUNTIME_LIBRARIES AND CLANG_IN_TOOLCHAIN)
|
if(RUNTIME_LIBRARIES AND CLANG_IN_TOOLCHAIN)
|
||||||
list(APPEND TOOLCHAIN_BINS ${RUNTIME_LIBRARIES})
|
list(APPEND TOOLCHAIN_BINS ${RUNTIME_LIBRARIES})
|
||||||
endif()
|
endif()
|
||||||
@ -225,6 +234,9 @@ function(llvm_ExternalProject_Add name source_dir)
|
|||||||
-DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${CMAKE_EXECUTABLE_SUFFIX})
|
-DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${CMAKE_EXECUTABLE_SUFFIX})
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
if(FLANG_IN_TOOLCHAIN)
|
||||||
|
list(APPEND compiler_args -DCMAKE_Fortran_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/flang${CMAKE_EXECUTABLE_SUFFIX})
|
||||||
|
endif()
|
||||||
if(lld IN_LIST TOOLCHAIN_TOOLS)
|
if(lld IN_LIST TOOLCHAIN_TOOLS)
|
||||||
if(is_msvc_target)
|
if(is_msvc_target)
|
||||||
list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})
|
list(APPEND compiler_args -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})
|
||||||
@ -308,6 +320,7 @@ function(llvm_ExternalProject_Add name source_dir)
|
|||||||
set(compiler_args -DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER}
|
set(compiler_args -DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER}
|
||||||
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
|
||||||
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
|
||||||
|
-DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER}
|
||||||
-DCMAKE_LINKER=${CMAKE_LINKER}
|
-DCMAKE_LINKER=${CMAKE_LINKER}
|
||||||
-DCMAKE_AR=${CMAKE_AR}
|
-DCMAKE_AR=${CMAKE_AR}
|
||||||
-DCMAKE_RANLIB=${CMAKE_RANLIB}
|
-DCMAKE_RANLIB=${CMAKE_RANLIB}
|
||||||
@ -357,6 +370,7 @@ function(llvm_ExternalProject_Add name source_dir)
|
|||||||
if(ARG_TARGET_TRIPLE)
|
if(ARG_TARGET_TRIPLE)
|
||||||
list(APPEND compiler_args -DCMAKE_C_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
|
list(APPEND compiler_args -DCMAKE_C_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
|
||||||
list(APPEND compiler_args -DCMAKE_CXX_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
|
list(APPEND compiler_args -DCMAKE_CXX_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
|
||||||
|
list(APPEND compiler_args -DCMAKE_Fortran_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
|
||||||
list(APPEND compiler_args -DCMAKE_ASM_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
|
list(APPEND compiler_args -DCMAKE_ASM_COMPILER_TARGET=${ARG_TARGET_TRIPLE})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -11,7 +11,8 @@ foreach(entry ${entries})
|
|||||||
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/libunwind) AND
|
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/libunwind) AND
|
||||||
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/test-suite) AND
|
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/test-suite) AND
|
||||||
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/openmp) AND
|
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/openmp) AND
|
||||||
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/cross-project-tests))
|
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/cross-project-tests) AND
|
||||||
|
(NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/flang-rt))
|
||||||
get_filename_component(entry_name "${entry}" NAME)
|
get_filename_component(entry_name "${entry}" NAME)
|
||||||
add_llvm_external_project(${entry_name})
|
add_llvm_external_project(${entry_name})
|
||||||
endif()
|
endif()
|
||||||
@ -37,6 +38,7 @@ if(${LLVM_BUILD_RUNTIME})
|
|||||||
if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
|
if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
|
||||||
add_llvm_external_project(compiler-rt)
|
add_llvm_external_project(compiler-rt)
|
||||||
endif()
|
endif()
|
||||||
|
add_llvm_external_project(flang-rt)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_llvm_external_project(dragonegg)
|
add_llvm_external_project(dragonegg)
|
||||||
|
@ -230,7 +230,7 @@ foreach(entry ${runtimes})
|
|||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
function(runtime_default_target)
|
function(runtime_default_target)
|
||||||
cmake_parse_arguments(ARG "" "" "DEPENDS;CMAKE_ARGS;PREFIXES" ${ARGN})
|
cmake_parse_arguments(ARG "" "" "DEPENDS;CMAKE_ARGS;PREFIXES;EXTRA_ARGS" ${ARGN})
|
||||||
|
|
||||||
include(${LLVM_BINARY_DIR}/runtimes/Components.cmake OPTIONAL)
|
include(${LLVM_BINARY_DIR}/runtimes/Components.cmake OPTIONAL)
|
||||||
set(SUB_CHECK_TARGETS ${SUB_CHECK_TARGETS} PARENT_SCOPE)
|
set(SUB_CHECK_TARGETS ${SUB_CHECK_TARGETS} PARENT_SCOPE)
|
||||||
@ -270,14 +270,16 @@ function(runtime_default_target)
|
|||||||
-DLLVM_BUILD_TOOLS=${LLVM_BUILD_TOOLS}
|
-DLLVM_BUILD_TOOLS=${LLVM_BUILD_TOOLS}
|
||||||
-DCMAKE_C_COMPILER_WORKS=ON
|
-DCMAKE_C_COMPILER_WORKS=ON
|
||||||
-DCMAKE_CXX_COMPILER_WORKS=ON
|
-DCMAKE_CXX_COMPILER_WORKS=ON
|
||||||
|
-DCMAKE_Fortran_COMPILER_WORKS=ON
|
||||||
-DCMAKE_ASM_COMPILER_WORKS=ON
|
-DCMAKE_ASM_COMPILER_WORKS=ON
|
||||||
${COMMON_CMAKE_ARGS}
|
${COMMON_CMAKE_ARGS}
|
||||||
${RUNTIMES_CMAKE_ARGS}
|
${RUNTIMES_CMAKE_ARGS}
|
||||||
${ARG_CMAKE_ARGS}
|
${ARG_CMAKE_ARGS}
|
||||||
PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES
|
PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES
|
||||||
LLVM_USE_LINKER
|
LLVM_USE_LINKER
|
||||||
CUDA # For runtimes that may look for the CUDA SDK (libc, offload)
|
CUDA CMAKE_CUDA # For runtimes that may look for the CUDA compiler and/or SDK (libc, offload, flang-rt)
|
||||||
FFI # offload uses libffi
|
FFI # offload uses libffi
|
||||||
|
FLANG_RUNTIME # Shared between Flang and Flang-RT
|
||||||
${ARG_PREFIXES}
|
${ARG_PREFIXES}
|
||||||
EXTRA_TARGETS ${extra_targets}
|
EXTRA_TARGETS ${extra_targets}
|
||||||
${test_targets}
|
${test_targets}
|
||||||
@ -287,7 +289,7 @@ function(runtime_default_target)
|
|||||||
USE_TOOLCHAIN
|
USE_TOOLCHAIN
|
||||||
TARGET_TRIPLE ${LLVM_TARGET_TRIPLE}
|
TARGET_TRIPLE ${LLVM_TARGET_TRIPLE}
|
||||||
FOLDER "Runtimes"
|
FOLDER "Runtimes"
|
||||||
${EXTRA_ARGS})
|
${EXTRA_ARGS} ${ARG_EXTRA_ARGS})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# runtime_register_target(name)
|
# runtime_register_target(name)
|
||||||
@ -404,6 +406,7 @@ function(runtime_register_target name)
|
|||||||
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR}
|
-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR}
|
||||||
-DCMAKE_C_COMPILER_WORKS=ON
|
-DCMAKE_C_COMPILER_WORKS=ON
|
||||||
-DCMAKE_CXX_COMPILER_WORKS=ON
|
-DCMAKE_CXX_COMPILER_WORKS=ON
|
||||||
|
-DCMAKE_Fortran_COMPILER_WORKS=ON
|
||||||
-DCMAKE_ASM_COMPILER_WORKS=ON
|
-DCMAKE_ASM_COMPILER_WORKS=ON
|
||||||
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
|
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON
|
||||||
-DLLVM_RUNTIMES_TARGET=${name}
|
-DLLVM_RUNTIMES_TARGET=${name}
|
||||||
@ -463,10 +466,13 @@ if(build_runtimes)
|
|||||||
# together in a single CMake invocation.
|
# together in a single CMake invocation.
|
||||||
set(extra_deps "")
|
set(extra_deps "")
|
||||||
set(extra_cmake_args "")
|
set(extra_cmake_args "")
|
||||||
|
set(extra_args "")
|
||||||
|
|
||||||
if(LLVM_INCLUDE_TESTS)
|
if(LLVM_INCLUDE_TESTS)
|
||||||
foreach(dep FileCheck
|
foreach(dep FileCheck
|
||||||
clang
|
clang
|
||||||
|
clang-offload-packager
|
||||||
|
flang
|
||||||
count
|
count
|
||||||
lld
|
lld
|
||||||
lli
|
lli
|
||||||
@ -549,19 +555,24 @@ if(build_runtimes)
|
|||||||
if(LLVM_LIBC_FULL_BUILD)
|
if(LLVM_LIBC_FULL_BUILD)
|
||||||
list(APPEND extra_cmake_args "-DLLVM_LIBC_FULL_BUILD=ON")
|
list(APPEND extra_cmake_args "-DLLVM_LIBC_FULL_BUILD=ON")
|
||||||
endif()
|
endif()
|
||||||
|
if("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
|
||||||
|
list(APPEND extra_args ENABLE_FORTRAN)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if(NOT LLVM_RUNTIME_TARGETS)
|
if(NOT LLVM_RUNTIME_TARGETS)
|
||||||
runtime_default_target(
|
runtime_default_target(
|
||||||
DEPENDS ${builtins_dep} ${extra_deps}
|
DEPENDS ${builtins_dep} ${extra_deps}
|
||||||
CMAKE_ARGS ${extra_cmake_args}
|
CMAKE_ARGS ${extra_cmake_args}
|
||||||
PREFIXES ${prefixes})
|
PREFIXES ${prefixes}
|
||||||
|
EXTRA_ARGS ${extra_args})
|
||||||
set(test_targets check-runtimes)
|
set(test_targets check-runtimes)
|
||||||
else()
|
else()
|
||||||
if("default" IN_LIST LLVM_RUNTIME_TARGETS)
|
if("default" IN_LIST LLVM_RUNTIME_TARGETS)
|
||||||
runtime_default_target(
|
runtime_default_target(
|
||||||
DEPENDS ${builtins_dep} ${extra_deps}
|
DEPENDS ${builtins_dep} ${extra_deps}
|
||||||
CMAKE_ARGS ${extra_cmake_args}
|
CMAKE_ARGS ${extra_cmake_args}
|
||||||
PREFIXES ${prefixes})
|
PREFIXES ${prefixes}
|
||||||
|
EXTRA_ARGS ${extra_args})
|
||||||
list(REMOVE_ITEM LLVM_RUNTIME_TARGETS "default")
|
list(REMOVE_ITEM LLVM_RUNTIME_TARGETS "default")
|
||||||
else()
|
else()
|
||||||
add_custom_target(runtimes)
|
add_custom_target(runtimes)
|
||||||
@ -608,7 +619,7 @@ if(build_runtimes)
|
|||||||
runtime_register_target(${name}
|
runtime_register_target(${name}
|
||||||
DEPENDS ${builtins_dep_name} ${extra_deps}
|
DEPENDS ${builtins_dep_name} ${extra_deps}
|
||||||
CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=${name} ${extra_cmake_args}
|
CMAKE_ARGS -DLLVM_DEFAULT_TARGET_TRIPLE=${name} ${extra_cmake_args}
|
||||||
EXTRA_ARGS TARGET_TRIPLE ${name})
|
EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
foreach(multilib ${LLVM_RUNTIME_MULTILIBS})
|
foreach(multilib ${LLVM_RUNTIME_MULTILIBS})
|
||||||
@ -620,7 +631,7 @@ if(build_runtimes)
|
|||||||
-DLLVM_RUNTIMES_LIBDIR_SUBDIR=${multilib}
|
-DLLVM_RUNTIMES_LIBDIR_SUBDIR=${multilib}
|
||||||
${extra_cmake_args}
|
${extra_cmake_args}
|
||||||
BASE_NAME ${name}
|
BASE_NAME ${name}
|
||||||
EXTRA_ARGS TARGET_TRIPLE ${name})
|
EXTRA_ARGS TARGET_TRIPLE ${name} ${extra_args})
|
||||||
endforeach()
|
endforeach()
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
|
@ -36,7 +36,7 @@ list(INSERT CMAKE_MODULE_PATH 0
|
|||||||
# We order libraries to mirror roughly how they are layered, except that compiler-rt can depend
|
# We order libraries to mirror roughly how they are layered, except that compiler-rt can depend
|
||||||
# on libc++, so we put it after.
|
# on libc++, so we put it after.
|
||||||
set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;offload")
|
set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;offload")
|
||||||
set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc")
|
set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc;flang-rt")
|
||||||
set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
|
set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
|
||||||
"Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
|
"Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
|
||||||
if(LLVM_ENABLE_RUNTIMES STREQUAL "all" )
|
if(LLVM_ENABLE_RUNTIMES STREQUAL "all" )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user