[llvm-branch-commits] [clang] [flang] [llvm] [openmp] [Flang] Move builtin .mod generation into runtimes (Reapply #137828) (PR #169638)
Michael Kruse via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Nov 28 13:52:07 PST 2025
https://github.com/Meinersbur updated https://github.com/llvm/llvm-project/pull/169638
>From dc02b15735ffad56dccc8d3b3a0cd13ad552756f Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 25 Nov 2025 23:20:43 +0100
Subject: [PATCH 01/15] Reapply "[Flang] Move builtin .mod generation into
runtimes" (#169489)
This reverts commit 4bc654d6497430c1dd5e4e25aaa84b3dec3e1113.
---
clang/include/clang/Driver/ToolChain.h | 4 +
clang/include/clang/Options/Options.td | 2 +-
clang/lib/Driver/Driver.cpp | 11 +
clang/lib/Driver/ToolChain.cpp | 6 +
clang/lib/Driver/ToolChains/Flang.cpp | 8 +
.../Modules}/GetToolchainDirs.cmake | 11 +
flang-rt/CMakeLists.txt | 97 +-------
flang-rt/cmake/modules/AddFlangRT.cmake | 29 ++-
.../cmake/modules/AddFlangRTOffload.cmake | 14 +-
.../cmake/modules/FlangRTIntrospection.cmake | 37 +++
flang-rt/lib/runtime/CMakeLists.txt | 115 ++++++++-
.../lib/runtime}/__cuda_builtins.f90 | 0
.../lib/runtime}/__cuda_device.f90 | 0
.../lib/runtime}/__fortran_builtins.f90 | 2 +-
.../runtime}/__fortran_ieee_exceptions.f90 | 0
.../lib/runtime}/__fortran_type_info.f90 | 0
.../lib/runtime}/__ppc_intrinsics.f90 | 0
.../lib/runtime}/__ppc_types.f90 | 0
.../lib/runtime}/cooperative_groups.f90 | 1 +
.../lib/runtime}/cudadevice.f90 | 0
.../lib/runtime}/ieee_arithmetic.f90 | 2 +-
.../lib/runtime}/ieee_exceptions.f90 | 0
.../lib/runtime}/ieee_features.f90 | 0
.../lib/runtime}/iso_c_binding.f90 | 0
.../lib/runtime}/iso_fortran_env.f90 | 0
.../lib/runtime}/iso_fortran_env_impl.f90 | 0
.../module => flang-rt/lib/runtime}/mma.f90 | 0
flang-rt/test/lit.site.cfg.py.in | 2 +-
flang-rt/unittests/CMakeLists.txt | 5 +-
flang/CMakeLists.txt | 1 -
.../flang/Frontend/CompilerInvocation.h | 7 +
flang/lib/Frontend/CompilerInvocation.cpp | 26 +-
flang/lib/Semantics/semantics.cpp | 13 +-
flang/module/.clang-format | 1 -
flang/test/CMakeLists.txt | 31 ++-
flang/test/Driver/Inputs/ieee_arithmetic.mod | 1 +
flang/test/Driver/Inputs/iso_fortran_env.mod | 1 +
flang/test/Driver/intrinsic-module-path.F90 | 55 +++++
flang/test/Driver/intrinsic-module-path.f90 | 23 --
flang/test/Driver/lto-fatlto.f90 | 4 +-
flang/test/Driver/pp-fixed-form.f90 | 4 +-
.../Lower/HLFIR/type-bound-call-mismatch.f90 | 2 +-
flang/test/Lower/OpenMP/simd_aarch64.f90 | 7 +-
.../target-enter-data-default-openmp52.f90 | 4 +-
flang/test/Preprocessing/fixed-free.f | 2 +-
flang/test/Preprocessing/no-pp-if.f90 | 2 +-
flang/test/Semantics/bug163242.f90 | 2 +-
flang/test/Semantics/bug164303.f90 | 2 +-
flang/test/lit.cfg.py | 94 +++++++-
flang/test/lit.site.cfg.py.in | 9 +-
flang/tools/CMakeLists.txt | 1 -
flang/tools/bbc/bbc.cpp | 13 +-
flang/tools/f18/CMakeLists.txt | 170 -------------
flang/tools/f18/dump.cpp | 42 ----
llvm/runtimes/CMakeLists.txt | 24 +-
openmp/CMakeLists.txt | 6 +
openmp/runtime/CMakeLists.txt | 8 +-
.../cmake/LibompCheckFortranFlag.cmake | 29 ---
openmp/runtime/cmake/LibompHandleFlags.cmake | 11 -
openmp/runtime/cmake/config-ix.cmake | 4 -
openmp/runtime/src/CMakeLists.txt | 63 ++---
openmp/runtime/test/lit.cfg | 1 +
openmp/runtime/test/lit.site.cfg.in | 1 +
runtimes/CMakeLists.txt | 223 +++++++++++++++++-
64 files changed, 705 insertions(+), 528 deletions(-)
rename {flang-rt/cmake/modules => cmake/Modules}/GetToolchainDirs.cmake (94%)
create mode 100644 flang-rt/cmake/modules/FlangRTIntrospection.cmake
rename {flang/module => flang-rt/lib/runtime}/__cuda_builtins.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/__cuda_device.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/__fortran_builtins.f90 (99%)
rename {flang/module => flang-rt/lib/runtime}/__fortran_ieee_exceptions.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/__fortran_type_info.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/__ppc_intrinsics.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/__ppc_types.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/cooperative_groups.f90 (96%)
rename {flang/module => flang-rt/lib/runtime}/cudadevice.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/ieee_arithmetic.f90 (99%)
rename {flang/module => flang-rt/lib/runtime}/ieee_exceptions.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/ieee_features.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/iso_c_binding.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/iso_fortran_env.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/iso_fortran_env_impl.f90 (100%)
rename {flang/module => flang-rt/lib/runtime}/mma.f90 (100%)
delete mode 100644 flang/module/.clang-format
create mode 100644 flang/test/Driver/intrinsic-module-path.F90
delete mode 100644 flang/test/Driver/intrinsic-module-path.f90
delete mode 100644 flang/tools/f18/CMakeLists.txt
delete mode 100644 flang/tools/f18/dump.cpp
delete mode 100644 openmp/runtime/cmake/LibompCheckFortranFlag.cmake
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 1425714d34110..26af88242eb3e 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -538,6 +538,10 @@ class ToolChain {
// Returns Triple without the OSs version.
llvm::Triple getTripleWithoutOSVersion() const;
+ /// Returns the target-specific path for Flang's intrinsic modules in the
+ /// resource directory if it exists.
+ std::optional<std::string> getDefaultIntrinsicModuleDir() const;
+
// Returns the target specific runtime path if it exists.
std::optional<std::string> getRuntimePath() const;
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index a8fc1c4326cc5..0e88656c5e1bc 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -6082,7 +6082,7 @@ def prebind : Flag<["-"], "prebind">;
def preload : Flag<["-"], "preload">;
def print_file_name_EQ : Joined<["-", "--"], "print-file-name=">,
HelpText<"Print the full library path of <file>">, MetaVarName<"<file>">,
- Visibility<[ClangOption, CLOption]>;
+ Visibility<[ClangOption, FlangOption, CLOption]>;
def print_ivar_layout : Flag<["-"], "print-ivar-layout">,
Visibility<[ClangOption, CC1Option]>,
HelpText<"Enable Objective-C Ivar layout bitmap print trace">,
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index de8d4601210ae..781bc74466da1 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -6602,6 +6602,17 @@ std::string Driver::GetFilePath(StringRef Name, const ToolChain &TC) const {
if (llvm::sys::fs::exists(Twine(P)))
return std::string(P);
+ // With Flang, also look for instrinsic modules
+ if (IsFlangMode()) {
+ if (std::optional<std::string> IntrPath =
+ TC.getDefaultIntrinsicModuleDir()) {
+ SmallString<128> P(*IntrPath);
+ llvm::sys::path::append(P, Name);
+ if (llvm::sys::fs::exists(Twine(P)))
+ return std::string(P);
+ }
+ }
+
SmallString<128> D(Dir);
llvm::sys::path::append(D, "..", Name);
if (llvm::sys::fs::exists(Twine(D)))
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 77a2c73f0d446..f8520725b9b03 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1020,6 +1020,12 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const {
return {};
}
+std::optional<std::string> ToolChain::getDefaultIntrinsicModuleDir() const {
+ SmallString<128> P(D.ResourceDir);
+ llvm::sys::path::append(P, "finclude", "flang");
+ return getTargetSubDirPath(P);
+}
+
std::optional<std::string> ToolChain::getRuntimePath() const {
SmallString<128> P(D.ResourceDir);
llvm::sys::path::append(P, "lib");
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index cc4755cd6a9b0..bac421bb86f49 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -1060,6 +1060,14 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-resource-dir");
CmdArgs.push_back(D.ResourceDir.c_str());
+ // Default intrinsic module dirs must be added after any user-provided
+ // -fintrinsic-modules-path to have lower precedence
+ if (std::optional<std::string> IntrModPath =
+ TC.getDefaultIntrinsicModuleDir()) {
+ CmdArgs.push_back("-fintrinsic-modules-path");
+ CmdArgs.push_back(Args.MakeArgString(*IntrModPath));
+ }
+
// Offloading related options
addOffloadOptions(C, Inputs, JA, Args, CmdArgs);
diff --git a/flang-rt/cmake/modules/GetToolchainDirs.cmake b/cmake/Modules/GetToolchainDirs.cmake
similarity index 94%
rename from flang-rt/cmake/modules/GetToolchainDirs.cmake
rename to cmake/Modules/GetToolchainDirs.cmake
index fba12502b5946..ce2f8c294b2bc 100644
--- a/flang-rt/cmake/modules/GetToolchainDirs.cmake
+++ b/cmake/Modules/GetToolchainDirs.cmake
@@ -47,6 +47,17 @@ function (get_toolchain_library_subdir outvar)
endfunction ()
+# Corresponds to Flang's ToolChain::getDefaultIntrinsicModuleDir().
+function (get_toolchain_module_subdir outvar)
+ set(outval "finclude/flang")
+
+ get_toolchain_arch_dirname(arch_dirname)
+ set(outval "${outval}/${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)
diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index 50b8e834776fb..db0d87d91ea83 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -23,40 +23,6 @@ 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"
@@ -65,69 +31,24 @@ list(APPEND CMAKE_MODULE_PATH
include(AddFlangRT)
include(GetToolchainDirs)
include(FlangCommon)
+include(FlangRTIntrospection)
include(HandleCompilerRT)
include(ExtendPath)
+include(CheckFortranSourceCompiles)
+include(CMakePushCheckState)
############################
# 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_DEFAULT)
-
- 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_DEFAULT "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 ()
-set(FLANG_RT_INSTALL_RESOURCE_PATH "${FLANG_RT_INSTALL_RESOURCE_PATH_DEFAULT}"
- CACHE PATH "Path to install runtime libraries to (default: clang resource dir)")
-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)
-# FIXME: For the libflang_rt.so, the toolchain resource lib dir is not a good
-# destination because it is not a ld.so default search path.
-# The machine where the executable is eventually executed may not be the
-# machine where the Flang compiler and its resource dir is installed, so
-# setting RPath by the driver is not an solution. It should belong into
-# /usr/lib/<triple>/libflang_rt.so, like e.g. libgcc_s.so.
-# But the linker as invoked by the Flang driver also requires
-# libflang_rt.so to be found when linking and the resource lib dir is
-# the only reliable location.
-cmake_path(NORMAL_PATH FLANG_RT_OUTPUT_RESOURCE_LIB_DIR)
-cmake_path(NORMAL_PATH FLANG_RT_INSTALL_RESOURCE_LIB_PATH)
+# Fortran compiler not optional for building Flang-RT
+enable_language(Fortran)
+
+flang_module_fortran_enable()
#################
@@ -234,6 +155,10 @@ check_cxx_source_compiles(
"
HAVE_DECL_STRERROR_S)
+# Look for support of REAL(16), if not already defined via command
+# line via -DFORTRAN_SUPPORTS_REAL16=YES/NO
+check_fortran_quadmath_support()
+
# Search for clang_rt.builtins library. Need in addition to msvcrt.
if (WIN32)
find_compiler_rt_library(builtins FLANG_RT_BUILTINS_LIBRARY)
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index 923507764d691..b3f2cd07c0aed 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -190,6 +190,12 @@ function (add_flangrt_library name)
endif ()
endif ()
+ if (build_object)
+ add_library(${name}.compile ALIAS "${name_object}")
+ else ()
+ add_library(${name}.compile ALIAS "${default_target}")
+ endif ()
+
foreach (tgtname IN LISTS libtargets)
if (NOT WIN32)
# Use same stem name for .a and .so. Common in UNIX environments.
@@ -219,6 +225,17 @@ function (add_flangrt_library name)
# Minimum required C++ version for Flang-RT, even if CMAKE_CXX_STANDARD is defined to something else.
target_compile_features(${tgtname} PRIVATE cxx_std_17)
+ target_compile_options(${tgtname} PRIVATE
+ # Always enable preprocessor regardless of file extention
+ "$<$<COMPILE_LANGUAGE:Fortran>:-cpp>"
+
+ # Missing type descriptors are expected for intrinsic modules
+ "$<$<COMPILE_LANGUAGE:Fortran>:SHELL:-mmlir;SHELL:-ignore-missing-type-desc>"
+
+ # Flang bug workaround: Reformating of cooked token buffer causes identifier to be split between lines
+ "$<$<COMPILE_LANGUAGE:Fortran>:SHELL:-Xflang;SHELL:-fno-reformat>"
+ )
+
# 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.
@@ -226,6 +243,10 @@ function (add_flangrt_library name)
target_compile_options(${tgtname} PRIVATE -fno-lto)
endif ()
+ if (FORTRAN_SUPPORTS_REAL16)
+ target_compile_definitions(${tgtname} PRIVATE FLANG_SUPPORT_R16=1)
+ endif ()
+
# Use compiler-specific options to disable exceptions and RTTI.
if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
target_compile_options(${tgtname} PRIVATE
@@ -344,13 +365,13 @@ function (add_flangrt_library name)
if (ARG_INSTALL_WITH_TOOLCHAIN)
set_target_properties(${tgtname}
PROPERTIES
- ARCHIVE_OUTPUT_DIRECTORY "${FLANG_RT_OUTPUT_RESOURCE_LIB_DIR}"
- LIBRARY_OUTPUT_DIRECTORY "${FLANG_RT_OUTPUT_RESOURCE_LIB_DIR}"
+ ARCHIVE_OUTPUT_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_LIB_DIR}"
+ LIBRARY_OUTPUT_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_LIB_DIR}"
)
install(TARGETS ${tgtname}
- ARCHIVE DESTINATION "${FLANG_RT_INSTALL_RESOURCE_LIB_PATH}"
- LIBRARY DESTINATION "${FLANG_RT_INSTALL_RESOURCE_LIB_PATH}"
+ ARCHIVE DESTINATION "${RUNTIMES_INSTALL_RESOURCE_LIB_PATH}"
+ LIBRARY DESTINATION "${RUNTIMES_INSTALL_RESOURCE_LIB_PATH}"
)
endif ()
diff --git a/flang-rt/cmake/modules/AddFlangRTOffload.cmake b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
index cbc69f3a9656a..4a6f047a86af2 100644
--- a/flang-rt/cmake/modules/AddFlangRTOffload.cmake
+++ b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
@@ -88,16 +88,16 @@ macro(enable_omp_offload_compilation name files)
"${FLANG_RT_DEVICE_ARCHITECTURES}"
)
- set(OMP_COMPILE_OPTIONS
+ set(OMP_COMPILE_OPTIONS $<$<COMPILE_LANGUAGE:C,CXX>:
-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}"
+ >)
+ set_property(SOURCE ${files} APPEND
+ PROPERTY COMPILE_DEFINITIONS ${OMP_COMPILE_OPTIONS}
)
target_link_options(${name}.static PUBLIC ${OMP_COMPILE_OPTIONS})
@@ -105,6 +105,12 @@ macro(enable_omp_offload_compilation name files)
set_source_files_properties(${files}
PROPERTIES COMPILE_DEFINITIONS OMP_OFFLOAD_BUILD
)
+
+ # If building flang-rt together with libomp, ensure that libomp is built first and found because -fopenmp will try to link it.
+ if (TARGET omp)
+ add_dependencies(${name} omp)
+ target_link_options(${name}.static PUBLIC "-L$<TARGET_FILE_DIR:omp>")
+ endif ()
else()
message(FATAL_ERROR
"Flang-rt build with OpenMP offload is not supported for these compilers:\n"
diff --git a/flang-rt/cmake/modules/FlangRTIntrospection.cmake b/flang-rt/cmake/modules/FlangRTIntrospection.cmake
new file mode 100644
index 0000000000000..ddec624e320e7
--- /dev/null
+++ b/flang-rt/cmake/modules/FlangRTIntrospection.cmake
@@ -0,0 +1,37 @@
+#===-- cmake/modules/FlangRTIntrospection.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
+#
+#===------------------------------------------------------------------------===#
+
+
+# Check whether the Fortran compiler supports real(16)/quadmath types
+#
+# Implementation notes:
+# * FORTRAN_SUPPORTS_REAL16 can be set externally in a bootstrapping-runtimes
+# build to ensure consistency of real(16) support between compiler and
+# runtime.
+#
+# * Does not work with Flang and CMake < 3.24
+#
+# * This is intentionally wrapped in a function to get its own namespace for
+# CMAKE_REQUIRED_FLAGS and CMAKE_TRY_COMPILE_TARGET_TYPE. In particular,
+# cmake_pop_check_state() does not reset CMAKE_TRY_COMPILE_TARGET_TYPE,
+# causing later try_compile invocations to fail. If you see
+# enable_language(CUDA) failing because CMAKE_RANLIB is empty, this is the
+# reason.
+function (check_fortran_quadmath_support)
+ cmake_push_check_state(RESET)
+ set(CMAKE_REQUIRED_FLAGS "-ffree-form")
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") # Skip link step
+ check_fortran_source_compiles([[
+ subroutine test_quadmath
+ real(16) :: var1
+ end
+ ]]
+ FORTRAN_SUPPORTS_REAL16
+ )
+ cmake_pop_check_state()
+endfunction ()
diff --git a/flang-rt/lib/runtime/CMakeLists.txt b/flang-rt/lib/runtime/CMakeLists.txt
index e8f70bd544e0b..a678055430233 100644
--- a/flang-rt/lib/runtime/CMakeLists.txt
+++ b/flang-rt/lib/runtime/CMakeLists.txt
@@ -12,6 +12,13 @@ find_package(Backtrace)
set(HAVE_BACKTRACE ${Backtrace_FOUND})
set(BACKTRACE_HEADER ${Backtrace_HEADER})
+# Module sources that are required by other modules
+set(intrinsics_sources
+ __fortran_builtins.f90
+ __cuda_builtins.f90
+)
+
+
# List of files that are buildable for all devices.
set(supported_sources
${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp
@@ -73,7 +80,16 @@ set(supported_sources
# List of source not used for GPU offloading.
set(host_sources
- ${FLANG_SOURCE_DIR}/module/iso_fortran_env_impl.f90
+ __fortran_ieee_exceptions.f90
+ __fortran_type_info.f90
+ iso_fortran_env.f90
+ ieee_arithmetic.f90
+ ieee_exceptions.f90
+ ieee_features.f90
+ iso_c_binding.f90
+ iso_fortran_env_impl.f90
+ iso_fortran_env.f90
+
command.cpp
complex-powi.cpp
complex-reduction.c
@@ -88,8 +104,32 @@ set(host_sources
temporary-stack.cpp
time-intrinsic.cpp
unit-map.cpp
+
+ __cuda_device.f90
+ cooperative_groups.f90
+ cudadevice.f90
)
+if (LLVM_TARGET_TRIPLE MATCHES "^ppc|^powerpc")
+ list(APPEND intrinsics_sources
+ __ppc_types.f90
+ )
+ list(APPEND host_sources
+ __ppc_intrinsics.f90
+ mma.f90
+ )
+endif ()
+
+# Compile as CUDA-Fortran, not directly supported by CMake
+set_property(SOURCE
+ __cuda_device.f90
+ cooperative_groups.f90
+ cudadevice.f90
+ APPEND PROPERTY
+ COMPILE_OPTIONS --offload-host-only -xcuda
+)
+
+
# Sources that can be compiled directly for the GPU.
set(gpu_sources
${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp
@@ -175,19 +215,42 @@ else ()
set(f128_sources "")
endif ()
-if ("${LLVM_RUNTIMES_TARGET}" MATCHES "^amdgcn|^nvptx")
+if (LLVM_RUNTIMES_TARGET MATCHES "^amdgcn|^nvptx")
set(sources ${gpu_sources})
-elseif(FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
- set(sources ${supported_sources})
else ()
set(sources ${supported_sources} ${host_sources} ${f128_sources})
endif ()
+# check-flang depends on this to build intrinsic modules
+if (NOT TARGET flang-rt-mod)
+ add_custom_target(flang-rt-mod)
+endif ()
+
if (NOT WIN32)
+ # CMake ignores intrinsic USE dependencies
+ # CMake has an option Fortran_BUILDING_INSTRINSIC_MODULES/Fortran_BUILDING_INTRINSIC_MODULES
+ # to disable this behavior, unfortunately it does not work with Ninja
+ # (https://gitlab.kitware.com/cmake/cmake/-/issues/26803)
+ # As a workaround, we build those intrinsic modules first such that the main
+ # runtime can depend on it.
+ add_flangrt_library(flang_rt.intrinsics.obj OBJECT
+ ${intrinsics_sources}
+ )
+
+ # This barrier exists to force all of the intrinsic modules of
+ # flang_rt.intrinsics.obj to be built before anything that depends on it.
+ # Without it, CMake/Ninja seem to think that the modules of
+ # flang_rt.intrinsics.obj can be built concurrently to those in
+ # flang_rt.runtime.
+ add_custom_target(flang_rt.intrinsics
+ COMMENT "Intrinsic module dependency barrier"
+ )
+ add_dependencies(flang_rt.intrinsics flang_rt.intrinsics.obj)
+
add_flangrt_library(flang_rt.runtime STATIC SHARED
- ${sources}
- LINK_LIBRARIES ${Backtrace_LIBRARY}
+ ${sources} $<TARGET_OBJECTS:flang_rt.intrinsics.obj>
+ LINK_LIBRARIES flang_rt.intrinsics.obj ${Backtrace_LIBRARY}
INSTALL_WITH_TOOLCHAIN
ADDITIONAL_HEADERS ${public_headers} ${private_headers}
)
@@ -198,6 +261,13 @@ if (NOT WIN32)
# Select a default runtime, which is used for unit and regression tests.
get_target_property(default_target flang_rt.runtime.default ALIASED_TARGET)
add_library(flang_rt.runtime.unittest ALIAS "${default_target}")
+
+ # Select a target that compiles the sources to build the public module files.
+ get_target_property(compile_target flang_rt.runtime.compile ALIASED_TARGET)
+ flang_module_target(flang_rt.intrinsics.obj PUBLIC)
+ flang_module_target(${compile_target} PUBLIC)
+ add_dependencies(${compile_target} flang_rt.intrinsics)
+ add_dependencies(flang-rt-mod flang_rt.intrinsics ${compile_target})
else()
# Target for building all versions of the runtime
add_custom_target(flang_rt.runtime)
@@ -205,12 +275,23 @@ else()
function (add_win_flangrt_runtime libtype suffix msvc_lib)
set(name "flang_rt.runtime.${suffix}")
+
+ add_flangrt_library(${name}.intrinsics.obj OBJECT
+ ${intrinsics_sources}
+ )
+ add_custom_target(${name}.intrinsics
+ COMMAND echo "${name} Dependency barrier"
+ COMMENT "Intrinsic module dependency barrier"
+ )
+ add_dependencies(${name}.intrinsics ${name}.intrinsics.obj)
+
add_flangrt_library(${name} ${libtype}
- ${sources}
+ ${sources} $<TARGET_OBJECTS:${name}.intrinsics.obj>
${ARGN}
- LINK_LIBRARIES ${Backtrace_LIBRARY}
+ LINK_LIBRARIES ${name}.intrinsics.obj ${Backtrace_LIBRARY}
ADDITIONAL_HEADERS ${public_headers} ${private_headers}
)
+ get_target_property(compile_target ${name}.compile ALIASED_TARGET)
if (msvc_lib)
set_target_properties(${name}
@@ -220,11 +301,19 @@ else()
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}"
- )
+ # write a different .mod file. One of them has to be selected to be the
+ # public module that is to be installed. We select the first.
+ if (_has_public_intrinsics)
+ set(is_public "")
+ else ()
+ set(is_public PUBLIC)
+ add_dependencies(flang-rt-mod ${name}.intrinsics ${compile_target})
+ set(_has_public_intrinsics "YES" PARENT_SCOPE)
+ endif ()
+
+ flang_module_target(${name}.intrinsics.obj ${is_public})
+ flang_module_target(${compile_target} ${is_public})
+ add_dependencies(${compile_target} ${name}.intrinsics)
enable_cuda_compilation(${name} "${supported_sources}")
enable_omp_offload_compilation(${name} "${supported_sources}")
diff --git a/flang/module/__cuda_builtins.f90 b/flang-rt/lib/runtime/__cuda_builtins.f90
similarity index 100%
rename from flang/module/__cuda_builtins.f90
rename to flang-rt/lib/runtime/__cuda_builtins.f90
diff --git a/flang/module/__cuda_device.f90 b/flang-rt/lib/runtime/__cuda_device.f90
similarity index 100%
rename from flang/module/__cuda_device.f90
rename to flang-rt/lib/runtime/__cuda_device.f90
diff --git a/flang/module/__fortran_builtins.f90 b/flang-rt/lib/runtime/__fortran_builtins.f90
similarity index 99%
rename from flang/module/__fortran_builtins.f90
rename to flang-rt/lib/runtime/__fortran_builtins.f90
index 4d134fa4b62b1..7bb078c0b428e 100644
--- a/flang/module/__fortran_builtins.f90
+++ b/flang-rt/lib/runtime/__fortran_builtins.f90
@@ -6,7 +6,7 @@
!
!===------------------------------------------------------------------------===!
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../../flang/include/flang/Runtime/magic-numbers.h'
! These naming shenanigans prevent names from Fortran intrinsic modules
! from being usable on INTRINSIC statements, and force the program
diff --git a/flang/module/__fortran_ieee_exceptions.f90 b/flang-rt/lib/runtime/__fortran_ieee_exceptions.f90
similarity index 100%
rename from flang/module/__fortran_ieee_exceptions.f90
rename to flang-rt/lib/runtime/__fortran_ieee_exceptions.f90
diff --git a/flang/module/__fortran_type_info.f90 b/flang-rt/lib/runtime/__fortran_type_info.f90
similarity index 100%
rename from flang/module/__fortran_type_info.f90
rename to flang-rt/lib/runtime/__fortran_type_info.f90
diff --git a/flang/module/__ppc_intrinsics.f90 b/flang-rt/lib/runtime/__ppc_intrinsics.f90
similarity index 100%
rename from flang/module/__ppc_intrinsics.f90
rename to flang-rt/lib/runtime/__ppc_intrinsics.f90
diff --git a/flang/module/__ppc_types.f90 b/flang-rt/lib/runtime/__ppc_types.f90
similarity index 100%
rename from flang/module/__ppc_types.f90
rename to flang-rt/lib/runtime/__ppc_types.f90
diff --git a/flang/module/cooperative_groups.f90 b/flang-rt/lib/runtime/cooperative_groups.f90
similarity index 96%
rename from flang/module/cooperative_groups.f90
rename to flang-rt/lib/runtime/cooperative_groups.f90
index 8bb4af3afa791..5ca0c3aa1f3a5 100644
--- a/flang/module/cooperative_groups.f90
+++ b/flang-rt/lib/runtime/cooperative_groups.f90
@@ -11,6 +11,7 @@
module cooperative_groups
use, intrinsic :: __fortran_builtins, only: c_devptr => __builtin_c_devptr
+use :: cudadevice ! implicit dependency, made explicit for CMake
implicit none
diff --git a/flang/module/cudadevice.f90 b/flang-rt/lib/runtime/cudadevice.f90
similarity index 100%
rename from flang/module/cudadevice.f90
rename to flang-rt/lib/runtime/cudadevice.f90
diff --git a/flang/module/ieee_arithmetic.f90 b/flang-rt/lib/runtime/ieee_arithmetic.f90
similarity index 99%
rename from flang/module/ieee_arithmetic.f90
rename to flang-rt/lib/runtime/ieee_arithmetic.f90
index 4e938a2daaa91..02cfae2dc6b18 100644
--- a/flang/module/ieee_arithmetic.f90
+++ b/flang-rt/lib/runtime/ieee_arithmetic.f90
@@ -8,7 +8,7 @@
! Fortran 2018 Clause 17
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../../flang/include/flang/Runtime/magic-numbers.h'
module ieee_arithmetic
! F18 Clause 17.1p1:
diff --git a/flang/module/ieee_exceptions.f90 b/flang-rt/lib/runtime/ieee_exceptions.f90
similarity index 100%
rename from flang/module/ieee_exceptions.f90
rename to flang-rt/lib/runtime/ieee_exceptions.f90
diff --git a/flang/module/ieee_features.f90 b/flang-rt/lib/runtime/ieee_features.f90
similarity index 100%
rename from flang/module/ieee_features.f90
rename to flang-rt/lib/runtime/ieee_features.f90
diff --git a/flang/module/iso_c_binding.f90 b/flang-rt/lib/runtime/iso_c_binding.f90
similarity index 100%
rename from flang/module/iso_c_binding.f90
rename to flang-rt/lib/runtime/iso_c_binding.f90
diff --git a/flang/module/iso_fortran_env.f90 b/flang-rt/lib/runtime/iso_fortran_env.f90
similarity index 100%
rename from flang/module/iso_fortran_env.f90
rename to flang-rt/lib/runtime/iso_fortran_env.f90
diff --git a/flang/module/iso_fortran_env_impl.f90 b/flang-rt/lib/runtime/iso_fortran_env_impl.f90
similarity index 100%
rename from flang/module/iso_fortran_env_impl.f90
rename to flang-rt/lib/runtime/iso_fortran_env_impl.f90
diff --git a/flang/module/mma.f90 b/flang-rt/lib/runtime/mma.f90
similarity index 100%
rename from flang/module/mma.f90
rename to flang-rt/lib/runtime/mma.f90
diff --git a/flang-rt/test/lit.site.cfg.py.in b/flang-rt/test/lit.site.cfg.py.in
index 662d076b1fe24..0e9dc08b59925 100644
--- a/flang-rt/test/lit.site.cfg.py.in
+++ b/flang-rt/test/lit.site.cfg.py.in
@@ -6,7 +6,7 @@ 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_output_resource_lib_dir = "@RUNTIMES_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@"
diff --git a/flang-rt/unittests/CMakeLists.txt b/flang-rt/unittests/CMakeLists.txt
index e1ab73d7d9301..75b76e93cb56d 100644
--- a/flang-rt/unittests/CMakeLists.txt
+++ b/flang-rt/unittests/CMakeLists.txt
@@ -49,9 +49,8 @@ function(add_flangrt_unittest_offload_properties target)
# 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"
+ set_property(TARGET ${target} APPEND
+ PROPERTY LINK_OPTIONS -fopenmp --offload-arch=native
)
endif()
endfunction()
diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt
index c01eb56d5e496..df38846998b9e 100644
--- a/flang/CMakeLists.txt
+++ b/flang/CMakeLists.txt
@@ -273,7 +273,6 @@ set(FLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
"Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
mark_as_advanced(FLANG_TOOLS_INSTALL_DIR)
-set(FLANG_INTRINSIC_MODULES_DIR ${CMAKE_BINARY_DIR}/include/flang)
set(FLANG_INCLUDE_DIR ${FLANG_BINARY_DIR}/include)
# TODO: Remove when libclangDriver is lifted out of Clang
diff --git a/flang/include/flang/Frontend/CompilerInvocation.h b/flang/include/flang/Frontend/CompilerInvocation.h
index d294955af780e..feaee28a53349 100644
--- a/flang/include/flang/Frontend/CompilerInvocation.h
+++ b/flang/include/flang/Frontend/CompilerInvocation.h
@@ -92,6 +92,10 @@ class CompilerInvocation : public CompilerInvocationBase {
// intrinsic of iso_fortran_env.
std::string allCompilerInvocOpts;
+ /// Location of the resource directory containing files specific to this
+ /// instance/version of Flang.
+ std::string resourceDir;
+
/// Semantic options
// TODO: Merge with or translate to frontendOpts. We shouldn't need two sets
// of options.
@@ -177,6 +181,9 @@ class CompilerInvocation : public CompilerInvocationBase {
getSemanticsCtx(Fortran::parser::AllCookedSources &allCookedSources,
const llvm::TargetMachine &);
+ std::string &getResourceDir() { return resourceDir; }
+ const std::string &getResourceDir() const { return resourceDir; }
+
std::string &getModuleDir() { return moduleDir; }
const std::string &getModuleDir() const { return moduleDir; }
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 0c32f3914e04b..aea46b9d69587 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -885,16 +885,6 @@ static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args,
return diags.getNumErrors() == numErrorsBefore;
}
-// Generate the path to look for intrinsic modules
-static std::string getIntrinsicDir(const char *argv) {
- // TODO: Find a system independent API
- llvm::SmallString<128> driverPath;
- driverPath.assign(llvm::sys::fs::getMainExecutable(argv, nullptr));
- llvm::sys::path::remove_filename(driverPath);
- driverPath.append("/../include/flang/");
- return std::string(driverPath);
-}
-
// Generate the path to look for OpenMP headers
static std::string getOpenMPHeadersDir(const char *argv) {
llvm::SmallString<128> includePath;
@@ -1568,6 +1558,14 @@ bool CompilerInvocation::createFromArgs(
success = false;
}
+ // User-specified or default resource dir
+ if (const llvm::opt::Arg *a =
+ args.getLastArg(clang::options::OPT_resource_dir))
+ invoc.resourceDir = a->getValue();
+ else
+ invoc.resourceDir = clang::driver::Driver::GetResourcesPath(
+ llvm::sys::fs::getMainExecutable(argv0, nullptr));
+
// -flang-experimental-hlfir
if (args.hasArg(clang::options::OPT_flang_experimental_hlfir) ||
args.hasArg(clang::options::OPT_emit_hlfir)) {
@@ -1834,9 +1832,11 @@ void CompilerInvocation::setFortranOpts() {
preprocessorOptions.searchDirectoriesFromIntrModPath.begin(),
preprocessorOptions.searchDirectoriesFromIntrModPath.end());
- // Add the default intrinsic module directory
- fortranOptions.intrinsicModuleDirectories.emplace_back(
- getIntrinsicDir(getArgv0()));
+ // Add the ordered list of -fintrinsic-modules-path
+ fortranOptions.intrinsicModuleDirectories.insert(
+ fortranOptions.intrinsicModuleDirectories.end(),
+ preprocessorOptions.searchDirectoriesFromIntrModPath.begin(),
+ preprocessorOptions.searchDirectoriesFromIntrModPath.end());
// Add the directory supplied through -J/-module-dir to the list of search
// directories
diff --git a/flang/lib/Semantics/semantics.cpp b/flang/lib/Semantics/semantics.cpp
index 2606d997b1cd7..f4b90bf01abe3 100644
--- a/flang/lib/Semantics/semantics.cpp
+++ b/flang/lib/Semantics/semantics.cpp
@@ -621,12 +621,15 @@ bool Semantics::Perform() {
const auto *frontModule{std::get_if<common::Indirection<parser::Module>>(
&program_.v.front().u)};
if (frontModule &&
- (std::get<parser::Statement<parser::ModuleStmt>>(frontModule->value().t)
- .statement.v.source == "__fortran_builtins" ||
- std::get<parser::Statement<parser::ModuleStmt>>(
- frontModule->value().t)
- .statement.v.source == "__ppc_types")) {
+ std::get<parser::Statement<parser::ModuleStmt>>(frontModule->value().t)
+ .statement.v.source == "__fortran_builtins") {
// Don't try to read the builtins module when we're actually building it.
+ } else if (frontModule &&
+ std::get<parser::Statement<parser::ModuleStmt>>(frontModule->value().t)
+ .statement.v.source == "__ppc_types") {
+ // Don't try to read the UsePPCBuiltinTypesModule() we are currently
+ // building, but __fortran_builtins is needed to build it.
+ context_.UseFortranBuiltinsModule();
} else if (frontModule &&
(std::get<parser::Statement<parser::ModuleStmt>>(frontModule->value().t)
.statement.v.source == "__ppc_intrinsics" ||
diff --git a/flang/module/.clang-format b/flang/module/.clang-format
deleted file mode 100644
index e3845288a2aec..0000000000000
--- a/flang/module/.clang-format
+++ /dev/null
@@ -1 +0,0 @@
-DisableFormat: true
diff --git a/flang/test/CMakeLists.txt b/flang/test/CMakeLists.txt
index 8c8e92faa787a..a35f14428ef6f 100644
--- a/flang/test/CMakeLists.txt
+++ b/flang/test/CMakeLists.txt
@@ -2,11 +2,31 @@
# for use by Lit, and delegates to LLVM's lit test handlers.
add_subdirectory(lib)
+set(FLANG_TEST_Fortran_FLAGS "" CACHE STRING "Additional Fortran flags for running tests, such as -fintrinsic-modules-path=<path>")
+
+if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
+ set(FLANG_TEST_ENABLE_MODULES_default ON)
+else ()
+ set(FLANG_TEST_ENABLE_MODULES_default OFF)
+endif ()
+option(FLANG_TEST_ENABLE_MODULES "Force-enable tests that require intrinsic modules from Flang-RT" "${FLANG_TEST_ENABLE_MODULES_default}")
+
+
+if ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES AND FLANG_TEST_ENABLE_MODULES AND NOT FLANG_STANDALONE_BUILD)
+ set(FLANG_TEST_ENABLE_OPENMP_default ON)
+else ()
+ set(FLANG_TEST_ENABLE_OPENMP_default OFF)
+endif ()
+option(FLANG_TEST_ENABLE_OPENMP "Force-enable tests that require modules from OpenMP" "${FLANG_TEST_ENABLE_OPENMP_default}")
+
+
llvm_canonicalize_cmake_booleans(
FLANG_STANDALONE_BUILD
LLVM_BUILD_EXAMPLES
LLVM_BYE_LINK_INTO_TOOLS
LLVM_ENABLE_PLUGINS
+ FLANG_TEST_ENABLE_MODULES
+ FLANG_TEST_ENABLE_OPENMP
)
set(FLANG_TOOLS_DIR ${FLANG_BINARY_DIR}/bin)
@@ -59,7 +79,6 @@ set(FLANG_TEST_PARAMS
set(FLANG_TEST_DEPENDS
flang
- module_files
fir-opt
tco
bbc
@@ -101,8 +120,14 @@ if (LLVM_BUILD_EXAMPLES)
)
endif ()
-if ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES AND NOT FLANG_STANDALONE_BUILD)
- list(APPEND FLANG_TEST_DEPENDS "libomp-mod")
+if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES AND NOT FLANG_STANDALONE_BUILD)
+ # For intrinsic module files (in flang-rt/)
+ list(APPEND FLANG_TEST_DEPENDS "flang-rt-mod")
+
+ if ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
+ # For omplib.mod and omplib_kinds.mod (in openmp/)
+ list(APPEND FLANG_TEST_DEPENDS "libomp-mod")
+ endif ()
endif ()
add_custom_target(flang-test-depends DEPENDS ${FLANG_TEST_DEPENDS})
diff --git a/flang/test/Driver/Inputs/ieee_arithmetic.mod b/flang/test/Driver/Inputs/ieee_arithmetic.mod
index 30fd57801970b..264ff8d035628 100644
--- a/flang/test/Driver/Inputs/ieee_arithmetic.mod
+++ b/flang/test/Driver/Inputs/ieee_arithmetic.mod
@@ -1,5 +1,6 @@
! DUMMY module
! Added for testing purposes. The contents of this file are currently not relevant.
+! Using this file will cause an error because of missing checksum
module ieee_arithmetic
type::ieee_round_type
integer(1),private::mode=0_1
diff --git a/flang/test/Driver/Inputs/iso_fortran_env.mod b/flang/test/Driver/Inputs/iso_fortran_env.mod
index 689297d52027b..c53375d78dec5 100644
--- a/flang/test/Driver/Inputs/iso_fortran_env.mod
+++ b/flang/test/Driver/Inputs/iso_fortran_env.mod
@@ -1,5 +1,6 @@
! DUMMY module
! Added for testing purposes. The contents of this file are currently not relevant.
+! Using this file will cause an error because of missing checksum
module iso_fortran_env
use __fortran_builtins,only:event_type=>__builtin_event_type
use __fortran_builtins,only:lock_type=>__builtin_lock_type
diff --git a/flang/test/Driver/intrinsic-module-path.F90 b/flang/test/Driver/intrinsic-module-path.F90
new file mode 100644
index 0000000000000..3317eb776f0a1
--- /dev/null
+++ b/flang/test/Driver/intrinsic-module-path.F90
@@ -0,0 +1,55 @@
+! Ensure argument -fintrinsic-modules-path works as expected.
+
+!-----------------------------------------
+! FLANG DRIVER
+!-----------------------------------------
+! NOTE: Depending on how Flang is built, the default intrinsics may have higher
+! or lower priority than -fintrinsic-modules-path added here. Using
+! basictestmoduleone.mod from Inputs/module-dir/ will trigger an error.
+
+! RUN: %flang -fsyntax-only -### %s 2>&1 | FileCheck %s --check-prefix=DEFAULTPATH
+
+! RUN: %flang -fsyntax-only -DINTRINSICS_DEFAULT %s
+! RUN: not %flang -fsyntax-only -DINTRINSICS_INPUTONE %s 2>&1 | FileCheck %s --check-prefix=NOINPUTONE
+! RUN: not %flang -fsyntax-only -DINTRINSICS_INPUTTWO %s 2>&1 | FileCheck %s --check-prefix=NOINPUTTWO
+! RUN: %flang -fsyntax-only -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ %s
+! RUN: %flang -fsyntax-only -DINTRINSICS_INPUTONE -fintrinsic-modules-path=%S/Inputs/ %s
+! RUN: %flang -fsyntax-only -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/ -fintrinsic-modules-path=%S/Inputs/module-dir/ %s
+! RUN: not %flang -fsyntax-only -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir/ -fintrinsic-modules-path=%S/Inputs/ %s 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE
+
+
+!-----------------------------------------
+! FLANG FRONTEND (flang -fc1)
+!-----------------------------------------
+! NOTE: %flang_cc1 the default intrinsics path always has higher priority than
+! -fintrinsic-modules-path added here. Accidentally using
+! ieee_arithmetic/iso_fortran_env from the Inputs/ directory will trigger
+! an error (e.g. when the default intrinsics dir is empty).
+
+! RUN: %flang_fc1 -fsyntax-only -DINTRINSICS_DEFAULT %s
+! RUN: not %flang_fc1 -fsyntax-only -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE %s 2>&1 | FileCheck %s --check-prefix=NOINPUTONE
+! RUN: not %flang_fc1 -fsyntax-only -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO %s 2>&1 | FileCheck %s --check-prefix=NOINPUTTWO
+! RUN: %flang_fc1 -fsyntax-only -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir %s
+! RUN: %flang_fc1 -fsyntax-only -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -fintrinsic-modules-path=%S/Inputs/ %s
+! RUN: %flang_fc1 -fsyntax-only -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/ -fintrinsic-modules-path=%S/Inputs/module-dir/ %s
+! RUN: not %flang_fc1 -fsyntax-only -DINTRINSICS_DEFAULT -DINTRINSICS_INPUTONE -DINTRINSICS_INPUTTWO -fintrinsic-modules-path=%S/Inputs/module-dir -fintrinsic-modules-path=%S/Inputs/ %s 2>&1 | FileCheck %s --check-prefix=WRONGINPUTONE
+
+
+! DEFAULTPATH: flang{{.*}}-fc1{{.*}}-fintrinsic-modules-path
+
+! NOINPUTONE: Source file 'basictestmoduleone.mod' was not found
+! NOINPUTTWO: Source file 'basictestmoduletwo.mod' was not found
+! WRONGINPUTONE: 't1' not found in module 'basictestmoduleone'
+
+program test_intrinsic_module_path
+#ifdef INTRINSICS_DEFAULT
+ use ieee_arithmetic, only: ieee_round_type
+ use iso_fortran_env, only: team_type, event_type, lock_type
+#endif
+#ifdef INTRINSICS_INPUTONE
+ use basictestmoduleone, only: t1
+#endif
+#ifdef INTRINSICS_INPUTTWO
+ use basictestmoduletwo, only: t2
+#endif
+end program
diff --git a/flang/test/Driver/intrinsic-module-path.f90 b/flang/test/Driver/intrinsic-module-path.f90
deleted file mode 100644
index 615d8f9a1730a..0000000000000
--- a/flang/test/Driver/intrinsic-module-path.f90
+++ /dev/null
@@ -1,23 +0,0 @@
-! Ensure argument -fintrinsic-modules-path works as expected.
-! WITHOUT the option, the default location for the module is checked and no error generated.
-! With the option GIVEN, the module with the same name is PREPENDED, and considered over the
-! default one, causing a CHECKSUM error.
-
-!-----------------------------------------
-! FRONTEND FLANG DRIVER (flang -fc1)
-!-----------------------------------------
-! RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck %s --allow-empty --check-prefix=WITHOUT
-! RUN: not %flang_fc1 -fsyntax-only -fintrinsic-modules-path %S/Inputs/ %s 2>&1 | FileCheck %s --check-prefix=GIVEN
-! RUN: not %flang_fc1 -fsyntax-only -fintrinsic-modules-path=%S/Inputs/ %s 2>&1 | FileCheck %s --check-prefix=GIVEN
-
-! WITHOUT-NOT: 'ieee_arithmetic.mod' was not found
-! WITHOUT-NOT: 'iso_fortran_env.mod' was not found
-
-! GIVEN: error: Cannot use module file for module 'ieee_arithmetic': File has invalid checksum
-! GIVEN: error: Cannot use module file for module 'iso_fortran_env': File has invalid checksum
-
-
-program test_intrinsic_module_path
- use ieee_arithmetic, only: ieee_round_type
- use iso_fortran_env, only: team_type, event_type, lock_type
-end program
diff --git a/flang/test/Driver/lto-fatlto.f90 b/flang/test/Driver/lto-fatlto.f90
index 2ea251eafacbf..9adf264f114dc 100644
--- a/flang/test/Driver/lto-fatlto.f90
+++ b/flang/test/Driver/lto-fatlto.f90
@@ -1,7 +1,7 @@
! REQUIRES: x86-registered-target
! checks fatlto objects: that valid bitcode is included in the object file generated.
-! RUN: %flang -fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -emit-obj %s -o %t.o
+! RUN: %flang_fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -emit-obj %s -o %t.o
! RUN: llvm-readelf -S %t.o | FileCheck %s --check-prefixes=ELF
! RUN: llvm-objcopy --dump-section=.llvm.lto=%t.bc %t.o
! RUN: llvm-dis %t.bc -o - | FileCheck %s --check-prefixes=DIS
@@ -11,7 +11,7 @@
! DIS-NEXT: ret void
! DIS-NEXT: }
-! RUN: %flang -fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -S %s -o - | FileCheck %s --check-prefixes=ASM
+! RUN: %flang_fc1 -triple x86_64-unknown-linux-gnu -flto -ffat-lto-objects -S %s -o - | FileCheck %s --check-prefixes=ASM
! ASM: .section .llvm.lto,"e", at llvm_lto
! ASM-NEXT: .Lllvm.embedded.object:
diff --git a/flang/test/Driver/pp-fixed-form.f90 b/flang/test/Driver/pp-fixed-form.f90
index bb869cd3341a7..fb9e1dd0d1e6b 100644
--- a/flang/test/Driver/pp-fixed-form.f90
+++ b/flang/test/Driver/pp-fixed-form.f90
@@ -8,12 +8,12 @@
!RUN: %flang -save-temps -### -ffree-form %S/Inputs/free-form-test.f90 2>&1 | FileCheck %s --check-prefix=FREE-FLAG
FREE-FLAG: "-fc1" {{.*}} "-o" "free-form-test.i" {{.*}} "-x" "f95" "{{.*}}/free-form-test.f90"
-FREE-FLAG-NEXT: "-fc1" {{.*}} "-emit-llvm-bc" "-ffree-form"
+FREE-FLAG-NEXT: "-fc1" {{.*}} "-emit-llvm-bc" {{.*}}"-ffree-form"
FREE-FLAG-NOT: "-ffixed-form"
FREE-FLAG-SAME: "-x" "f95-cpp-input" "free-form-test.i"
!RUN: %flang -save-temps -### -ffixed-form %S/Inputs/fixed-form-test.f 2>&1 | FileCheck %s --check-prefix=FIXED-FLAG
FIXED-FLAG: "-fc1" {{.*}} "-o" "fixed-form-test.i" {{.*}} "-x" "f95" "{{.*}}/fixed-form-test.f"
-FIXED-FLAG-NEXT: "-fc1" {{.*}} "-emit-llvm-bc" "-ffixed-form"
+FIXED-FLAG-NEXT: "-fc1" {{.*}} "-emit-llvm-bc" {{.*}}"-ffixed-form"
FIXED-FLAG-NOT: "-ffixed-form"
FIXED-FLAG-SAME: "-x" "f95-cpp-input" "fixed-form-test.i"
diff --git a/flang/test/Lower/HLFIR/type-bound-call-mismatch.f90 b/flang/test/Lower/HLFIR/type-bound-call-mismatch.f90
index 2e0c72ccfe048..29a9784b984b6 100644
--- a/flang/test/Lower/HLFIR/type-bound-call-mismatch.f90
+++ b/flang/test/Lower/HLFIR/type-bound-call-mismatch.f90
@@ -1,6 +1,6 @@
! Test interface that lowering handles small interface mismatch with
! type bound procedures.
-! RUN: bbc -emit-hlfir %s -o - -I nw | FileCheck %s
+! RUN: %bbc_bare -emit-hlfir %s -o - -I nw | FileCheck %s
module dispatch_mismatch
type t
diff --git a/flang/test/Lower/OpenMP/simd_aarch64.f90 b/flang/test/Lower/OpenMP/simd_aarch64.f90
index 735237223bcb5..2e4136273c75b 100644
--- a/flang/test/Lower/OpenMP/simd_aarch64.f90
+++ b/flang/test/Lower/OpenMP/simd_aarch64.f90
@@ -1,6 +1,11 @@
-! Tests for 2.9.3.1 Simd and target dependent defult alignment for AArch64
+! Tests for 2.9.3.1 Simd and target dependent default alignment for AArch64
! The default alignment for AARCH64 is 0 so we do not emit aligned clause
! REQUIRES: aarch64-registered-target
+
+! Requires aarch64 iso_c_binding.mod which currently is only available if your host is also aarch64
+! FIXME: Make flang a cross-compiler
+! UNSUPPORTED: true
+
! RUN: %flang_fc1 -triple aarch64-unknown-linux-gnu -emit-hlfir -fopenmp %s -o - | FileCheck %s
subroutine simdloop_aligned_cptr(A)
use iso_c_binding
diff --git a/flang/test/Lower/OpenMP/target-enter-data-default-openmp52.f90 b/flang/test/Lower/OpenMP/target-enter-data-default-openmp52.f90
index 5f7c31bb931f6..d7785ae68bb16 100644
--- a/flang/test/Lower/OpenMP/target-enter-data-default-openmp52.f90
+++ b/flang/test/Lower/OpenMP/target-enter-data-default-openmp52.f90
@@ -1,7 +1,7 @@
! This test checks the lowering and application of default map types for the target enter/exit data constructs and map clauses
-!RUN: %flang -fc1 -emit-fir -fopenmp -fopenmp-version=52 -o - %s | FileCheck %s --check-prefix=CHECK-52
-!RUN: not %flang -fc1 -emit-fir -fopenmp -fopenmp-version=51 -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-51
+!RUN: %flang_fc1 -emit-fir -fopenmp -fopenmp-version=52 -o - %s | FileCheck %s --check-prefix=CHECK-52
+!RUN: not %flang_fc1 -emit-fir -fopenmp -fopenmp-version=51 -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-51
module test
real, allocatable :: A
diff --git a/flang/test/Preprocessing/fixed-free.f b/flang/test/Preprocessing/fixed-free.f
index 95f63a4d71e4c..7140bc6aec360 100644
--- a/flang/test/Preprocessing/fixed-free.f
+++ b/flang/test/Preprocessing/fixed-free.f
@@ -1,5 +1,5 @@
!RUN: %flang -E %s 2>&1 | FileCheck %s
-!RUN: %flang -fc1 -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
+!RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
!CHECK-NOT: dir$
!CHECK-NOT: error:
!dir$ fixed
diff --git a/flang/test/Preprocessing/no-pp-if.f90 b/flang/test/Preprocessing/no-pp-if.f90
index 3e49df3deb251..ab08a4f838a90 100644
--- a/flang/test/Preprocessing/no-pp-if.f90
+++ b/flang/test/Preprocessing/no-pp-if.f90
@@ -1,4 +1,4 @@
-!RUN: %flang -fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
+!RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
!CHECK-NOT: ERROR STOP
!CHECK: CONTINUE
#if defined UNDEFINED
diff --git a/flang/test/Semantics/bug163242.f90 b/flang/test/Semantics/bug163242.f90
index 5e020aeb4dc0d..3c0a2b6b32229 100644
--- a/flang/test/Semantics/bug163242.f90
+++ b/flang/test/Semantics/bug163242.f90
@@ -1,4 +1,4 @@
-!RUN: %flang -fc1 -fsyntax-only %s | FileCheck --allow-empty %s
+!RUN: %flang_fc1 -fsyntax-only %s | FileCheck --allow-empty %s
!CHECK-NOT: error:
character(0), allocatable :: ch
allocate(character(-1) :: ch)
diff --git a/flang/test/Semantics/bug164303.f90 b/flang/test/Semantics/bug164303.f90
index c356c07392577..39af27e914248 100644
--- a/flang/test/Semantics/bug164303.f90
+++ b/flang/test/Semantics/bug164303.f90
@@ -1,4 +1,4 @@
-!RUN: %flang -fc1 -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
+!RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s
module foo_mod
use, intrinsic :: iso_fortran_env
use, intrinsic :: iso_c_binding
diff --git a/flang/test/lit.cfg.py b/flang/test/lit.cfg.py
index 4221354df34a2..c3050dc876ec7 100644
--- a/flang/test/lit.cfg.py
+++ b/flang/test/lit.cfg.py
@@ -139,18 +139,95 @@
if config.default_sysroot:
config.available_features.add("default_sysroot")
+
+flang_exe = lit.util.which("flang", config.flang_llvm_tools_dir)
+if not flang_exe:
+ lit_config.fatal(f"Could not identify flang executable")
+
+# Intrinsic paths that are added implicitly by the `flang` driver, but have to be added manually when invoking the frontend `flang -fc1`.
+flang_driver_search_args = []
+
+# Intrinsic paths that are added to `flang` as well as `flang -fc1`.
+flang_extra_search_args = list(config.flang_test_fortran_flags)
+
+
+def get_resource_module_intrinsic_dir(modfile):
+ # Determine the intrinsic module search path that is added by the driver. If
+ # skipping the driver using -fc1, we need to append the path manually.
+ flang_intrinsics_dir = subprocess.check_output(
+ [flang_exe, *config.flang_test_fortran_flags, f"-print-file-name={modfile}"],
+ text=True,
+ ).strip()
+ flang_intrinsics_dir = os.path.dirname(flang_intrinsics_dir)
+ return flang_intrinsics_dir or None
+
+
+intrinsics_mod_path = get_resource_module_intrinsic_dir("__fortran_builtins.mod")
+if intrinsics_mod_path:
+ flang_driver_search_args += [f"-fintrinsic-modules-path={intrinsics_mod_path}"]
+
+openmp_mod_path = get_resource_module_intrinsic_dir("omp_lib.mod")
+if openmp_mod_path and openmp_mod_path != intrinsics_mod_path:
+ flang_driver_search_args += [f"-fintrinsic-modules-path={openmp_mod_path}"]
+
+
+# If intrinsic modules are not available, disable tests unless they are marked as 'module-independent'.
+config.available_features.add("module-independent")
+if config.flang_test_enable_modules or intrinsics_mod_path:
+ config.available_features.add("flangrt-modules")
+else:
+ lit_config.warning(
+ f"Intrinsic modules not in driver default paths: disabling most tests; Use FLANG_TEST_ENABLE_MODULES=ON to force-enable"
+ )
+ config.limit_to_features.add("module-independent")
+
+# Determine if OpenMP runtime was built (enable OpenMP tests via REQUIRES in test file)
+if config.flang_test_enable_openmp or openmp_mod_path:
+ config.available_features.add("openmp_runtime")
+
+ # Search path for omp_lib.h with LLVM_ENABLE_RUNTIMES=openmp
+ # FIXME: openmp should write this file into the resource directory
+ flang_extra_search_args += [
+ "-I",
+ f"{config.flang_obj_root}/../../runtimes/runtimes-bins/openmp/runtime/src",
+ ]
+else:
+ lit_config.warning(
+ f"OpenMP modules found not in driver default paths: OpenMP tests disabled; Use FLANG_TEST_ENABLE_OPENMP=ON to force-enable"
+ )
+
+
+lit_config.note(f"using flang: {flang_exe}")
+lit_config.note(
+ f"using flang implicit search paths: {' '.join(flang_driver_search_args)}"
+)
+lit_config.note(f"using flang extra search paths: {' '.join(flang_extra_search_args)}")
+
# For each occurrence of a flang tool name, replace it with the full path to
# the build directory holding that tool.
tools = [
+ ToolSubst(
+ "bbc",
+ command=FindTool("bbc"),
+ extra_args=flang_driver_search_args + flang_extra_search_args,
+ unresolved="fatal",
+ ),
ToolSubst(
"%flang",
- command=FindTool("flang"),
+ command=flang_exe,
+ extra_args=flang_extra_search_args,
unresolved="fatal",
),
ToolSubst(
"%flang_fc1",
- command=FindTool("flang"),
- extra_args=["-fc1"],
+ command=flang_exe,
+ extra_args=["-fc1"] + flang_driver_search_args + flang_extra_search_args,
+ unresolved="fatal",
+ ),
+ # Variant that does not implicitly add intrinsic search paths
+ ToolSubst(
+ "%bbc_bare",
+ command=FindTool("bbc"),
unresolved="fatal",
),
]
@@ -193,16 +270,7 @@
if result:
config.environment["LIBPGMATH"] = True
-# Determine if OpenMP runtime was built (enable OpenMP tests via REQUIRES in test file)
-openmp_flags_substitution = "-fopenmp"
-if config.have_openmp_rtl:
- config.available_features.add("openmp_runtime")
- # For the enabled OpenMP tests, add a substitution that is needed in the tests to find
- # the omp_lib.{h,mod} files, depending on whether the OpenMP runtime was built as a
- # project or runtime.
- if config.openmp_module_dir:
- openmp_flags_substitution += f" -J {config.openmp_module_dir}"
-config.substitutions.append(("%openmp_flags", openmp_flags_substitution))
+config.substitutions.append(("%openmp_flags", "-fopenmp"))
# Add features and substitutions to test F128 math support.
# %f128-lib substitution may be used to generate check prefixes
diff --git a/flang/test/lit.site.cfg.py.in b/flang/test/lit.site.cfg.py.in
index cc1f4fa6cc9c5..25f2a88d068d7 100644
--- a/flang/test/lit.site.cfg.py.in
+++ b/flang/test/lit.site.cfg.py.in
@@ -13,10 +13,12 @@ config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@"
config.errc_messages = "@LLVM_LIT_ERRC_MESSAGES@"
config.flang_obj_root = "@FLANG_BINARY_DIR@"
config.flang_tools_dir = lit_config.substitute("@FLANG_TOOLS_DIR@")
-config.flang_intrinsic_modules_dir = "@FLANG_INTRINSIC_MODULES_DIR@"
config.flang_headers_dir = "@HEADER_BINARY_DIR@"
config.flang_llvm_tools_dir = "@CMAKE_BINARY_DIR@/bin"
config.flang_test_triple = "@FLANG_TEST_TARGET_TRIPLE@"
+config.flang_test_fortran_flags = "@FLANG_TEST_Fortran_FLAGS@".split()
+config.flang_test_enable_modules = @FLANG_TEST_ENABLE_MODULES@
+config.flang_test_enable_openmp = @FLANG_TEST_ENABLE_OPENMP@
config.flang_examples = @LLVM_BUILD_EXAMPLES@
config.python_executable = "@PYTHON_EXECUTABLE@"
config.flang_standalone_build = @FLANG_STANDALONE_BUILD@
@@ -25,11 +27,6 @@ config.linked_bye_extension = @LLVM_BYE_LINK_INTO_TOOLS@
config.osx_sysroot = path(r"@CMAKE_OSX_SYSROOT@")
config.targets_to_build = "@TARGETS_TO_BUILD@"
config.default_sysroot = "@DEFAULT_SYSROOT@"
-config.have_openmp_rtl = ("@LLVM_TOOL_OPENMP_BUILD@" == "TRUE") or ("openmp" in "@LLVM_ENABLE_RUNTIMES@".lower().split(";"))
-if "openmp" in "@LLVM_ENABLE_RUNTIMES@".lower().split(";"):
- config.openmp_module_dir = "@CMAKE_BINARY_DIR@/runtimes/runtimes-bins/openmp/runtime/src"
-else:
- config.openmp_module_dir = None
config.flang_runtime_f128_math_lib = "@FLANG_RUNTIME_F128_MATH_LIB@"
config.have_ldbl_mant_dig_113 = "@HAVE_LDBL_MANT_DIG_113@"
diff --git a/flang/tools/CMakeLists.txt b/flang/tools/CMakeLists.txt
index 1d2d2c608faf9..1b297af74cae7 100644
--- a/flang/tools/CMakeLists.txt
+++ b/flang/tools/CMakeLists.txt
@@ -7,7 +7,6 @@
#===------------------------------------------------------------------------===#
add_subdirectory(bbc)
-add_subdirectory(f18)
add_subdirectory(flang-driver)
add_subdirectory(tco)
add_subdirectory(f18-parse-demo)
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index 8b12da3a7b50a..ab35fb3af6c2a 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -98,6 +98,11 @@ static llvm::cl::alias
llvm::cl::desc("intrinsic module directory"),
llvm::cl::aliasopt(intrinsicIncludeDirs));
+static llvm::cl::alias
+ intrinsicModulePath("fintrinsic-modules-path",
+ llvm::cl::desc("intrinsic module search paths"),
+ llvm::cl::aliasopt(intrinsicIncludeDirs));
+
static llvm::cl::opt<std::string>
moduleDir("module", llvm::cl::desc("module output directory (default .)"),
llvm::cl::init("."));
@@ -574,14 +579,6 @@ int main(int argc, char **argv) {
if (includeDirs.size() == 0) {
includeDirs.push_back(".");
- // Default Fortran modules should be installed in include/flang (a sibling
- // to the bin) directory.
- intrinsicIncludeDirs.push_back(
- llvm::sys::path::parent_path(
- llvm::sys::path::parent_path(
- llvm::sys::fs::getMainExecutable(argv[0], nullptr)))
- .str() +
- "/include/flang");
}
Fortran::parser::Options options;
diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt
deleted file mode 100644
index 715992c756c4b..0000000000000
--- a/flang/tools/f18/CMakeLists.txt
+++ /dev/null
@@ -1,170 +0,0 @@
-set(LLVM_LINK_COMPONENTS
- FrontendOpenACC
- FrontendOpenMP
- Support
- )
-
-# Define the list of Fortran module files for which it is
-# sufficient to generate the module file via -fsyntax-only.
-set(MODULES
- "__fortran_builtins"
- "__fortran_ieee_exceptions"
- "__fortran_type_info"
- "__ppc_types"
- "__ppc_intrinsics"
- "mma"
- "__cuda_builtins"
- "__cuda_device"
- "cooperative_groups"
- "cudadevice"
- "ieee_arithmetic"
- "ieee_exceptions"
- "ieee_features"
- "iso_c_binding"
- "iso_fortran_env"
- "iso_fortran_env_impl"
-)
-
-# 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)
-
-# Figure out whether we can support REAL(KIND=16)
-if (FLANG_RUNTIME_F128_MATH_LIB)
- set(FLANG_SUPPORT_R16 "1")
-elseif (HAVE_LDBL_MANT_DIG_113)
- set(FLANG_SUPPORT_R16 "1")
-else()
- set(FLANG_SUPPORT_R16 "0")
-endif()
-
-# Init variable to hold extra object files coming from the Fortran modules;
-# these module files will be contributed from the CMakeLists in flang/tools/f18.
-set(module_objects "")
-
-# Create module files directly from the top-level module source directory.
-# If CMAKE_CROSSCOMPILING, then the newly built flang executable was
-# cross compiled, and thus can't be executed on the build system and thus
-# can't be used for generating module files.
-if (NOT CMAKE_CROSSCOMPILING)
- foreach(filename ${MODULES})
- set(depends "")
- set(opts "")
- if(${filename} STREQUAL "__fortran_builtins" OR
- ${filename} STREQUAL "__ppc_types")
- elseif(${filename} STREQUAL "__ppc_intrinsics" OR
- ${filename} STREQUAL "mma")
- set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__ppc_types.mod)
- elseif(${filename} STREQUAL "__cuda_device" OR
- ${filename} STREQUAL "cudadevice" OR
- ${filename} STREQUAL "cooperative_groups")
- set(opts -fc1 -xcuda)
- if(${filename} STREQUAL "__cuda_device")
- set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__cuda_builtins.mod)
- elseif(${filename} STREQUAL "cudadevice")
- set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__cuda_device.mod)
- elseif(${filename} STREQUAL "cooperative_groups")
- set(depends ${FLANG_INTRINSIC_MODULES_DIR}/cudadevice.mod)
- endif()
- else()
- set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_builtins.mod)
- if(${filename} STREQUAL "iso_fortran_env")
- set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/iso_fortran_env_impl.mod)
- endif()
- if(${filename} STREQUAL "ieee_arithmetic" OR
- ${filename} STREQUAL "ieee_exceptions")
- set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_ieee_exceptions.mod)
- endif()
- endif()
- if(NOT ${filename} STREQUAL "__fortran_type_info" AND NOT ${filename} STREQUAL "__fortran_builtins")
- set(depends ${depends} ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_type_info.mod)
- endif()
-
- # The module contains PPC vector types that needs the PPC target.
- if(${filename} STREQUAL "__ppc_intrinsics" OR
- ${filename} STREQUAL "mma")
- if (PowerPC IN_LIST LLVM_TARGETS_TO_BUILD)
- set(opts "--target=ppc64le")
- else()
- # Do not compile PPC module if the target is not available.
- continue()
- endif()
- endif()
-
- set(decls "")
- if (FLANG_SUPPORT_R16)
- set(decls "-DFLANG_SUPPORT_R16")
- endif()
-
- # Some modules have an implementation part that needs to be added to the
- # flang_rt.runtime library.
- set(compile_with "-fsyntax-only")
- set(object_output "")
- set(include_in_link FALSE)
-
- set(base ${FLANG_INTRINSIC_MODULES_DIR}/${filename})
- # TODO: We may need to flag this with conditional, in case Flang is built w/o OpenMP support
- add_custom_command(OUTPUT ${base}.mod ${object_output}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
- COMMAND flang ${opts} ${decls} -cpp ${compile_with} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
- ${FLANG_SOURCE_DIR}/module/${filename}.f90
- DEPENDS flang ${FLANG_SOURCE_DIR}/module/${filename}.f90 ${FLANG_SOURCE_DIR}/module/__fortran_builtins.f90 ${depends}
- )
- list(APPEND MODULE_FILES ${base}.mod)
- install(FILES ${base}.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang" COMPONENT flang-module-interfaces)
-
- # If a module has been compiled into an object file, add the file to
- # the link line for the flang_rt.runtime library.
- if(include_in_link)
- list(APPEND module_objects ${object_output})
- endif()
- endforeach()
-
- # Set a CACHE variable that is visible to the CMakeLists.txt in runtime/, so that
- # the compiled Fortran modules can be added to the link line of the flang_rt.runtime
- # library.
- set(FORTRAN_MODULE_OBJECTS ${module_objects} CACHE INTERNAL "" FORCE)
-
- # Special case for omp_lib.mod, because its source comes from openmp/runtime/src/include.
- # It also produces two module files: omp_lib.mod and omp_lib_kinds.mod. Compile these
- # files only if OpenMP support has been configured.
- if (LLVM_TOOL_OPENMP_BUILD)
- message(STATUS "OpenMP runtime support enabled via LLVM_ENABLE_PROJECTS, building omp_lib.mod")
- set(base ${FLANG_INTRINSIC_MODULES_DIR}/omp_lib)
- add_custom_command(OUTPUT ${base}.mod ${base}_kinds.mod
- COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}
- COMMAND flang -cpp -fsyntax-only ${opts} -module-dir ${FLANG_INTRINSIC_MODULES_DIR}
- ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90
- DEPENDS flang ${FLANG_INTRINSIC_MODULES_DIR}/iso_c_binding.mod ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.F90 ${depends}
- )
- list(APPEND MODULE_FILES ${base}.mod ${base}_kinds.mod)
- install(FILES ${base}.mod ${base}_kinds.mod DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang" COMPONENT flang-module-interfaces)
- elseif ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
- message(STATUS "OpenMP runtime support enabled via LLVM_ENABLE_RUNTIMES, assuming omp_lib.mod is built there")
- else()
- message(WARNING "Not building omp_lib.mod, no OpenMP runtime in either LLVM_ENABLE_PROJECTS or LLVM_ENABLE_RUNTIMES")
- endif()
- add_llvm_install_targets(install-flang-module-interfaces
- COMPONENT flang-module-interfaces)
-endif()
-
-add_custom_target(module_files ALL DEPENDS ${MODULE_FILES})
-set_target_properties(module_files PROPERTIES FOLDER "Flang/Resources")
-
-# TODO Move this to a more suitable location
-# Copy the generated omp_lib.h header file, if OpenMP support has been configured.
-if (LLVM_TOOL_OPENMP_BUILD)
- message(STATUS "OpenMP runtime support enabled via LLVM_ENABLE_PROJECTS, building omp_lib.h")
- file(COPY ${CMAKE_BINARY_DIR}/projects/openmp/runtime/src/omp_lib.h DESTINATION "${CMAKE_BINARY_DIR}/include/flang/OpenMP/" FILE_PERMISSIONS OWNER_READ OWNER_WRITE)
- install(FILES ${CMAKE_BINARY_DIR}/include/flang/OpenMP/omp_lib.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/flang/OpenMP")
-elseif ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
- message(STATUS "OpenMP runtime support enabled via LLVM_ENABLE_RUNTIMES, assuming omp_lib.h is built there")
-else()
- message(STATUS "Not copying omp_lib.h, no OpenMP runtime in either LLVM_ENABLE_PROJECTS or LLVM_ENABLE_RUNTIMES")
-endif()
diff --git a/flang/tools/f18/dump.cpp b/flang/tools/f18/dump.cpp
deleted file mode 100644
index f11b5aedf4c6a..0000000000000
--- a/flang/tools/f18/dump.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-//===-- tools/f18/dump.cpp ------------------------------------------------===//
-//
-// 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 file defines Dump routines available for calling from the debugger.
-// Each is based on operator<< for that type. There are overloadings for
-// reference and pointer, and for dumping to a provided raw_ostream or errs().
-
-#ifdef DEBUGF18
-
-#include "llvm/Support/raw_ostream.h"
-
-#define DEFINE_DUMP(ns, name) \
- namespace ns { \
- class name; \
- llvm::raw_ostream &operator<<(llvm::raw_ostream &, const name &); \
- } \
- void Dump(llvm::raw_ostream &os, const ns::name &x) { os << x << '\n'; } \
- void Dump(llvm::raw_ostream &os, const ns::name *x) { \
- if (x == nullptr) \
- os << "null\n"; \
- else \
- Dump(os, *x); \
- } \
- void Dump(const ns::name &x) { Dump(llvm::errs(), x); } \
- void Dump(const ns::name *x) { Dump(llvm::errs(), *x); }
-
-namespace Fortran {
-DEFINE_DUMP(parser, Name)
-DEFINE_DUMP(parser, CharBlock)
-DEFINE_DUMP(semantics, Symbol)
-DEFINE_DUMP(semantics, Scope)
-DEFINE_DUMP(semantics, IntrinsicTypeSpec)
-DEFINE_DUMP(semantics, DerivedTypeSpec)
-DEFINE_DUMP(semantics, DeclTypeSpec)
-} // namespace Fortran
-
-#endif
diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
index d877f0b883cc4..d229a0a3aa09a 100644
--- a/llvm/runtimes/CMakeLists.txt
+++ b/llvm/runtimes/CMakeLists.txt
@@ -252,6 +252,11 @@ function(runtime_default_target)
# OpenMP tests
list(APPEND extra_targets "libomp-mod")
endif ()
+ if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
+ # The target flang-rt-mod is a dependee of check-flang needed to run its
+ # tests.
+ list(APPEND extra_targets "flang-rt-mod")
+ endif ()
if(LLVM_INCLUDE_TESTS)
set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_TESTSUITES "@${LLVM_BINARY_DIR}/runtimes/runtimes-bins/lit.tests")
@@ -536,18 +541,15 @@ if(build_runtimes)
if ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES AND "flang" IN_LIST LLVM_ENABLE_PROJECTS)
list(APPEND extra_args ENABLE_FORTRAN)
endif()
- if("openmp" IN_LIST LLVM_ENABLE_RUNTIMES OR "offload" IN_LIST LLVM_ENABLE_RUNTIMES)
- if (${LLVM_TOOL_FLANG_BUILD})
- message(STATUS "Configuring build of omp_lib.mod and omp_lib_kinds.mod via flang")
- set(LIBOMP_FORTRAN_MODULES_COMPILER "${CMAKE_BINARY_DIR}/bin/flang")
- set(LIBOMP_MODULES_INSTALL_PATH "${CMAKE_INSTALL_INCLUDEDIR}/flang")
- # TODO: This is a workaround until flang becomes a first-class project
- # in llvm/CMakeList.txt. Until then, this line ensures that flang is
- # built before "openmp" is built as a runtime project. Besides "flang"
- # to build the compiler, we also need to add "module_files" to make sure
- # that all .mod files are also properly build.
- list(APPEND extra_deps "flang" "module_files")
+ if("flang" IN_LIST LLVM_ENABLE_PROJECTS)
+ # Ensure REAL(16) support in runtimes to be consistent with compiler
+ if(FLANG_RUNTIME_F128_MATH_LIB OR HAVE_LDBL_MANT_DIG_113)
+ list(APPEND extra_cmake_args "-DFORTRAN_SUPPORTS_REAL16=TRUE")
+ else()
+ list(APPEND extra_cmake_args "-DFORTRAN_SUPPORTS_REAL16=FALSE")
endif()
+ endif()
+ if("openmp" IN_LIST LLVM_ENABLE_RUNTIMES OR "offload" IN_LIST LLVM_ENABLE_RUNTIMES)
foreach(dep opt llvm-link llvm-extract clang llvm-offload-binary clang-nvlink-wrapper)
if(TARGET ${dep})
list(APPEND extra_deps ${dep})
diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt
index 44cef3fb3f413..ad1916a96ca1c 100644
--- a/openmp/CMakeLists.txt
+++ b/openmp/CMakeLists.txt
@@ -111,6 +111,12 @@ set(OPENMP_TEST_FLAGS "" CACHE STRING
"Extra compiler flags to send to the test compiler.")
set(OPENMP_TEST_OPENMP_FLAGS ${OPENMP_TEST_COMPILER_OPENMP_FLAGS} CACHE STRING
"OpenMP compiler flag to use for testing OpenMP runtime libraries.")
+set(OPENMP_TEST_Fortran_FLAGS "${CMAKE_Fortran_FLAGS}" CACHE STRING
+ "Additional compiler flags to use for testing Fortran programs.")
+
+if (LLVM_RUNTIMES_BUILD)
+ flang_module_fortran_enable()
+endif ()
set(ENABLE_LIBOMPTARGET ON)
# Currently libomptarget cannot be compiled on Windows or MacOS X.
diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt
index 93eb14f10a50a..6ed1b19c4e054 100644
--- a/openmp/runtime/CMakeLists.txt
+++ b/openmp/runtime/CMakeLists.txt
@@ -109,7 +109,7 @@ set(LIBOMP_MIC_ARCH knc CACHE STRING
if("${LIBOMP_ARCH}" STREQUAL "mic")
libomp_check_variable(LIBOMP_MIC_ARCH knf knc)
endif()
-set(LIBOMP_FORTRAN_MODULES FALSE CACHE BOOL
+set(LIBOMP_FORTRAN_MODULES "${RUNTIMES_FLANG_MODULES_ENABLED}" CACHE BOOL
"Create Fortran module files? (requires fortran compiler)")
# - Support for universal fat binary builds on Mac
@@ -147,8 +147,6 @@ else()
set(LIBOMP_LIBFLAGS "" CACHE STRING
"Appended user specified linked libs flags. (e.g., -lm)")
endif()
-set(LIBOMP_FFLAGS "" CACHE STRING
- "Appended user specified Fortran compiler flags. These are only used if LIBOMP_FORTRAN_MODULES==TRUE.")
# Should the libomp library and generated headers be copied into the original source exports/ directory
# Turning this to FALSE aids parallel builds to not interfere with each other.
@@ -272,10 +270,6 @@ set(LIBOMP_TOOLS_DIR ${LIBOMP_BASE_DIR}/tools)
set(LIBOMP_INC_DIR ${LIBOMP_SRC_DIR}/include)
set(LIBOMP_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
-# Enabling Fortran if it is needed
-if(${LIBOMP_FORTRAN_MODULES})
- enable_language(Fortran)
-endif()
# Enable MASM Compiler if it is needed (Windows only)
if(WIN32)
enable_language(ASM_MASM)
diff --git a/openmp/runtime/cmake/LibompCheckFortranFlag.cmake b/openmp/runtime/cmake/LibompCheckFortranFlag.cmake
deleted file mode 100644
index 344389f989388..0000000000000
--- a/openmp/runtime/cmake/LibompCheckFortranFlag.cmake
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-#//===----------------------------------------------------------------------===//
-#//
-#// 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
-#//
-#//===----------------------------------------------------------------------===//
-#
-
-# Checking a fortran compiler flag
-# There is no real trivial way to do this in CMake, so we implement it here
-# this will have ${boolean} = TRUE if the flag succeeds, otherwise false.
-function(libomp_check_fortran_flag flag boolean)
- if(NOT DEFINED "${boolean}")
- set(retval TRUE)
- set(fortran_source
-" program hello
- print *, \"Hello World!\"
- end program hello")
-
- # Compiling as a part of runtimes introduces ARCH-unknown-linux-gnu as a
- # part of a working directory. So adding a guard for unknown.
- set(failed_regexes "[Ee]rror;[Uu]nknown[^-];[Ss]kipping")
- include(CheckFortranSourceCompiles)
- check_fortran_source_compiles("${fortran_source}" ${boolean} FAIL_REGEX "${failed_regexes}")
- set(${boolean} ${${boolean}} PARENT_SCOPE)
- endif()
-endfunction()
diff --git a/openmp/runtime/cmake/LibompHandleFlags.cmake b/openmp/runtime/cmake/LibompHandleFlags.cmake
index c36a88fb862ae..a27c8cc407e11 100644
--- a/openmp/runtime/cmake/LibompHandleFlags.cmake
+++ b/openmp/runtime/cmake/LibompHandleFlags.cmake
@@ -156,17 +156,6 @@ function(libomp_get_libflags libflags)
set(${libflags} ${libflags_local_list} PARENT_SCOPE)
endfunction()
-# Fortran flags
-function(libomp_get_fflags fflags)
- set(fflags_local)
- if(CMAKE_SIZEOF_VOID_P EQUAL 4)
- libomp_append(fflags_local -m32 LIBOMP_HAVE_M32_FORTRAN_FLAG)
- endif()
- set(fflags_local ${fflags_local} ${LIBOMP_FFLAGS})
- libomp_setup_flags(fflags_local)
- set(${fflags} ${fflags_local} PARENT_SCOPE)
-endfunction()
-
# Python generate-defs.py flags (For Windows only)
function(libomp_get_gdflags gdflags)
set(gdflags_local)
diff --git a/openmp/runtime/cmake/config-ix.cmake b/openmp/runtime/cmake/config-ix.cmake
index 30b69d46a8bd1..150a0c3c7217b 100644
--- a/openmp/runtime/cmake/config-ix.cmake
+++ b/openmp/runtime/cmake/config-ix.cmake
@@ -16,7 +16,6 @@ include(CheckIncludeFile)
include(CheckLibraryExists)
include(CheckIncludeFiles)
include(CheckSymbolExists)
-include(LibompCheckFortranFlag)
include(LLVMCheckCompilerLinkerFlag)
# Check for versioned symbols
@@ -97,9 +96,6 @@ if(WIN32)
endforeach()
endforeach()
endif()
-if(${LIBOMP_FORTRAN_MODULES})
- libomp_check_fortran_flag(-m32 LIBOMP_HAVE_M32_FORTRAN_FLAG)
-endif()
# Check non-posix pthread API here before CMAKE_REQUIRED_DEFINITIONS gets messed up
check_symbol_exists(pthread_setname_np "pthread.h" LIBOMP_HAVE_PTHREAD_SETNAME_NP)
diff --git a/openmp/runtime/src/CMakeLists.txt b/openmp/runtime/src/CMakeLists.txt
index 3202bdcd13524..0b0154e8bf3a4 100644
--- a/openmp/runtime/src/CMakeLists.txt
+++ b/openmp/runtime/src/CMakeLists.txt
@@ -382,46 +382,6 @@ endif()
configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
configure_file(${LIBOMP_INC_DIR}/omp_lib.F90.var omp_lib.F90 @ONLY)
-set(BUILD_FORTRAN_MODULES False)
-if (NOT ${LIBOMP_FORTRAN_MODULES_COMPILER} STREQUAL "")
- # If libomp is built as an LLVM runtime and the flang compiler is available,
- # compile the Fortran module files.
- message(STATUS "configuring openmp to build Fortran module files using ${LIBOMP_FORTRAN_MODULES_COMPILER}")
- set(LIBOMP_FORTRAN_SOURCE_FILE omp_lib.F90)
- add_custom_target(libomp-mod ALL DEPENDS omp_lib.mod omp_lib_kinds.mod)
- add_custom_command(
- OUTPUT omp_lib.mod omp_lib_kinds.mod
- COMMAND ${LIBOMP_FORTRAN_MODULES_COMPILER} -cpp -fsyntax-only ${LIBOMP_FORTRAN_SOURCE_FILE}
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_FORTRAN_SOURCE_FILE}
- ${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h
- )
- set(BUILD_FORTRAN_MODULES True)
-elseif(${LIBOMP_FORTRAN_MODULES})
- # The following requests explicit building of the Fortran module files
- # Workaround for gfortran to build modules with the
- # omp_sched_monotonic integer parameter
- if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
- set(ADDITIONAL_Fortran_FLAGS "-fno-range-check")
- endif()
- add_custom_target(libomp-mod ALL DEPENDS omp_lib.mod omp_lib_kinds.mod)
- set_target_properties(libomp-mod PROPERTIES FOLDER "OpenMP/Misc")
- libomp_get_fflags(LIBOMP_CONFIGURED_FFLAGS)
- if(CMAKE_Fortran_COMPILER_SUPPORTS_F90)
- set(LIBOMP_FORTRAN_SOURCE_FILE omp_lib.F90)
- else()
- message(FATAL_ERROR "Fortran module build requires Fortran 90 compiler")
- endif()
- add_custom_command(
- OUTPUT omp_lib.mod omp_lib_kinds.mod
- COMMAND ${CMAKE_Fortran_COMPILER} -c ${ADDITIONAL_Fortran_FLAGS}
- ${LIBOMP_CONFIGURED_FFLAGS} ${LIBOMP_FORTRAN_SOURCE_FILE}
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_FORTRAN_SOURCE_FILE}
- ${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h
- )
- set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES omp_lib${CMAKE_C_OUTPUT_EXTENSION})
- set(BUILD_FORTRAN_MODULES True)
-endif()
-
# Move files to exports/ directory if requested
if(${LIBOMP_COPY_EXPORTS})
include(LibompExports)
@@ -502,15 +462,32 @@ if(${LIBOMP_OMPT_SUPPORT})
install(FILES ${LIBOMP_HEADERS_INTDIR}/omp-tools.h DESTINATION ${LIBOMP_HEADERS_INSTALL_PATH} RENAME ompt.h)
set(LIBOMP_OMP_TOOLS_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
endif()
-if(${BUILD_FORTRAN_MODULES})
+
+
+# Build the modules files if a Fortran compiler is available.
+# Only LLVM_ENABLE_RUNTIMES=openmp is supported, LLVM_ENABLE_PROJECTS=openmp
+# has been deprecated.
+if(LIBOMP_FORTRAN_MODULES)
+ add_library(libomp-mod OBJECT
+ omp_lib.F90
+ )
+ set_target_properties(libomp-mod PROPERTIES FOLDER "OpenMP/Fortran Modules")
+
+ if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
+ target_compile_options(libomp-mod PRIVATE -fno-range-check)
+ endif()
+
+ flang_module_target(libomp-mod PUBLIC)
+ if (FORTRAN_MODULE_DEPS)
+ add_dependencies(libomp-mod ${FORTRAN_MODULE_DEPS})
+ endif ()
+
set (destination ${LIBOMP_HEADERS_INSTALL_PATH})
if (NOT ${LIBOMP_MODULES_INSTALL_PATH} STREQUAL "")
set (destination ${LIBOMP_MODULES_INSTALL_PATH})
endif()
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/omp_lib.h
- ${CMAKE_CURRENT_BINARY_DIR}/omp_lib.mod
- ${CMAKE_CURRENT_BINARY_DIR}/omp_lib_kinds.mod
DESTINATION ${destination}
)
endif()
diff --git a/openmp/runtime/test/lit.cfg b/openmp/runtime/test/lit.cfg
index 72da1ba1411f8..a4e3aa505638a 100644
--- a/openmp/runtime/test/lit.cfg
+++ b/openmp/runtime/test/lit.cfg
@@ -48,6 +48,7 @@ if config.test_fortran_compiler:
ToolSubst(
"%flang",
command=config.test_fortran_compiler,
+ extra_args=config.test_fortran_flags.split(),
unresolved="fatal",
),
], [config.llvm_tools_dir])
diff --git a/openmp/runtime/test/lit.site.cfg.in b/openmp/runtime/test/lit.site.cfg.in
index cc8b3b252d7d1..fd0ad30228026 100644
--- a/openmp/runtime/test/lit.site.cfg.in
+++ b/openmp/runtime/test/lit.site.cfg.in
@@ -8,6 +8,7 @@ config.test_compiler_has_omp_h = @OPENMP_TEST_COMPILER_HAS_OMP_H@
config.test_filecheck = "@OPENMP_FILECHECK_EXECUTABLE@"
config.test_not = "@OPENMP_NOT_EXECUTABLE@"
config.test_openmp_flags = "@OPENMP_TEST_OPENMP_FLAGS@"
+config.test_fortran_flags = "@OPENMP_TEST_Fortran_FLAGS@"
config.test_extra_flags = "@OPENMP_TEST_FLAGS@"
config.libomp_obj_root = "@CMAKE_CURRENT_BINARY_DIR@"
config.library_dir = "@LIBOMP_LIBRARY_DIR@"
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 5220b9353fed7..2714126f3e5f1 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -85,6 +85,42 @@ include(CheckLibraryExists)
include(LLVMCheckCompilerLinkerFlag)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
+include(ExtendPath)
+
+
+# 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 used.
+if (CMAKE_VERSION VERSION_LESS "3.24" AND CMAKE_Fortran_COMPILER)
+ 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 ()
# Determine whether we are in the runtimes/runtimes-bins directory of a
@@ -94,17 +130,6 @@ if (LLVM_LIBRARY_DIR AND LLVM_TOOLS_BINARY_DIR AND PACKAGE_VERSION)
set(LLVM_TREE_AVAILABLE ON)
endif()
-if(LLVM_TREE_AVAILABLE)
- # Setting these variables will allow the sub-build to put their outputs into
- # the library and bin directories of the top-level build.
- set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
- set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_TOOLS_BINARY_DIR})
-else()
- # Use own build directory for artifact output.
- set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}")
- set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin")
-endif()
-
# CMake omits default compiler include paths, but in runtimes build, we use
# -nostdinc and -nostdinc++ and control include paths manually so this behavior
# is undesirable. Filtering CMAKE_{LANG}_IMPLICIT_INCLUDE_DIRECTORIES to remove
@@ -217,6 +242,61 @@ message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
set(LLVM_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
+
+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.
+ # LLVM_LIBRARY_OUTPUT_INTDIR/LLVM_RUNTIME_OUTPUT_INTDIR is used by
+ # AddLLVM.cmake as artifact output locations.
+ set(LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_DIR})
+ set(LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_TOOLS_BINARY_DIR})
+
+ # 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(RUNTIMES_OUTPUT_RESOURCE_DIR PREFIX "${LLVM_LIBRARY_OUTPUT_INTDIR}/..")
+ get_clang_resource_dir(RUNTIMES_INSTALL_RESOURCE_PATH_DEFAULT)
+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. Use own build directory for artifact output.
+ set(LLVM_LIBRARY_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}")
+ set(LLVM_RUNTIME_OUTPUT_INTDIR "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin")
+
+ # 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(RUNTIMES_OUTPUT_RESOURCE_DIR "${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/clang/${LLVM_VERSION_MAJOR}")
+ set(RUNTIMES_INSTALL_RESOURCE_PATH_DEFAULT "lib${LLVM_LIBDIR_SUFFIX}/clang/${LLVM_VERSION_MAJOR}")
+endif()
+
+# 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.
+# FIXME: For shared libraries, the toolchain resource lib dir is not a good
+# destination because it is not a ld.so default search path.
+# The machine where the executable is eventually executed may not be the
+# machine where the Flang compiler and its resource dir is installed, so
+# setting RPath by the driver is not an solution. It should belong into
+# /usr/lib/<triple>/lib<name>.so, like e.g. libgcc_s.so.
+# But the linker as invoked by the Flang driver also requires
+# libflang_rt.so to be found when linking and the resource lib dir is
+# the only reliable location.
+include(GetToolchainDirs)
+get_toolchain_library_subdir(toolchain_lib_subdir)
+extend_path(RUNTIMES_OUTPUT_RESOURCE_LIB_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "${toolchain_lib_subdir}")
+
+set(RUNTIMES_INSTALL_RESOURCE_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH_DEFAULT}" CACHE PATH "Path to install headers, runtime libraries, and Fortran modules to (default: Clang resource dir)")
+extend_path(RUNTIMES_INSTALL_RESOURCE_LIB_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH}" "${toolchain_lib_subdir}")
+
+cmake_path(NORMAL_PATH RUNTIMES_OUTPUT_RESOURCE_DIR)
+cmake_path(NORMAL_PATH RUNTIMES_INSTALL_RESOURCE_PATH)
+cmake_path(NORMAL_PATH RUNTIMES_OUTPUT_RESOURCE_LIB_DIR)
+cmake_path(NORMAL_PATH RUNTIMES_INSTALL_RESOURCE_LIB_PATH)
+
+
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(option_prefix "")
if (CMAKE_C_SIMULATE_ID MATCHES "MSVC")
@@ -328,6 +408,127 @@ if(LLVM_INCLUDE_TESTS)
umbrella_lit_testsuite_begin(check-runtimes)
endif()
+
+include(CheckFortranSourceCompiles)
+
+# Enable building Fortran modules
+# * Set up the Fortran compiler
+# * Determine files location in the Clang/Flang resource dir
+# * Install module files
+macro (flang_module_fortran_enable)
+ # Assume flang modules are enabled until all tests pass
+ set(FORTRAN_MODULE_DEPS "")
+ set(RUNTIMES_FLANG_MODULES_ENABLED_default OFF)
+
+ include(CheckLanguage)
+ check_language(Fortran)
+
+ if (CMAKE_Fortran_COMPILER)
+ enable_language(Fortran)
+
+ if (CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang" AND "flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
+ # In a bootstrapping build, the intrinsic modules are not built yet.
+ # Targets can depend on flang-rt-mod to ensure they are built before.
+ set(FORTRAN_MODULE_DEPS flang-rt-mod)
+ set(RUNTIMES_FLANG_MODULES_ENABLED_default ON)
+ message(STATUS "${LLVM_SUBPROJECT_TITLE}: Building Fortran modules for Flang bootstrapping itself")
+ else ()
+ # Check whether building modules works, avoid causing the entire build to fail because of Fortran.
+ # The primary situation we want to support here is Flang or its intrinsic modules were built separately in a non-bootstrapping build.
+ cmake_push_check_state(RESET)
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
+ check_fortran_source_compiles("
+ subroutine testroutine
+ use iso_c_binding
+ end subroutine
+ " HAVE_FORTRAN_INTRINSIC_MODS SRC_EXT F90)
+ cmake_pop_check_state()
+ if (HAVE_FORTRAN_INTRINSIC_MODS)
+ set(RUNTIMES_FLANG_MODULES_ENABLED_default ON)
+ message(STATUS "${LLVM_SUBPROJECT_TITLE}: Non-bootstrapping Fortran modules build (${CMAKE_Fortran_COMPILER_ID} located at ${CMAKE_Fortran_COMPILER})")
+ else ()
+ message(STATUS "Not compiling Flang modules: Not passing smoke check")
+ endif ()
+ endif ()
+ else ()
+ message(STATUS "Not compiling Flang modules: Fortran not enabled")
+ endif ()
+
+ option(RUNTIMES_FLANG_MODULES_ENABLED "Build Fortran modules" "${RUNTIMES_FLANG_MODULES_ENABLED_default}")
+
+ if (RUNTIMES_FLANG_MODULES_ENABLED)
+ if (CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
+ get_toolchain_module_subdir(toolchain_mod_subdir)
+ extend_path(RUNTIMES_OUTPUT_RESOURCE_MOD_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "${toolchain_mod_subdir}")
+ extend_path(RUNTIMES_INSTALL_RESOURCE_MOD_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH}" "${toolchain_mod_subdir}")
+ else ()
+ # For non-Flang compilers, avoid the risk of Flang accidentally picking them up.
+ extend_path(RUNTIMES_OUTPUT_RESOURCE_MOD_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "finclude-${CMAKE_Fortran_COMPILER_ID}")
+ extend_path(RUNTIMES_INSTALL_RESOURCE_MOD_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH}" "finclude-${CMAKE_Fortran_COMPILER_ID}")
+ endif ()
+ cmake_path(NORMAL_PATH RUNTIMES_OUTPUT_RESOURCE_MOD_DIR)
+ cmake_path(NORMAL_PATH RUNTIMES_INSTALL_RESOURCE_MOD_PATH)
+
+ # Avoid module files to be installed multiple times if this macro is called multiple times
+ get_property(is_installed GLOBAL PROPERTY RUNTIMES_MODS_INSTALLED)
+ if (NOT is_installed)
+ # No way to find out which mod files built by target individually, so install the entire output directory
+ # https://stackoverflow.com/questions/52712416/cmake-fortran-module-directory-to-be-used-with-add-library
+ set(destination "${RUNTIMES_INSTALL_RESOURCE_MOD_PATH}/..")
+ cmake_path(NORMAL_PATH destination)
+ install(DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
+ DESTINATION "${destination}"
+ )
+ set_property(GLOBAL PROPERTY RUNTIMES_MODS_INSTALLED TRUE)
+ endif ()
+ endif ()
+endmacro ()
+
+
+# Set options to compile Fortran module files.
+#
+# Usage:
+#
+# flang_module_target(name
+# PUBLIC
+# Modules files are to be used by other Fortran sources. If a library is
+# compiled multiple times (e.g. static/shared, or msvcrt variants), only
+# one of those can be public module files; non-public modules are still
+# generated but to be forgotten deep inside the build directory to not
+# conflict with each other.
+# Also, installs the module with the toolchain.
+# )
+function (flang_module_target tgtname)
+ set(options PUBLIC)
+ cmake_parse_arguments(ARG
+ "${options}"
+ ""
+ ""
+ ${ARGN})
+
+ if (NOT RUNTIMES_FLANG_MODULES_ENABLED)
+ return ()
+ endif ()
+
+ # Let it find the other public module files
+ target_compile_options(${tgtname} PRIVATE
+ "$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
+ )
+
+ if (ARG_PUBLIC)
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
+ )
+ else ()
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${tgtname}.mod"
+ )
+ endif ()
+endfunction ()
+
+
# We do this in two loops so that HAVE_* is set for each runtime before the
# other runtimes are added.
foreach(entry ${runtimes})
>From 645a31995ee5205f20bdcc30b54d16de67fb15af Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 25 Nov 2025 23:36:56 +0100
Subject: [PATCH 02/15] Clarify try_compile isolation
---
flang-rt/cmake/modules/FlangRTIntrospection.cmake | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/flang-rt/cmake/modules/FlangRTIntrospection.cmake b/flang-rt/cmake/modules/FlangRTIntrospection.cmake
index ddec624e320e7..c78c8a9b8a81a 100644
--- a/flang-rt/cmake/modules/FlangRTIntrospection.cmake
+++ b/flang-rt/cmake/modules/FlangRTIntrospection.cmake
@@ -6,22 +6,23 @@
#
#===------------------------------------------------------------------------===#
+include(CMakePushCheckState)
# Check whether the Fortran compiler supports real(16)/quadmath types
#
# Implementation notes:
+#
# * FORTRAN_SUPPORTS_REAL16 can be set externally in a bootstrapping-runtimes
# build to ensure consistency of real(16) support between compiler and
# runtime.
#
-# * Does not work with Flang and CMake < 3.24
+# * Does not work with Flang and CMake < 3.24; rely on an externally set
+# FORTRAN_SUPPORTS_REAL16 instead.
#
-# * This is intentionally wrapped in a function to get its own namespace for
-# CMAKE_REQUIRED_FLAGS and CMAKE_TRY_COMPILE_TARGET_TYPE. In particular,
-# cmake_pop_check_state() does not reset CMAKE_TRY_COMPILE_TARGET_TYPE,
-# causing later try_compile invocations to fail. If you see
-# enable_language(CUDA) failing because CMAKE_RANLIB is empty, this is the
-# reason.
+# * cmake_push_check_state/cmake_pop_check_state is insufficient to isolate
+# a compiler introspection environment, see
+# https://gitlab.kitware.com/cmake/cmake/-/issues/27419
+# Additionally wrap it in a function namespace.
function (check_fortran_quadmath_support)
cmake_push_check_state(RESET)
set(CMAKE_REQUIRED_FLAGS "-ffree-form")
>From 3efb58a3c0ccbce0ab1047965b5bc53b2dbfdf80 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Tue, 25 Nov 2025 23:38:23 +0100
Subject: [PATCH 03/15] Prefer -J over -module-dir
---
runtimes/CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 2714126f3e5f1..253a6d693d8a6 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -109,7 +109,7 @@ if (CMAKE_VERSION VERSION_LESS "3.24" AND CMAKE_Fortran_COMPILER)
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_MODDIR_FLAG "-J")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_ON "-cpp")
set(CMAKE_Fortran_COMPILE_OPTIONS_PREPROCESS_OFF "-nocpp")
>From 9041b784e3c054266a9109c2698030ea4f2aad44 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 11:49:06 +0100
Subject: [PATCH 04/15] Add modules-only mode
---
clang/lib/Driver/ToolChains/AMDGPU.cpp | 3 +-
clang/lib/Driver/ToolChains/HIPAMD.cpp | 3 +-
clang/lib/Driver/ToolChains/HIPSPV.cpp | 3 +-
flang-rt/CMakeLists.txt | 35 ++++++----
flang-rt/cmake/modules/AddFlangRT.cmake | 17 ++++-
flang-rt/lib/runtime/CMakeLists.txt | 85 +++++++++++++------------
6 files changed, 90 insertions(+), 56 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 80e58d466b885..146effbb5bf98 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -851,7 +851,8 @@ void AMDGPUToolChain::addClangTargetOptions(
// Default to "hidden" visibility, as object level linking will not be
// supported for the foreseeable future.
if (!DriverArgs.hasArg(options::OPT_fvisibility_EQ,
- options::OPT_fvisibility_ms_compat)) {
+ options::OPT_fvisibility_ms_compat) &&
+ !getDriver().IsFlangMode()) {
CC1Args.push_back("-fvisibility=hidden");
CC1Args.push_back("-fapply-global-visibility-to-externs");
}
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index 231a38c2d3717..beec8e07807cd 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -251,7 +251,8 @@ void HIPAMDToolChain::addClangTargetOptions(
// Default to "hidden" visibility, as object level linking will not be
// supported for the foreseeable future.
if (!DriverArgs.hasArg(options::OPT_fvisibility_EQ,
- options::OPT_fvisibility_ms_compat)) {
+ options::OPT_fvisibility_ms_compat) &&
+ !getDriver().IsFlangMode()) {
CC1Args.append({"-fvisibility=hidden"});
CC1Args.push_back("-fapply-global-visibility-to-externs");
}
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index be0f49d8e1497..261adc2b1c440 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -143,7 +143,8 @@ void HIPSPVToolChain::addClangTargetOptions(
// Default to "hidden" visibility, as object level linking will not be
// supported for the foreseeable future.
if (!DriverArgs.hasArg(options::OPT_fvisibility_EQ,
- options::OPT_fvisibility_ms_compat))
+ options::OPT_fvisibility_ms_compat) &&
+ !getDriver().IsFlangMode())
CC1Args.append(
{"-fvisibility=hidden", "-fapply-global-visibility-to-externs"});
diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index db0d87d91ea83..8fa934dbdbf29 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -58,8 +58,6 @@ flang_module_fortran_enable()
# 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}")
-
# Provide an interface to link against the LLVM libc/libc++ projects directly.
set(FLANG_RT_SUPPORTED_PROVIDERS system llvm)
set(FLANG_RT_LIBC_PROVIDER "system" CACHE STRING "Specify C library to use. Supported values are ${FLANG_RT_SUPPORTED_PROVIDERS}.")
@@ -72,7 +70,15 @@ if (NOT "${FLANG_RT_LIBCXX_PROVIDER}" IN_LIST FLANG_RT_SUPPORTED_PROVIDERS)
message(FATAL_ERROR "Unsupported library: '${FLANG_RT_LIBCXX_PROVIDER}'. Supported values are ${FLANG_RT_SUPPORTED_PROVIDERS}.")
endif ()
-option(FLANG_RT_ENABLE_STATIC "Build Flang-RT as a static library." ON)
+if (LLVM_RUNTIMES_TARGET MATCHES "^amdgcn|^nvptx")
+ # Compiling libraries for offload targets is currently experimental;
+ # only build the buildtin modules by default.
+ set(FLANG_RT_ENABLE_STATIC_default OFF)
+else ()
+ set(FLANG_RT_ENABLE_STATIC_default ON)
+endif ()
+
+option(FLANG_RT_ENABLE_STATIC "Build Flang-RT as a static library." "${FLANG_RT_ENABLE_STATIC_default}")
if (WIN32)
# Windows DLL currently not implemented.
set(FLANG_RT_ENABLE_SHARED OFF)
@@ -85,11 +91,14 @@ else ()
# breaking change unless the driver is changed.
option(FLANG_RT_ENABLE_SHARED "Build Flang-RT as a shared library." OFF)
endif ()
-if (NOT FLANG_RT_ENABLE_STATIC AND NOT FLANG_RT_ENABLE_SHARED)
- message(FATAL_ERROR "
- Must build at least one type of library
- (FLANG_RT_ENABLE_STATIC=ON, FLANG_RT_ENABLE_SHARED=ON, or both)
- ")
+
+
+if (FLANG_RT_ENABLE_STATIC OR FLANG_RT_ENABLE_SHARED)
+ option(FLANG_RT_INCLUDE_TESTS "Generate build targets for the flang-rt unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
+else ()
+ # Tests require at least one libraries
+ message(STATUS "Testing disabled without either FLANG_RT_ENABLE_STATIC or FLANG_RT_ENABLE_SHARED")
+ set(FLANG_RT_INCLUDE_TESTS OFF)
endif ()
@@ -107,8 +116,14 @@ elseif (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
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
+else ()
+ message(FATAL_ERROR "Invalid value '${FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT}' for FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT; must be empty, 'CUDA', or 'OpenMP'")
+endif ()
+
+
+if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP" OR LLVM_TARGET_TRIPLE MATCHES "^nvptx")
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')"
+ "List of offload device architectures to be used to compile the Fortran runtime (e.g. 'gfx1103;sm_90')"
)
if (FLANG_RT_DEVICE_ARCHITECTURES STREQUAL "all")
@@ -127,8 +142,6 @@ elseif (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP")
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 ()
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index b3f2cd07c0aed..ea4f920e1d877 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -94,6 +94,10 @@ function (add_flangrt_library name)
set(build_object ON)
elseif (build_static AND build_shared)
set(build_object ON)
+ elseif (NOT build_static AND NOT build_shared)
+ # If not building a library, still build the object files
+ # Needed to generate the .mod files as byproduct
+ set(build_object ON)
endif ()
# srctargets: targets that contain source files
@@ -168,14 +172,18 @@ function (add_flangrt_library name)
if (BUILD_SHARED_LIBS)
if (build_shared)
set(default_target "${name_shared}")
- else ()
+ elseif (build_static)
set(default_target "${name_static}")
+ else ()
+ set(default_target "${name_object}")
endif ()
else ()
if (build_static)
set(default_target "${name_static}")
- else ()
+ elseif (build_shared)
set(default_target "${name_shared}")
+ else ()
+ set(default_target "${name_object}")
endif ()
endif ()
add_library(${name}.default ALIAS "${default_target}")
@@ -292,6 +300,11 @@ function (add_flangrt_library name)
target_compile_options(${tgtname} PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-nogpulib -flto -fvisibility=hidden -Wno-unknown-cuda-version --cuda-feature=+ptx63>
)
+ foreach (_arch IN LISTS FLANG_RT_DEVICE_ARCHITECTURES)
+ target_compile_options(${tgtname} PRIVATE
+ -march=${_arch}
+ )
+ endforeach()
elseif (APPLE)
# Clang on Darwin enables non-POSIX extensions by default.
# This causes some macros to leak, such as HUGE from <math.h>, which
diff --git a/flang-rt/lib/runtime/CMakeLists.txt b/flang-rt/lib/runtime/CMakeLists.txt
index a678055430233..0c8db7e84d53c 100644
--- a/flang-rt/lib/runtime/CMakeLists.txt
+++ b/flang-rt/lib/runtime/CMakeLists.txt
@@ -18,6 +18,22 @@ set(intrinsics_sources
__cuda_builtins.f90
)
+# Fortran sources for builtin .mod files
+set(module_sources
+ __fortran_ieee_exceptions.f90
+ __fortran_type_info.f90
+ iso_fortran_env.f90
+ ieee_arithmetic.f90
+ ieee_exceptions.f90
+ ieee_features.f90
+ iso_c_binding.f90
+ iso_fortran_env.f90
+ iso_fortran_env_impl.f90
+
+ __cuda_device.f90
+ cooperative_groups.f90
+ cudadevice.f90
+)
# List of files that are buildable for all devices.
set(supported_sources
@@ -80,16 +96,6 @@ set(supported_sources
# List of source not used for GPU offloading.
set(host_sources
- __fortran_ieee_exceptions.f90
- __fortran_type_info.f90
- iso_fortran_env.f90
- ieee_arithmetic.f90
- ieee_exceptions.f90
- ieee_features.f90
- iso_c_binding.f90
- iso_fortran_env_impl.f90
- iso_fortran_env.f90
-
command.cpp
complex-powi.cpp
complex-reduction.c
@@ -104,32 +110,8 @@ set(host_sources
temporary-stack.cpp
time-intrinsic.cpp
unit-map.cpp
-
- __cuda_device.f90
- cooperative_groups.f90
- cudadevice.f90
)
-if (LLVM_TARGET_TRIPLE MATCHES "^ppc|^powerpc")
- list(APPEND intrinsics_sources
- __ppc_types.f90
- )
- list(APPEND host_sources
- __ppc_intrinsics.f90
- mma.f90
- )
-endif ()
-
-# Compile as CUDA-Fortran, not directly supported by CMake
-set_property(SOURCE
- __cuda_device.f90
- cooperative_groups.f90
- cudadevice.f90
- APPEND PROPERTY
- COMPILE_OPTIONS --offload-host-only -xcuda
-)
-
-
# Sources that can be compiled directly for the GPU.
set(gpu_sources
${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp
@@ -189,6 +171,24 @@ file(GLOB_RECURSE private_headers
"${FLANG_SOURCE_DIR}/lib/Common/*.h"
)
+if (LLVM_TARGET_TRIPLE MATCHES "^ppc|^powerpc")
+ list(APPEND intrinsics_sources
+ __ppc_types.f90
+ )
+ list(APPEND module_sources
+ __ppc_intrinsics.f90
+ mma.f90
+ )
+endif ()
+
+# Compile as CUDA-Fortran, not directly supported by CMake
+set_property(SOURCE
+ __cuda_device.f90
+ cooperative_groups.f90
+ cudadevice.f90
+ APPEND PROPERTY
+ COMPILE_OPTIONS --offload-host-only -xcuda
+)
# Import changes from flang_rt.quadmath
get_target_property(f128_sources
@@ -215,14 +215,17 @@ else ()
set(f128_sources "")
endif ()
-if (LLVM_RUNTIMES_TARGET MATCHES "^amdgcn|^nvptx")
- set(sources ${gpu_sources})
+if (NOT FLANG_RT_ENABLE_STATIC AND NOT FLANG_RT_ENABLE_STATIC)
+ # If not compiling the library, only build the modules.
+ set(sources ${module_sources})
+elseif (LLVM_RUNTIMES_TARGET MATCHES "^amdgcn|^nvptx")
+ set(sources ${gpu_sources} ${module_sources})
else ()
- set(sources ${supported_sources} ${host_sources} ${f128_sources})
+ set(sources ${supported_sources} ${host_sources} ${module_sources} ${f128_sources})
endif ()
-# check-flang depends on this to build intrinsic modules
+# check-flang depends on flang-rt-mod to build intrinsic modules
if (NOT TARGET flang-rt-mod)
add_custom_target(flang-rt-mod)
endif ()
@@ -259,8 +262,10 @@ if (NOT WIN32)
enable_omp_offload_compilation(flang_rt.runtime "${supported_sources}")
# Select a default runtime, which is used for unit and regression tests.
- get_target_property(default_target flang_rt.runtime.default ALIASED_TARGET)
- add_library(flang_rt.runtime.unittest ALIAS "${default_target}")
+ if (FLANG_RT_INCLUDE_TESTS)
+ get_target_property(default_target flang_rt.runtime.default ALIASED_TARGET)
+ add_library(flang_rt.runtime.unittest ALIAS "${default_target}")
+ endif ()
# Select a target that compiles the sources to build the public module files.
get_target_property(compile_target flang_rt.runtime.compile ALIASED_TARGET)
>From 0b6f11b0faee7f9ca540f139aecc3c1f044995c9 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 12:17:09 +0100
Subject: [PATCH 05/15] Fix remaining include paths
---
flang-rt/lib/runtime/__fortran_ieee_exceptions.f90 | 2 +-
flang-rt/lib/runtime/iso_fortran_env.f90 | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/flang-rt/lib/runtime/__fortran_ieee_exceptions.f90 b/flang-rt/lib/runtime/__fortran_ieee_exceptions.f90
index 3ac9b993186aa..ff5c6b44317f8 100644
--- a/flang-rt/lib/runtime/__fortran_ieee_exceptions.f90
+++ b/flang-rt/lib/runtime/__fortran_ieee_exceptions.f90
@@ -11,7 +11,7 @@
! here under another name so that IEEE_ARITHMETIC can USE it and export its
! declarations without clashing with a non-intrinsic module in a program.
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../../flang/include/flang/Runtime/magic-numbers.h'
module __fortran_ieee_exceptions
use __fortran_builtins, only: &
diff --git a/flang-rt/lib/runtime/iso_fortran_env.f90 b/flang-rt/lib/runtime/iso_fortran_env.f90
index 3729b95a339f3..2dc38bd1acfe5 100644
--- a/flang-rt/lib/runtime/iso_fortran_env.f90
+++ b/flang-rt/lib/runtime/iso_fortran_env.f90
@@ -8,7 +8,7 @@
! See Fortran 2023, subclause 16.10.2
-#include '../include/flang/Runtime/magic-numbers.h'
+#include '../../../flang/include/flang/Runtime/magic-numbers.h'
module iso_fortran_env
>From 81db5c802120a9f677073232459c5436d3a8aff7 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 14:33:26 +0100
Subject: [PATCH 06/15] Fix LIBOMP_COPY_EXPORTS
---
openmp/runtime/cmake/LibompExports.cmake | 9 ++++----
openmp/runtime/src/CMakeLists.txt | 26 +++++++++++++-----------
2 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/openmp/runtime/cmake/LibompExports.cmake b/openmp/runtime/cmake/LibompExports.cmake
index 461e47d449157..662c207f8904f 100644
--- a/openmp/runtime/cmake/LibompExports.cmake
+++ b/openmp/runtime/cmake/LibompExports.cmake
@@ -56,8 +56,8 @@ set(LIBOMP_EXPORTS_LIB_DIR "${LIBOMP_EXPORTS_DIR}/${libomp_platform}${libomp_suf
# Put headers in exports/ directory post build
add_custom_command(TARGET omp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBOMP_EXPORTS_CMN_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy omp.h ${LIBOMP_EXPORTS_CMN_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy ompx.h ${LIBOMP_EXPORTS_CMN_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBOMP_HEADERS_INTDIR}/omp.h ${LIBOMP_EXPORTS_CMN_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBOMP_HEADERS_INTDIR}/ompx.h ${LIBOMP_EXPORTS_CMN_DIR}
)
if(${LIBOMP_OMPT_SUPPORT})
add_custom_command(TARGET omp POST_BUILD
@@ -67,9 +67,10 @@ endif()
if(${LIBOMP_FORTRAN_MODULES})
add_custom_command(TARGET libomp-mod POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBOMP_EXPORTS_MOD_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy omp_lib.mod ${LIBOMP_EXPORTS_MOD_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy omp_lib_kinds.mod ${LIBOMP_EXPORTS_MOD_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}/omp_lib.mod ${LIBOMP_EXPORTS_MOD_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}/omp_lib_kinds.mod ${LIBOMP_EXPORTS_MOD_DIR}
)
+
add_custom_command(TARGET omp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy omp_lib.h ${LIBOMP_EXPORTS_CMN_DIR}
)
diff --git a/openmp/runtime/src/CMakeLists.txt b/openmp/runtime/src/CMakeLists.txt
index 0b0154e8bf3a4..23b178077ed3f 100644
--- a/openmp/runtime/src/CMakeLists.txt
+++ b/openmp/runtime/src/CMakeLists.txt
@@ -377,16 +377,6 @@ if(WIN32)
endif()
endif()
-# Building the Fortran module files
-# One compilation step creates both omp_lib.mod and omp_lib_kinds.mod
-configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
-configure_file(${LIBOMP_INC_DIR}/omp_lib.F90.var omp_lib.F90 @ONLY)
-
-# Move files to exports/ directory if requested
-if(${LIBOMP_COPY_EXPORTS})
- include(LibompExports)
-endif()
-
# Micro test rules for after library has been built (cmake/LibompMicroTests.cmake)
include(LibompMicroTests)
add_custom_target(libomp-micro-tests)
@@ -464,11 +454,18 @@ if(${LIBOMP_OMPT_SUPPORT})
endif()
-# Build the modules files if a Fortran compiler is available.
+# Build the module files if a Fortran compiler is available.
# Only LLVM_ENABLE_RUNTIMES=openmp is supported, LLVM_ENABLE_PROJECTS=openmp
# has been deprecated.
if(LIBOMP_FORTRAN_MODULES)
- add_library(libomp-mod OBJECT
+ configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
+ configure_file(${LIBOMP_INC_DIR}/omp_lib.F90.var omp_lib.F90 @ONLY)
+
+ # One compilation step creates both omp_lib.mod and omp_lib_kinds.mod. Only
+ # these files are used, the library itself can be discarded. Cannot use an
+ # OBJECT library to avoid creating the library because LibompExports.cmake
+ # attaches a POST_BUILD command to libomp-mod.
+ add_library(libomp-mod STATIC
omp_lib.F90
)
set_target_properties(libomp-mod PROPERTIES FOLDER "OpenMP/Fortran Modules")
@@ -491,3 +488,8 @@ if(LIBOMP_FORTRAN_MODULES)
DESTINATION ${destination}
)
endif()
+
+# Move files to exports/ directory if requested
+if(LIBOMP_COPY_EXPORTS)
+ include(LibompExports)
+endif()
>From d2473de8c9e3048647db685ec1f322032197ebd7 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 17:34:14 +0100
Subject: [PATCH 07/15] Simplify by not using macro
---
flang-rt/CMakeLists.txt | 11 +-
.../cmake/modules/FlangRTIntrospection.cmake | 4 +-
openmp/CMakeLists.txt | 6 +-
openmp/runtime/CMakeLists.txt | 10 +-
runtimes/CMakeLists.txt | 268 +++++++-----------
runtimes/cmake/Modules/HandleFortran.cmake | 63 ++++
6 files changed, 182 insertions(+), 180 deletions(-)
create mode 100644 runtimes/cmake/Modules/HandleFortran.cmake
diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index 8fa934dbdbf29..3708573005604 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -43,13 +43,11 @@ include(CMakePushCheckState)
############################
# Path to LLVM development tools (FileCheck, llvm-lit, not, ...)
-set(LLVM_TOOLS_DIR "${LLVM_BINARY_DIR}/bin")
+set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}")
# Fortran compiler not optional for building Flang-RT
enable_language(Fortran)
-flang_module_fortran_enable()
-
#################
# Build Options #
@@ -72,12 +70,11 @@ endif ()
if (LLVM_RUNTIMES_TARGET MATCHES "^amdgcn|^nvptx")
# Compiling libraries for offload targets is currently experimental;
- # only build the buildtin modules by default.
+ # Only build the builtin modules by default.
set(FLANG_RT_ENABLE_STATIC_default OFF)
else ()
set(FLANG_RT_ENABLE_STATIC_default ON)
endif ()
-
option(FLANG_RT_ENABLE_STATIC "Build Flang-RT as a static library." "${FLANG_RT_ENABLE_STATIC_default}")
if (WIN32)
# Windows DLL currently not implemented.
@@ -96,8 +93,8 @@ endif ()
if (FLANG_RT_ENABLE_STATIC OR FLANG_RT_ENABLE_SHARED)
option(FLANG_RT_INCLUDE_TESTS "Generate build targets for the flang-rt unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
else ()
- # Tests require at least one libraries
- message(STATUS "Testing disabled without either FLANG_RT_ENABLE_STATIC or FLANG_RT_ENABLE_SHARED")
+ # Tests require at least one of the libraries
+ message(STATUS "Testing disabled without either FLANG_RT_ENABLE_STATIC OR FLANG_RT_ENABLE_SHARED")
set(FLANG_RT_INCLUDE_TESTS OFF)
endif ()
diff --git a/flang-rt/cmake/modules/FlangRTIntrospection.cmake b/flang-rt/cmake/modules/FlangRTIntrospection.cmake
index c78c8a9b8a81a..10830ff1ac57e 100644
--- a/flang-rt/cmake/modules/FlangRTIntrospection.cmake
+++ b/flang-rt/cmake/modules/FlangRTIntrospection.cmake
@@ -16,9 +16,6 @@ include(CMakePushCheckState)
# build to ensure consistency of real(16) support between compiler and
# runtime.
#
-# * Does not work with Flang and CMake < 3.24; rely on an externally set
-# FORTRAN_SUPPORTS_REAL16 instead.
-#
# * cmake_push_check_state/cmake_pop_check_state is insufficient to isolate
# a compiler introspection environment, see
# https://gitlab.kitware.com/cmake/cmake/-/issues/27419
@@ -36,3 +33,4 @@ function (check_fortran_quadmath_support)
)
cmake_pop_check_state()
endfunction ()
+
diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt
index ad1916a96ca1c..e9f6e82482aff 100644
--- a/openmp/CMakeLists.txt
+++ b/openmp/CMakeLists.txt
@@ -112,11 +112,7 @@ set(OPENMP_TEST_FLAGS "" CACHE STRING
set(OPENMP_TEST_OPENMP_FLAGS ${OPENMP_TEST_COMPILER_OPENMP_FLAGS} CACHE STRING
"OpenMP compiler flag to use for testing OpenMP runtime libraries.")
set(OPENMP_TEST_Fortran_FLAGS "${CMAKE_Fortran_FLAGS}" CACHE STRING
- "Additional compiler flags to use for testing Fortran programs.")
-
-if (LLVM_RUNTIMES_BUILD)
- flang_module_fortran_enable()
-endif ()
+ "Additional compiler flags to use for testing Fortran programs (e.g. additional module search paths via -fintrinsic-modules-path )")
set(ENABLE_LIBOMPTARGET ON)
# Currently libomptarget cannot be compiled on Windows or MacOS X.
diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt
index 6ed1b19c4e054..895388a834de2 100644
--- a/openmp/runtime/CMakeLists.txt
+++ b/openmp/runtime/CMakeLists.txt
@@ -109,8 +109,14 @@ set(LIBOMP_MIC_ARCH knc CACHE STRING
if("${LIBOMP_ARCH}" STREQUAL "mic")
libomp_check_variable(LIBOMP_MIC_ARCH knf knc)
endif()
-set(LIBOMP_FORTRAN_MODULES "${RUNTIMES_FLANG_MODULES_ENABLED}" CACHE BOOL
- "Create Fortran module files? (requires fortran compiler)")
+
+if (LLVM_RUNTIMES_BUILD)
+ set(LIBOMP_FORTRAN_MODULES "${RUNTIMES_FLANG_MODULES_ENABLED}" CACHE BOOL
+ "Create Fortran module files? (requires fortran compiler)")
+else ()
+ set(LIBOMP_FORTRAN_MODULES OFF)
+endif ()
+
# - Support for universal fat binary builds on Mac
# - Having this extra variable allows people to build this library as a universal library
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 253a6d693d8a6..935946e8b523e 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -85,41 +85,81 @@ include(CheckLibraryExists)
include(LLVMCheckCompilerLinkerFlag)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
+include(GetToolchainDirs)
include(ExtendPath)
-# 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 used.
-if (CMAKE_VERSION VERSION_LESS "3.24" AND CMAKE_Fortran_COMPILER)
- 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")
+# Check whether the build environment supports building Fortran modules
+# flang-rt and openmp are the only runtimes that contain Fortran modules.
+set(FORTRAN_MODULE_DEPS "")
+if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR "openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
+ # 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 used.
+ if (CMAKE_VERSION VERSION_LESS "3.24" AND CMAKE_Fortran_COMPILER)
+ 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_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_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_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_FORMAT_FIXED_FLAG "-ffixed-form")
+ set(CMAKE_Fortran_FORMAT_FREE_FLAG "-ffree-form")
- set(CMAKE_Fortran_MODDIR_FLAG "-J")
+ set(CMAKE_Fortran_MODDIR_FLAG "-J")
- 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_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_COMPILE_OPTIONS_TARGET "--target=")
- set(CMAKE_Fortran_LINKER_WRAPPER_FLAG "-Wl,")
- set(CMAKE_Fortran_LINKER_WRAPPER_FLAG_SEP ",")
+ set(CMAKE_Fortran_LINKER_WRAPPER_FLAG "-Wl,")
+ set(CMAKE_Fortran_LINKER_WRAPPER_FLAG_SEP ",")
+ endif ()
endif ()
+
+ include(HandleFortran)
+ include(CheckFortranSourceCompiles)
+ include(CheckLanguage)
+
+ set(RUNTIMES_FLANG_MODULES_ENABLED_default OFF)
+ check_language(Fortran)
+ if (CMAKE_Fortran_COMPILER)
+ enable_language(Fortran)
+
+ if (CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang" AND "flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
+ # In a bootstrapping build (or any runtimes-build that includes flang-rt),
+ # the intrinsic modules are not built yet. Targets can depend on
+ # flang-rt-mod to ensure that flang-rt's modules are built first.
+ set(FORTRAN_MODULE_DEPS flang-rt-mod)
+ set(RUNTIMES_FLANG_MODULES_ENABLED_default ON)
+ else ()
+ # Check whether building modules works, avoid causing the entire build to
+ # fail because of Fortran. The primary situation we want to support here
+ # is Flang or its intrinsic modules were built separately in a
+ # non-bootstrapping build.
+ check_fortran_builtins_available()
+ if (HAVE_FORTRAN_INTRINSIC_MODS)
+ set(RUNTIMES_FLANG_MODULES_ENABLED_default ON)
+ message(STATUS "${LLVM_SUBPROJECT_TITLE}: Non-bootstrapping Fortran modules build (${CMAKE_Fortran_COMPILER_ID} located at ${CMAKE_Fortran_COMPILER})")
+ else ()
+ message(STATUS "Not compiling Flang modules: Not passing smoke check")
+ endif ()
+ endif ()
+ endif ()
+
+ option(RUNTIMES_FLANG_MODULES_ENABLED "Build Fortran modules" "${RUNTIMES_FLANG_MODULES_ENABLED_default}")
+else ()
+ set(RUNTIMES_FLANG_MODULES_ENABLED NO)
endif ()
@@ -242,7 +282,26 @@ message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
set(LLVM_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
+if(CMAKE_C_COMPILER_ID MATCHES "Clang")
+ set(option_prefix "")
+ if (CMAKE_C_SIMULATE_ID MATCHES "MSVC")
+ set(option_prefix "/clang:")
+ endif()
+ set(print_target_triple ${CMAKE_C_COMPILER} ${option_prefix}--target=${LLVM_DEFAULT_TARGET_TRIPLE} ${option_prefix}-print-target-triple)
+ execute_process(COMMAND ${print_target_triple}
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE output
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(result EQUAL 0)
+ set(LLVM_DEFAULT_TARGET_TRIPLE ${output})
+ else()
+ string(REPLACE ";" " " print_target_triple "${print_target_triple}")
+ # TODO(#97876): Report an error.
+ message(WARNING "Failed to execute `${print_target_triple}` to normalize target triple.")
+ endif()
+endif()
+# Determine output and install paths based on LLVM_TARGET_TRIPLE
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
@@ -284,7 +343,6 @@ endif()
# But the linker as invoked by the Flang driver also requires
# libflang_rt.so to be found when linking and the resource lib dir is
# the only reliable location.
-include(GetToolchainDirs)
get_toolchain_library_subdir(toolchain_lib_subdir)
extend_path(RUNTIMES_OUTPUT_RESOURCE_LIB_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "${toolchain_lib_subdir}")
@@ -297,24 +355,29 @@ cmake_path(NORMAL_PATH RUNTIMES_OUTPUT_RESOURCE_LIB_DIR)
cmake_path(NORMAL_PATH RUNTIMES_INSTALL_RESOURCE_LIB_PATH)
-if(CMAKE_C_COMPILER_ID MATCHES "Clang")
- set(option_prefix "")
- if (CMAKE_C_SIMULATE_ID MATCHES "MSVC")
- set(option_prefix "/clang:")
- endif()
- set(print_target_triple ${CMAKE_C_COMPILER} ${option_prefix}--target=${LLVM_DEFAULT_TARGET_TRIPLE} ${option_prefix}-print-target-triple)
- execute_process(COMMAND ${print_target_triple}
- RESULT_VARIABLE result
- OUTPUT_VARIABLE output
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- if(result EQUAL 0)
- set(LLVM_DEFAULT_TARGET_TRIPLE ${output})
- else()
- string(REPLACE ";" " " print_target_triple "${print_target_triple}")
- # TODO(#97876): Report an error.
- message(WARNING "Failed to execute `${print_target_triple}` to normalize target triple.")
- endif()
-endif()
+if (RUNTIMES_FLANG_MODULES_ENABLED)
+ if (CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
+ # Flang expects its builtin modules in Clang's resource directory
+ get_toolchain_module_subdir(toolchain_mod_subdir)
+ extend_path(RUNTIMES_OUTPUT_RESOURCE_MOD_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "${toolchain_mod_subdir}")
+ extend_path(RUNTIMES_INSTALL_RESOURCE_MOD_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH}" "${toolchain_mod_subdir}")
+ else ()
+ # For non-Flang compilers, avoid the risk of Flang accidentally picking them up.
+ extend_path(RUNTIMES_OUTPUT_RESOURCE_MOD_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "finclude-${CMAKE_Fortran_COMPILER_ID}")
+ extend_path(RUNTIMES_INSTALL_RESOURCE_MOD_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH}" "finclude-${CMAKE_Fortran_COMPILER_ID}")
+ endif ()
+ cmake_path(NORMAL_PATH RUNTIMES_OUTPUT_RESOURCE_MOD_DIR)
+ cmake_path(NORMAL_PATH RUNTIMES_INSTALL_RESOURCE_MOD_PATH)
+
+ # No way to find out which mod files are built by a target, so install the
+ # entire output directory
+ # https://stackoverflow.com/questions/52712416/cmake-fortran-module-directory-to-be-used-with-add-library
+ set(destination "${RUNTIMES_INSTALL_RESOURCE_MOD_PATH}/..")
+ cmake_path(NORMAL_PATH destination)
+ install(DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
+ DESTINATION "${destination}"
+ )
+endif ()
option(LLVM_INCLUDE_TESTS "Generate build targets for the runtimes unit tests." ON)
option(LLVM_INCLUDE_DOCS "Generate build targets for the runtimes documentation." ON)
@@ -408,127 +471,6 @@ if(LLVM_INCLUDE_TESTS)
umbrella_lit_testsuite_begin(check-runtimes)
endif()
-
-include(CheckFortranSourceCompiles)
-
-# Enable building Fortran modules
-# * Set up the Fortran compiler
-# * Determine files location in the Clang/Flang resource dir
-# * Install module files
-macro (flang_module_fortran_enable)
- # Assume flang modules are enabled until all tests pass
- set(FORTRAN_MODULE_DEPS "")
- set(RUNTIMES_FLANG_MODULES_ENABLED_default OFF)
-
- include(CheckLanguage)
- check_language(Fortran)
-
- if (CMAKE_Fortran_COMPILER)
- enable_language(Fortran)
-
- if (CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang" AND "flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES)
- # In a bootstrapping build, the intrinsic modules are not built yet.
- # Targets can depend on flang-rt-mod to ensure they are built before.
- set(FORTRAN_MODULE_DEPS flang-rt-mod)
- set(RUNTIMES_FLANG_MODULES_ENABLED_default ON)
- message(STATUS "${LLVM_SUBPROJECT_TITLE}: Building Fortran modules for Flang bootstrapping itself")
- else ()
- # Check whether building modules works, avoid causing the entire build to fail because of Fortran.
- # The primary situation we want to support here is Flang or its intrinsic modules were built separately in a non-bootstrapping build.
- cmake_push_check_state(RESET)
- set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
- check_fortran_source_compiles("
- subroutine testroutine
- use iso_c_binding
- end subroutine
- " HAVE_FORTRAN_INTRINSIC_MODS SRC_EXT F90)
- cmake_pop_check_state()
- if (HAVE_FORTRAN_INTRINSIC_MODS)
- set(RUNTIMES_FLANG_MODULES_ENABLED_default ON)
- message(STATUS "${LLVM_SUBPROJECT_TITLE}: Non-bootstrapping Fortran modules build (${CMAKE_Fortran_COMPILER_ID} located at ${CMAKE_Fortran_COMPILER})")
- else ()
- message(STATUS "Not compiling Flang modules: Not passing smoke check")
- endif ()
- endif ()
- else ()
- message(STATUS "Not compiling Flang modules: Fortran not enabled")
- endif ()
-
- option(RUNTIMES_FLANG_MODULES_ENABLED "Build Fortran modules" "${RUNTIMES_FLANG_MODULES_ENABLED_default}")
-
- if (RUNTIMES_FLANG_MODULES_ENABLED)
- if (CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
- get_toolchain_module_subdir(toolchain_mod_subdir)
- extend_path(RUNTIMES_OUTPUT_RESOURCE_MOD_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "${toolchain_mod_subdir}")
- extend_path(RUNTIMES_INSTALL_RESOURCE_MOD_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH}" "${toolchain_mod_subdir}")
- else ()
- # For non-Flang compilers, avoid the risk of Flang accidentally picking them up.
- extend_path(RUNTIMES_OUTPUT_RESOURCE_MOD_DIR "${RUNTIMES_OUTPUT_RESOURCE_DIR}" "finclude-${CMAKE_Fortran_COMPILER_ID}")
- extend_path(RUNTIMES_INSTALL_RESOURCE_MOD_PATH "${RUNTIMES_INSTALL_RESOURCE_PATH}" "finclude-${CMAKE_Fortran_COMPILER_ID}")
- endif ()
- cmake_path(NORMAL_PATH RUNTIMES_OUTPUT_RESOURCE_MOD_DIR)
- cmake_path(NORMAL_PATH RUNTIMES_INSTALL_RESOURCE_MOD_PATH)
-
- # Avoid module files to be installed multiple times if this macro is called multiple times
- get_property(is_installed GLOBAL PROPERTY RUNTIMES_MODS_INSTALLED)
- if (NOT is_installed)
- # No way to find out which mod files built by target individually, so install the entire output directory
- # https://stackoverflow.com/questions/52712416/cmake-fortran-module-directory-to-be-used-with-add-library
- set(destination "${RUNTIMES_INSTALL_RESOURCE_MOD_PATH}/..")
- cmake_path(NORMAL_PATH destination)
- install(DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
- DESTINATION "${destination}"
- )
- set_property(GLOBAL PROPERTY RUNTIMES_MODS_INSTALLED TRUE)
- endif ()
- endif ()
-endmacro ()
-
-
-# Set options to compile Fortran module files.
-#
-# Usage:
-#
-# flang_module_target(name
-# PUBLIC
-# Modules files are to be used by other Fortran sources. If a library is
-# compiled multiple times (e.g. static/shared, or msvcrt variants), only
-# one of those can be public module files; non-public modules are still
-# generated but to be forgotten deep inside the build directory to not
-# conflict with each other.
-# Also, installs the module with the toolchain.
-# )
-function (flang_module_target tgtname)
- set(options PUBLIC)
- cmake_parse_arguments(ARG
- "${options}"
- ""
- ""
- ${ARGN})
-
- if (NOT RUNTIMES_FLANG_MODULES_ENABLED)
- return ()
- endif ()
-
- # Let it find the other public module files
- target_compile_options(${tgtname} PRIVATE
- "$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
- )
-
- if (ARG_PUBLIC)
- set_target_properties(${tgtname}
- PROPERTIES
- Fortran_MODULE_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
- )
- else ()
- set_target_properties(${tgtname}
- PROPERTIES
- Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${tgtname}.mod"
- )
- endif ()
-endfunction ()
-
-
# We do this in two loops so that HAVE_* is set for each runtime before the
# other runtimes are added.
foreach(entry ${runtimes})
diff --git a/runtimes/cmake/Modules/HandleFortran.cmake b/runtimes/cmake/Modules/HandleFortran.cmake
new file mode 100644
index 0000000000000..864852a09c849
--- /dev/null
+++ b/runtimes/cmake/Modules/HandleFortran.cmake
@@ -0,0 +1,63 @@
+
+
+# Check whether the Fortran compiler already access to builtin modules.
+#
+# This must be wrapped in a function because
+# cmake_push_check_state/cmake_pop_check_state is insufficient to isolate
+# a compiler introspection environment, see
+# https://gitlab.kitware.com/cmake/cmake/-/issues/27419
+function (check_fortran_builtins_available)
+ cmake_push_check_state(RESET)
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
+ check_fortran_source_compiles("
+ subroutine testroutine
+ use iso_c_binding
+ end subroutine
+ " HAVE_FORTRAN_INTRINSIC_MODS SRC_EXT F90)
+ cmake_pop_check_state()
+endfunction ()
+
+
+# Set options to compile Fortran module files.
+#
+# Usage:
+#
+# flang_module_target(name
+# PUBLIC
+# Modules files are to be used by other Fortran sources. If a library is
+# compiled multiple times (e.g. static/shared, or msvcrt variants), only
+# one of those can be public module files; non-public modules are still
+# generated but to be forgotten deep inside the build directory to not
+# conflict with each other.
+# Also, installs the module with the toolchain.
+# )
+function (flang_module_target tgtname)
+ set(options PUBLIC)
+ cmake_parse_arguments(ARG
+ "${options}"
+ ""
+ ""
+ ${ARGN})
+
+ if (NOT RUNTIMES_FLANG_MODULES_ENABLED)
+ message(WARNING "Cannot build module files for ${tgtname} when RUNTIMES_FLANG_MODULES_ENABLED is ${RUNTIMES_FLANG_MODULES_ENABLED}")
+ return ()
+ endif ()
+
+ # Let it find the other public module files
+ target_compile_options(${tgtname} PRIVATE
+ "$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
+ )
+
+ if (ARG_PUBLIC)
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
+ )
+ else ()
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${tgtname}.mod"
+ )
+ endif ()
+endfunction ()
\ No newline at end of file
>From 5ed80b91d2b27c8d628ca76d3b1a2713951f414c Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 20:04:23 +0100
Subject: [PATCH 08/15] Solve CMAKE_Fortran_PREPROCESS_SOURCE issue
---
runtimes/CMakeLists.txt | 2 +-
runtimes/cmake/Modules/HandleFortran.cmake | 149 ++++++++++++---------
2 files changed, 88 insertions(+), 63 deletions(-)
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 935946e8b523e..a836b489a0b53 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -145,7 +145,7 @@ if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR "openmp" IN_LIST LLVM_ENABLE_RUNT
else ()
# Check whether building modules works, avoid causing the entire build to
# fail because of Fortran. The primary situation we want to support here
- # is Flang or its intrinsic modules were built separately in a
+ # is Flang, or its intrinsic modules were built separately in a
# non-bootstrapping build.
check_fortran_builtins_available()
if (HAVE_FORTRAN_INTRINSIC_MODS)
diff --git a/runtimes/cmake/Modules/HandleFortran.cmake b/runtimes/cmake/Modules/HandleFortran.cmake
index 864852a09c849..4bbcafa7fb794 100644
--- a/runtimes/cmake/Modules/HandleFortran.cmake
+++ b/runtimes/cmake/Modules/HandleFortran.cmake
@@ -1,63 +1,88 @@
-
-
-# Check whether the Fortran compiler already access to builtin modules.
-#
-# This must be wrapped in a function because
-# cmake_push_check_state/cmake_pop_check_state is insufficient to isolate
-# a compiler introspection environment, see
-# https://gitlab.kitware.com/cmake/cmake/-/issues/27419
-function (check_fortran_builtins_available)
- cmake_push_check_state(RESET)
- set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
- check_fortran_source_compiles("
- subroutine testroutine
- use iso_c_binding
- end subroutine
- " HAVE_FORTRAN_INTRINSIC_MODS SRC_EXT F90)
- cmake_pop_check_state()
-endfunction ()
-
-
-# Set options to compile Fortran module files.
-#
-# Usage:
-#
-# flang_module_target(name
-# PUBLIC
-# Modules files are to be used by other Fortran sources. If a library is
-# compiled multiple times (e.g. static/shared, or msvcrt variants), only
-# one of those can be public module files; non-public modules are still
-# generated but to be forgotten deep inside the build directory to not
-# conflict with each other.
-# Also, installs the module with the toolchain.
-# )
-function (flang_module_target tgtname)
- set(options PUBLIC)
- cmake_parse_arguments(ARG
- "${options}"
- ""
- ""
- ${ARGN})
-
- if (NOT RUNTIMES_FLANG_MODULES_ENABLED)
- message(WARNING "Cannot build module files for ${tgtname} when RUNTIMES_FLANG_MODULES_ENABLED is ${RUNTIMES_FLANG_MODULES_ENABLED}")
- return ()
- endif ()
-
- # Let it find the other public module files
- target_compile_options(${tgtname} PRIVATE
- "$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
- )
-
- if (ARG_PUBLIC)
- set_target_properties(${tgtname}
- PROPERTIES
- Fortran_MODULE_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
- )
- else ()
- set_target_properties(${tgtname}
- PROPERTIES
- Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${tgtname}.mod"
- )
- endif ()
+
+
+# Check whether the Fortran compiler already access to builtin modules. Sets
+# HAVE_FORTRAN_INTRINSIC_MODS when returning.
+#
+# This must be wrapped in a function because
+# cmake_push_check_state/cmake_pop_check_state is insufficient to isolate
+# a compiler introspection environment, see
+# https://gitlab.kitware.com/cmake/cmake/-/issues/27419
+function (check_fortran_builtins_available)
+ if (CMAKE_Fortran_COMPILER_FORCED AND CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
+ # CMake's try_compile does not take a user-defined
+ # CMAKE_Fortran_PREPROCESS_SOURCE into account. Instead of test-compiling,
+ # ask Flang directly for the builtin module files.
+ if (NOT DEFINED HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD)
+ message(STATUS "Performing Test ISO_C_BINDING_PATH")
+ execute_process(
+ COMMAND ${CMAKE_Fortran_COMPILER} ${CMAKE_Fortran_FLAGS} "-print-file-name=iso_c_binding.mod"
+ OUTPUT_VARIABLE ISO_C_BINDING_PATH
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+ )
+ set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD "" )
+ if (EXISTS "${ISO_C_BINDING_PATH}")
+ message(STATUS "Performing Test ISO_C_BINDING_PATH -- Success")
+ set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD TRUE CACHE INTERNAL "Existence result of ${CMAKE_Fortran_COMPILER} -print-file-name=iso_c_binding.mod")
+ else ()
+ message(STATUS "Performing Test ISO_C_BINDING_PATH -- Failed")
+ set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD FALSE CACHE INTERNAL "Existence result of ${CMAKE_Fortran_COMPILER} -print-file-name=iso_c_binding.mod")
+ endif ()
+ endif ()
+ else ()
+ cmake_push_check_state(RESET)
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
+ check_fortran_source_compiles("
+ subroutine testroutine
+ use iso_c_binding
+ end subroutine
+ " HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD SRC_EXT F90)
+ cmake_pop_check_state()
+ endif ()
+ set(HAVE_FORTRAN_INTRINSIC_MODS "${HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD}" PARENT_SCOPE)
+endfunction ()
+
+
+# Set options to compile Fortran module files.
+#
+# Usage:
+#
+# flang_module_target(name
+# PUBLIC
+# Modules files are to be used by other Fortran sources. If a library is
+# compiled multiple times (e.g. static/shared, or msvcrt variants), only
+# one of those can be public module files; non-public modules are still
+# generated but to be forgotten deep inside the build directory to not
+# conflict with each other.
+# Also, installs the module with the toolchain.
+# )
+function (flang_module_target tgtname)
+ set(options PUBLIC)
+ cmake_parse_arguments(ARG
+ "${options}"
+ ""
+ ""
+ ${ARGN})
+
+ if (NOT RUNTIMES_FLANG_MODULES_ENABLED)
+ message(WARNING "Cannot build module files for ${tgtname} when RUNTIMES_FLANG_MODULES_ENABLED is ${RUNTIMES_FLANG_MODULES_ENABLED}")
+ return ()
+ endif ()
+
+ # Let it find the other public module files
+ target_compile_options(${tgtname} PRIVATE
+ "$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
+ )
+
+ if (ARG_PUBLIC)
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
+ )
+ else ()
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${tgtname}.mod"
+ )
+ endif ()
endfunction ()
\ No newline at end of file
>From 66f574059b06283f50960d70bbbd17ada2e2f39e Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 20:17:55 +0100
Subject: [PATCH 09/15] Add TODO comment
---
openmp/runtime/src/CMakeLists.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/openmp/runtime/src/CMakeLists.txt b/openmp/runtime/src/CMakeLists.txt
index 23b178077ed3f..ff70fe167ad0e 100644
--- a/openmp/runtime/src/CMakeLists.txt
+++ b/openmp/runtime/src/CMakeLists.txt
@@ -457,6 +457,8 @@ endif()
# Build the module files if a Fortran compiler is available.
# Only LLVM_ENABLE_RUNTIMES=openmp is supported, LLVM_ENABLE_PROJECTS=openmp
# has been deprecated.
+# TODO: openmp/runtimes/CMakeLists.txt is only included for host
+# (non-amdgpu/nvptx) targets, but device side code needs a module as well.
if(LIBOMP_FORTRAN_MODULES)
configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
configure_file(${LIBOMP_INC_DIR}/omp_lib.F90.var omp_lib.F90 @ONLY)
>From 52cf5b3316b47b08c1c543a3cffe9532c371c7a2 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 20:40:00 +0100
Subject: [PATCH 10/15] Post-merge fixes
---
flang/lib/Frontend/CompilerInvocation.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 5d432ad1faea8..ace24e09d86ec 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1562,7 +1562,7 @@ bool CompilerInvocation::createFromArgs(
args.getLastArg(clang::options::OPT_resource_dir))
invoc.resourceDir = a->getValue();
else
- invoc.resourceDir = clang::driver::Driver::GetResourcesPath(
+ invoc.resourceDir = clang::GetResourcesPath(
llvm::sys::fs::getMainExecutable(argv0, nullptr));
// -flang-experimental-hlfir
>From 109050c17e334f8156eb32de97bdc8a6041ca797 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Wed, 26 Nov 2025 21:40:26 +0100
Subject: [PATCH 11/15] Integrate HandleFortran again
---
runtimes/CMakeLists.txt | 90 +++++++++++++++++++++-
runtimes/cmake/Modules/HandleFortran.cmake | 88 ---------------------
2 files changed, 89 insertions(+), 89 deletions(-)
delete mode 100644 runtimes/cmake/Modules/HandleFortran.cmake
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index a836b489a0b53..05a134d0917dd 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -89,6 +89,95 @@ include(GetToolchainDirs)
include(ExtendPath)
+
+
+# Check whether the Fortran compiler already access to builtin modules. Sets
+# HAVE_FORTRAN_INTRINSIC_MODS when returning.
+#
+# This must be wrapped in a function because
+# cmake_push_check_state/cmake_pop_check_state is insufficient to isolate
+# a compiler introspection environment, see
+# https://gitlab.kitware.com/cmake/cmake/-/issues/27419
+function (check_fortran_builtins_available)
+ if (CMAKE_Fortran_COMPILER_FORCED AND CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
+ # CMake's try_compile does not take a user-defined
+ # CMAKE_Fortran_PREPROCESS_SOURCE into account. Instead of test-compiling,
+ # ask Flang directly for the builtin module files.
+ if (NOT DEFINED HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD)
+ message(STATUS "Performing Test ISO_C_BINDING_PATH")
+ execute_process(
+ COMMAND ${CMAKE_Fortran_COMPILER} ${CMAKE_Fortran_FLAGS} "-print-file-name=iso_c_binding.mod"
+ OUTPUT_VARIABLE ISO_C_BINDING_PATH
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+ )
+ set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD "" )
+ if (EXISTS "${ISO_C_BINDING_PATH}")
+ message(STATUS "Performing Test ISO_C_BINDING_PATH -- Success")
+ set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD TRUE CACHE INTERNAL "Existence result of ${CMAKE_Fortran_COMPILER} -print-file-name=iso_c_binding.mod")
+ else ()
+ message(STATUS "Performing Test ISO_C_BINDING_PATH -- Failed")
+ set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD FALSE CACHE INTERNAL "Existence result of ${CMAKE_Fortran_COMPILER} -print-file-name=iso_c_binding.mod")
+ endif ()
+ endif ()
+ else ()
+ cmake_push_check_state(RESET)
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
+ check_fortran_source_compiles("
+ subroutine testroutine
+ use iso_c_binding
+ end subroutine
+ " HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD SRC_EXT F90)
+ cmake_pop_check_state()
+ endif ()
+ set(HAVE_FORTRAN_INTRINSIC_MODS "${HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD}" PARENT_SCOPE)
+endfunction ()
+
+
+# Set options to compile Fortran module files.
+#
+# Usage:
+#
+# flang_module_target(name
+# PUBLIC
+# Modules files are to be used by other Fortran sources. If a library is
+# compiled multiple times (e.g. static/shared, or msvcrt variants), only
+# one of those can be public module files; non-public modules are still
+# generated but to be forgotten deep inside the build directory to not
+# conflict with each other.
+# Also, installs the module with the toolchain.
+# )
+function (flang_module_target tgtname)
+ set(options PUBLIC)
+ cmake_parse_arguments(ARG
+ "${options}"
+ ""
+ ""
+ ${ARGN})
+
+ if (NOT RUNTIMES_FLANG_MODULES_ENABLED)
+ message(WARNING "Cannot build module files for ${tgtname} when RUNTIMES_FLANG_MODULES_ENABLED is ${RUNTIMES_FLANG_MODULES_ENABLED}")
+ return ()
+ endif ()
+
+ # Let it find the other public module files
+ target_compile_options(${tgtname} PRIVATE
+ "$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
+ )
+
+ if (ARG_PUBLIC)
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
+ )
+ else ()
+ set_target_properties(${tgtname}
+ PROPERTIES
+ Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${tgtname}.mod"
+ )
+ endif ()
+endfunction ()
+
# Check whether the build environment supports building Fortran modules
# flang-rt and openmp are the only runtimes that contain Fortran modules.
set(FORTRAN_MODULE_DEPS "")
@@ -127,7 +216,6 @@ if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR "openmp" IN_LIST LLVM_ENABLE_RUNT
endif ()
endif ()
- include(HandleFortran)
include(CheckFortranSourceCompiles)
include(CheckLanguage)
diff --git a/runtimes/cmake/Modules/HandleFortran.cmake b/runtimes/cmake/Modules/HandleFortran.cmake
deleted file mode 100644
index 4bbcafa7fb794..0000000000000
--- a/runtimes/cmake/Modules/HandleFortran.cmake
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-# Check whether the Fortran compiler already access to builtin modules. Sets
-# HAVE_FORTRAN_INTRINSIC_MODS when returning.
-#
-# This must be wrapped in a function because
-# cmake_push_check_state/cmake_pop_check_state is insufficient to isolate
-# a compiler introspection environment, see
-# https://gitlab.kitware.com/cmake/cmake/-/issues/27419
-function (check_fortran_builtins_available)
- if (CMAKE_Fortran_COMPILER_FORCED AND CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang")
- # CMake's try_compile does not take a user-defined
- # CMAKE_Fortran_PREPROCESS_SOURCE into account. Instead of test-compiling,
- # ask Flang directly for the builtin module files.
- if (NOT DEFINED HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD)
- message(STATUS "Performing Test ISO_C_BINDING_PATH")
- execute_process(
- COMMAND ${CMAKE_Fortran_COMPILER} ${CMAKE_Fortran_FLAGS} "-print-file-name=iso_c_binding.mod"
- OUTPUT_VARIABLE ISO_C_BINDING_PATH
- OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_QUIET
- )
- set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD "" )
- if (EXISTS "${ISO_C_BINDING_PATH}")
- message(STATUS "Performing Test ISO_C_BINDING_PATH -- Success")
- set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD TRUE CACHE INTERNAL "Existence result of ${CMAKE_Fortran_COMPILER} -print-file-name=iso_c_binding.mod")
- else ()
- message(STATUS "Performing Test ISO_C_BINDING_PATH -- Failed")
- set(HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD FALSE CACHE INTERNAL "Existence result of ${CMAKE_Fortran_COMPILER} -print-file-name=iso_c_binding.mod")
- endif ()
- endif ()
- else ()
- cmake_push_check_state(RESET)
- set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
- check_fortran_source_compiles("
- subroutine testroutine
- use iso_c_binding
- end subroutine
- " HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD SRC_EXT F90)
- cmake_pop_check_state()
- endif ()
- set(HAVE_FORTRAN_INTRINSIC_MODS "${HAVE_FORTRAN_HAS_ISO_C_BINDING_MOD}" PARENT_SCOPE)
-endfunction ()
-
-
-# Set options to compile Fortran module files.
-#
-# Usage:
-#
-# flang_module_target(name
-# PUBLIC
-# Modules files are to be used by other Fortran sources. If a library is
-# compiled multiple times (e.g. static/shared, or msvcrt variants), only
-# one of those can be public module files; non-public modules are still
-# generated but to be forgotten deep inside the build directory to not
-# conflict with each other.
-# Also, installs the module with the toolchain.
-# )
-function (flang_module_target tgtname)
- set(options PUBLIC)
- cmake_parse_arguments(ARG
- "${options}"
- ""
- ""
- ${ARGN})
-
- if (NOT RUNTIMES_FLANG_MODULES_ENABLED)
- message(WARNING "Cannot build module files for ${tgtname} when RUNTIMES_FLANG_MODULES_ENABLED is ${RUNTIMES_FLANG_MODULES_ENABLED}")
- return ()
- endif ()
-
- # Let it find the other public module files
- target_compile_options(${tgtname} PRIVATE
- "$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
- )
-
- if (ARG_PUBLIC)
- set_target_properties(${tgtname}
- PROPERTIES
- Fortran_MODULE_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}"
- )
- else ()
- set_target_properties(${tgtname}
- PROPERTIES
- Fortran_MODULE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${tgtname}.mod"
- )
- endif ()
-endfunction ()
\ No newline at end of file
>From 7732534216ede9d5cff2fcb1868479cb69a33618 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 27 Nov 2025 00:10:00 +0100
Subject: [PATCH 12/15] Build omp_lib.mod on device
---
flang-rt/CMakeLists.txt | 14 ++--
flang-rt/cmake/modules/AddFlangRT.cmake | 12 +--
.../cmake/modules/AddFlangRTOffload.cmake | 3 +-
openmp/CMakeLists.txt | 29 +++++++
openmp/{runtime => }/cmake/LibompUtils.cmake | 0
openmp/module/CMakeLists.txt | 30 ++++++++
.../src/include => module}/omp_lib.F90.var | 0
openmp/runtime/CMakeLists.txt | 23 +-----
openmp/runtime/cmake/LibompExports.cmake | 6 +-
openmp/runtime/src/CMakeLists.txt | 40 ++--------
runtimes/CMakeLists.txt | 76 +++++++++++++++----
11 files changed, 144 insertions(+), 89 deletions(-)
rename openmp/{runtime => }/cmake/LibompUtils.cmake (100%)
create mode 100644 openmp/module/CMakeLists.txt
rename openmp/{runtime/src/include => module}/omp_lib.F90.var (100%)
diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index 3708573005604..bb49f3681b5d0 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -43,7 +43,7 @@ include(CMakePushCheckState)
############################
# Path to LLVM development tools (FileCheck, llvm-lit, not, ...)
-set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}")
+set(LLVM_TOOLS_DIR "${LLVM_BINARY_DIR}/bin")
# Fortran compiler not optional for building Flang-RT
enable_language(Fortran)
@@ -113,14 +113,8 @@ elseif (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
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
-else ()
- message(FATAL_ERROR "Invalid value '${FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT}' for FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT; must be empty, 'CUDA', or 'OpenMP'")
-endif ()
-
-
-if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP" OR LLVM_TARGET_TRIPLE MATCHES "^nvptx")
- set(FLANG_RT_DEVICE_ARCHITECTURES "all" CACHE STRING
- "List of offload device architectures to be used to compile the Fortran runtime (e.g. 'gfx1103;sm_90')"
+ set(FLANG_RT_DEVICE_ARCHITECTURES "${RUNTIMES_DEVICE_ARCHITECTURES}" 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")
@@ -139,6 +133,8 @@ if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP" OR LLVM_TARGET_TRIPL
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 ()
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index ea4f920e1d877..0ba485a79beb8 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -234,14 +234,11 @@ function (add_flangrt_library name)
target_compile_features(${tgtname} PRIVATE cxx_std_17)
target_compile_options(${tgtname} PRIVATE
- # Always enable preprocessor regardless of file extention
+ # Always enable preprocessor regardless of file extension
"$<$<COMPILE_LANGUAGE:Fortran>:-cpp>"
- # Missing type descriptors are expected for intrinsic modules
+ # Missing type descriptors are expected for intrinsic modules
"$<$<COMPILE_LANGUAGE:Fortran>:SHELL:-mmlir;SHELL:-ignore-missing-type-desc>"
-
- # Flang bug workaround: Reformating of cooked token buffer causes identifier to be split between lines
- "$<$<COMPILE_LANGUAGE:Fortran>:SHELL:-Xflang;SHELL:-fno-reformat>"
)
# When building the flang runtime if LTO is enabled the archive file
@@ -300,11 +297,6 @@ function (add_flangrt_library name)
target_compile_options(${tgtname} PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-nogpulib -flto -fvisibility=hidden -Wno-unknown-cuda-version --cuda-feature=+ptx63>
)
- foreach (_arch IN LISTS FLANG_RT_DEVICE_ARCHITECTURES)
- target_compile_options(${tgtname} PRIVATE
- -march=${_arch}
- )
- endforeach()
elseif (APPLE)
# Clang on Darwin enables non-POSIX extensions by default.
# This causes some macros to leak, such as HUGE from <math.h>, which
diff --git a/flang-rt/cmake/modules/AddFlangRTOffload.cmake b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
index 4a6f047a86af2..5b6464741c9c9 100644
--- a/flang-rt/cmake/modules/AddFlangRTOffload.cmake
+++ b/flang-rt/cmake/modules/AddFlangRTOffload.cmake
@@ -106,7 +106,8 @@ macro(enable_omp_offload_compilation name files)
PROPERTIES COMPILE_DEFINITIONS OMP_OFFLOAD_BUILD
)
- # If building flang-rt together with libomp, ensure that libomp is built first and found because -fopenmp will try to link it.
+ # If building flang-rt together with libomp, ensure that libomp is built
+ # first and found because -fopenmp will try to link it.
if (TARGET omp)
add_dependencies(${name} omp)
target_link_options(${name}.static PUBLIC "-L$<TARGET_FILE_DIR:omp>")
diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt
index e9f6e82482aff..b93d8c5701210 100644
--- a/openmp/CMakeLists.txt
+++ b/openmp/CMakeLists.txt
@@ -95,6 +95,24 @@ endif()
# Check and set up common compiler flags.
include(config-ix)
include(HandleOpenMPOptions)
+include(LibompUtils)
+
+
+# Set libomp version
+set(LIBOMP_VERSION_MAJOR 5)
+set(LIBOMP_VERSION_MINOR 0)
+
+# Set the OpenMP Year and Month associated with version
+set(LIBOMP_OMP_YEAR_MONTH 201611)
+
+# Get the build number from kmp_version.cpp
+libomp_get_build_number("${CMAKE_CURRENT_SOURCE_DIR}/runtime" LIBOMP_VERSION_BUILD)
+math(EXPR LIBOMP_VERSION_BUILD_YEAR "${LIBOMP_VERSION_BUILD}/10000")
+math(EXPR LIBOMP_VERSION_BUILD_MONTH_DAY "${LIBOMP_VERSION_BUILD}%10000")
+
+# Currently don't record any timestamps
+set(LIBOMP_BUILD_DATE "No_Timestamp")
+
# Check for flang
set(OPENMP_TEST_Fortran_COMPILER_default "")
@@ -104,6 +122,13 @@ endif ()
set(OPENMP_TEST_Fortran_COMPILER "${OPENMP_TEST_Fortran_COMPILER_default}" CACHE STRING
"Fortran compiler to use for testing OpenMP runtime libraries.")
+if (LLVM_RUNTIMES_BUILD)
+ set(LIBOMP_FORTRAN_MODULES "${RUNTIMES_FLANG_MODULES_ENABLED}" CACHE BOOL
+ "Create Fortran module files? (requires fortran compiler)")
+else ()
+ set(LIBOMP_FORTRAN_MODULES OFF)
+endif ()
+
# Set up testing infrastructure.
include(OpenMPTesting)
@@ -136,6 +161,10 @@ else()
get_clang_resource_dir(LIBOMP_HEADERS_INSTALL_PATH SUBDIR include)
endif()
+if(LIBOMP_FORTRAN_MODULES)
+ add_subdirectory(module)
+endif()
+
# Use the current compiler target to determine the appropriate runtime to build.
if("${LLVM_DEFAULT_TARGET_TRIPLE}" MATCHES "^amdgcn|^nvptx" OR
"${CMAKE_CXX_COMPILER_TARGET}" MATCHES "^amdgcn|^nvptx")
diff --git a/openmp/runtime/cmake/LibompUtils.cmake b/openmp/cmake/LibompUtils.cmake
similarity index 100%
rename from openmp/runtime/cmake/LibompUtils.cmake
rename to openmp/cmake/LibompUtils.cmake
diff --git a/openmp/module/CMakeLists.txt b/openmp/module/CMakeLists.txt
new file mode 100644
index 0000000000000..29f7816aa5998
--- /dev/null
+++ b/openmp/module/CMakeLists.txt
@@ -0,0 +1,30 @@
+#//===----------------------------------------------------------------------===//
+#//
+#// 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 the module files if a Fortran compiler is available.
+# Only LLVM_ENABLE_RUNTIMES=openmp is supported, LLVM_ENABLE_PROJECTS=openmp
+# has been deprecated.
+
+configure_file(omp_lib.F90.var "{CMAKE_CURRENT_BINARY_DIR}/omp_lib.F90" @ONLY)
+
+# One compilation step creates both omp_lib.mod and omp_lib_kinds.mod. Only
+# these files are used, the object file itself can be discarded.
+# FIXME: Adding it to libomp.so would allow implementing Fortran API in Fortran
+add_library(libomp-mod OBJECT
+ "{CMAKE_CURRENT_BINARY_DIR}/omp_lib.F90"
+)
+set_target_properties(libomp-mod PROPERTIES FOLDER "OpenMP/Fortran Modules")
+
+if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
+ target_compile_options(libomp-mod PRIVATE -fno-range-check)
+endif()
+
+flang_module_target(libomp-mod PUBLIC)
+if (FORTRAN_MODULE_DEPS)
+ add_dependencies(libomp-mod ${FORTRAN_MODULE_DEPS})
+endif ()
diff --git a/openmp/runtime/src/include/omp_lib.F90.var b/openmp/module/omp_lib.F90.var
similarity index 100%
rename from openmp/runtime/src/include/omp_lib.F90.var
rename to openmp/module/omp_lib.F90.var
diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt
index 895388a834de2..dc0e0e7a81e7c 100644
--- a/openmp/runtime/CMakeLists.txt
+++ b/openmp/runtime/CMakeLists.txt
@@ -15,10 +15,6 @@ endif()
# Add cmake directory to search for custom cmake functions
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
-# Set libomp version
-set(LIBOMP_VERSION_MAJOR 5)
-set(LIBOMP_VERSION_MINOR 0)
-
# These include files are in the cmake/ subdirectory
include(LibompUtils)
include(LibompGetArchitecture)
@@ -102,21 +98,12 @@ libomp_check_variable(LIBOMP_ARCH 32e x86_64 32 i386 arm ppc ppc64 ppc64le aarch
set(LIBOMP_LIB_TYPE normal CACHE STRING
"Performance,Profiling,Stubs library (normal/profile/stubs)")
libomp_check_variable(LIBOMP_LIB_TYPE normal profile stubs)
-# Set the OpenMP Year and Month associated with version
-set(LIBOMP_OMP_YEAR_MONTH 201611)
set(LIBOMP_MIC_ARCH knc CACHE STRING
"Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture) (knf/knc). Ignored if not Intel(R) MIC Architecture build.")
if("${LIBOMP_ARCH}" STREQUAL "mic")
libomp_check_variable(LIBOMP_MIC_ARCH knf knc)
endif()
-if (LLVM_RUNTIMES_BUILD)
- set(LIBOMP_FORTRAN_MODULES "${RUNTIMES_FLANG_MODULES_ENABLED}" CACHE BOOL
- "Create Fortran module files? (requires fortran compiler)")
-else ()
- set(LIBOMP_FORTRAN_MODULES OFF)
-endif ()
-
# - Support for universal fat binary builds on Mac
# - Having this extra variable allows people to build this library as a universal library
@@ -167,14 +154,6 @@ set(LIBOMP_USE_HWLOC FALSE CACHE BOOL
set(LIBOMP_HWLOC_INSTALL_DIR /usr/local CACHE PATH
"Install path for hwloc library")
-# Get the build number from kmp_version.cpp
-libomp_get_build_number("${CMAKE_CURRENT_SOURCE_DIR}" LIBOMP_VERSION_BUILD)
-math(EXPR LIBOMP_VERSION_BUILD_YEAR "${LIBOMP_VERSION_BUILD}/10000")
-math(EXPR LIBOMP_VERSION_BUILD_MONTH_DAY "${LIBOMP_VERSION_BUILD}%10000")
-
-# Currently don't record any timestamps
-set(LIBOMP_BUILD_DATE "No_Timestamp")
-
# Architecture
set(IA32 FALSE)
set(INTEL64 FALSE)
@@ -477,3 +456,5 @@ set(LIBOMP_OMP_TOOLS_INCLUDE_DIR ${LIBOMP_OMP_TOOLS_INCLUDE_DIR} PARENT_SCOPE)
# make these variables available for tools/libompd:
set(LIBOMP_SRC_DIR ${LIBOMP_SRC_DIR} PARENT_SCOPE)
set(LIBOMP_OMPD_SUPPORT ${LIBOMP_OMPD_SUPPORT} PARENT_SCOPE)
+
+
diff --git a/openmp/runtime/cmake/LibompExports.cmake b/openmp/runtime/cmake/LibompExports.cmake
index 662c207f8904f..5b50c570519fb 100644
--- a/openmp/runtime/cmake/LibompExports.cmake
+++ b/openmp/runtime/cmake/LibompExports.cmake
@@ -65,12 +65,14 @@ if(${LIBOMP_OMPT_SUPPORT})
)
endif()
if(${LIBOMP_FORTRAN_MODULES})
- add_custom_command(TARGET libomp-mod POST_BUILD
+ # We cannot attach a POST_BUILD command to libomp-mod, so instead attach it
+ # to omp and ensure that libomp-mod is built befoe by adding a dependency
+ add_custom_command(TARGET omp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBOMP_EXPORTS_MOD_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}/omp_lib.mod ${LIBOMP_EXPORTS_MOD_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}/omp_lib_kinds.mod ${LIBOMP_EXPORTS_MOD_DIR}
)
-
+ add_dependencies(omp libomp-mod)
add_custom_command(TARGET omp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy omp_lib.h ${LIBOMP_EXPORTS_CMN_DIR}
)
diff --git a/openmp/runtime/src/CMakeLists.txt b/openmp/runtime/src/CMakeLists.txt
index ff70fe167ad0e..40a94721bb7aa 100644
--- a/openmp/runtime/src/CMakeLists.txt
+++ b/openmp/runtime/src/CMakeLists.txt
@@ -377,6 +377,13 @@ if(WIN32)
endif()
endif()
+configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
+
+# Move files to exports/ directory if requested
+if(${LIBOMP_COPY_EXPORTS})
+ include(LibompExports)
+endif()
+
# Micro test rules for after library has been built (cmake/LibompMicroTests.cmake)
include(LibompMicroTests)
add_custom_target(libomp-micro-tests)
@@ -452,35 +459,7 @@ if(${LIBOMP_OMPT_SUPPORT})
install(FILES ${LIBOMP_HEADERS_INTDIR}/omp-tools.h DESTINATION ${LIBOMP_HEADERS_INSTALL_PATH} RENAME ompt.h)
set(LIBOMP_OMP_TOOLS_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
endif()
-
-
-# Build the module files if a Fortran compiler is available.
-# Only LLVM_ENABLE_RUNTIMES=openmp is supported, LLVM_ENABLE_PROJECTS=openmp
-# has been deprecated.
-# TODO: openmp/runtimes/CMakeLists.txt is only included for host
-# (non-amdgpu/nvptx) targets, but device side code needs a module as well.
if(LIBOMP_FORTRAN_MODULES)
- configure_file(${LIBOMP_INC_DIR}/omp_lib.h.var omp_lib.h @ONLY)
- configure_file(${LIBOMP_INC_DIR}/omp_lib.F90.var omp_lib.F90 @ONLY)
-
- # One compilation step creates both omp_lib.mod and omp_lib_kinds.mod. Only
- # these files are used, the library itself can be discarded. Cannot use an
- # OBJECT library to avoid creating the library because LibompExports.cmake
- # attaches a POST_BUILD command to libomp-mod.
- add_library(libomp-mod STATIC
- omp_lib.F90
- )
- set_target_properties(libomp-mod PROPERTIES FOLDER "OpenMP/Fortran Modules")
-
- if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
- target_compile_options(libomp-mod PRIVATE -fno-range-check)
- endif()
-
- flang_module_target(libomp-mod PUBLIC)
- if (FORTRAN_MODULE_DEPS)
- add_dependencies(libomp-mod ${FORTRAN_MODULE_DEPS})
- endif ()
-
set (destination ${LIBOMP_HEADERS_INSTALL_PATH})
if (NOT ${LIBOMP_MODULES_INSTALL_PATH} STREQUAL "")
set (destination ${LIBOMP_MODULES_INSTALL_PATH})
@@ -490,8 +469,3 @@ if(LIBOMP_FORTRAN_MODULES)
DESTINATION ${destination}
)
endif()
-
-# Move files to exports/ directory if requested
-if(LIBOMP_COPY_EXPORTS)
- include(LibompExports)
-endif()
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 05a134d0917dd..885ddd837e73c 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -88,9 +88,6 @@ include(CheckCXXCompilerFlag)
include(GetToolchainDirs)
include(ExtendPath)
-
-
-
# Check whether the Fortran compiler already access to builtin modules. Sets
# HAVE_FORTRAN_INTRINSIC_MODS when returning.
#
@@ -160,11 +157,22 @@ function (flang_module_target tgtname)
return ()
endif ()
- # Let it find the other public module files
target_compile_options(${tgtname} PRIVATE
+ # Let non-public modules find the public module files
"$<$<COMPILE_LANGUAGE:Fortran>:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>"
+
+ # Flang bug workaround: Reformating of cooked token buffer causes identifier to be split between lines
+ "$<$<COMPILE_LANGUAGE:Fortran>:SHELL:-Xflang;SHELL:-fno-reformat>"
)
+ if (LLVM_RUNTIMES_TARGET MATCHES "^nvptx")
+ foreach (_arch IN LISTS RUNTIMES_DEVICE_ARCHITECTURES)
+ target_compile_options(${tgtname} PRIVATE
+ "$<$<COMPILE_LANGUAGE:Fortran>:-march=${_arch}>"
+ )
+ endforeach()
+ endif ()
+
if (ARG_PUBLIC)
set_target_properties(${tgtname}
PROPERTIES
@@ -181,13 +189,13 @@ endfunction ()
# Check whether the build environment supports building Fortran modules
# flang-rt and openmp are the only runtimes that contain Fortran modules.
set(FORTRAN_MODULE_DEPS "")
-if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR "openmp" IN_LIST LLVM_ENABLE_RUNTIMES)
- # 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 used.
- if (CMAKE_VERSION VERSION_LESS "3.24" AND CMAKE_Fortran_COMPILER)
- cmake_path(GET CMAKE_Fortran_COMPILER STEM _Fortran_COMPILER_STEM)
- if (_Fortran_COMPILER_STEM STREQUAL "flang-new" OR
- _Fortran_COMPILER_STEM STREQUAL "flang")
+if (CMAKE_Fortran_COMPILER AND ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR "openmp" IN_LIST LLVM_ENABLE_RUNTIMES))
+ cmake_path(GET CMAKE_Fortran_COMPILER STEM _Fortran_COMPILER_STEM)
+
+ if (_Fortran_COMPILER_STEM STREQUAL "flang-new" OR _Fortran_COMPILER_STEM STREQUAL "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 used.
+ if (CMAKE_VERSION VERSION_LESS "3.24")
include(CMakeForceCompiler)
CMAKE_FORCE_Fortran_COMPILER("${CMAKE_Fortran_COMPILER}" "LLVMFlang")
@@ -209,10 +217,27 @@ if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR "openmp" IN_LIST LLVM_ENABLE_RUNT
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 ",")
+
+ set(CMAKE_Fortran_VERBOSE_FLAG "-v")
+
+ set(CMAKE_Fortran_LINK_MODE DRIVER)
+ endif ()
+
+ # Optimization flags are only passed after CMake 3.27
+ # https://gitlab.kitware.com/cmake/cmake/-/commit/1140087adea98bd8d8974e4c18979f4949b52c34
+ if (CMAKE_VERSION VERSION_LESS "3.27")
+ string(APPEND CMAKE_Fortran_FLAGS_DEBUG_INIT " -O0 -g")
+ string(APPEND CMAKE_Fortran_FLAGS_RELWITHDEBINFO_INIT " -O2 -g")
+ string(APPEND CMAKE_Fortran_FLAGS_RELEASE_INIT " -O3")
+ endif ()
+
+ # Only CMake 3.28+ pass --target= to Flang. But for cross-compiling, including
+ # to nvptx amd amdgpu targets, passing the target triple is essential.
+ # https://gitlab.kitware.com/cmake/cmake/-/commit/e9af7b968756e72553296ecdcde6f36606a0babf
+ if (CMAKE_VERSION VERSION_LESS "3.28")
+ set(CMAKE_Fortran_COMPILE_OPTIONS_TARGET "--target=")
endif ()
endif ()
@@ -467,6 +492,31 @@ if (RUNTIMES_FLANG_MODULES_ENABLED)
)
endif ()
+
+if (RUNTIMES_FLANG_MODULES_ENABLED)
+ set(RUNTIMES_DEVICE_ARCHITECTURES "all" CACHE STRING
+ "List of offload device architectures to be used to compile the Fortran offload code (e.g. 'gfx1103;sm_90')"
+ )
+
+ if (RUNTIMES_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(RUNTIMES_DEVICE_ARCHITECTURES ${all_gpu_architectures})
+ endif()
+ list(REMOVE_DUPLICATES RUNTIMES_DEVICE_ARCHITECTURES)
+endif ()
+
+
option(LLVM_INCLUDE_TESTS "Generate build targets for the runtimes unit tests." ON)
option(LLVM_INCLUDE_DOCS "Generate build targets for the runtimes documentation." ON)
option(LLVM_ENABLE_SPHINX "Use Sphinx to generate the runtimes documentation." OFF)
>From 71290f9c1fe65248b82dc709dd91a970e20fbcbc Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Thu, 27 Nov 2025 16:45:28 +0100
Subject: [PATCH 13/15] Fix modules-only condition
---
flang-rt/lib/runtime/CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flang-rt/lib/runtime/CMakeLists.txt b/flang-rt/lib/runtime/CMakeLists.txt
index 0c8db7e84d53c..548b063fd9ad4 100644
--- a/flang-rt/lib/runtime/CMakeLists.txt
+++ b/flang-rt/lib/runtime/CMakeLists.txt
@@ -215,7 +215,7 @@ else ()
set(f128_sources "")
endif ()
-if (NOT FLANG_RT_ENABLE_STATIC AND NOT FLANG_RT_ENABLE_STATIC)
+if (NOT FLANG_RT_ENABLE_STATIC AND NOT FLANG_RT_ENABLE_SHARED)
# If not compiling the library, only build the modules.
set(sources ${module_sources})
elseif (LLVM_RUNTIMES_TARGET MATCHES "^amdgcn|^nvptx")
>From fcc7450ed47e88d3bfc933dc1fa8e65715035ae6 Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Fri, 28 Nov 2025 18:49:00 +0100
Subject: [PATCH 14/15] Post-merge fixes
---
openmp/CMakeLists.txt | 2 +-
.../modules/LibompCheckFortranFlag.cmake | 29 -------------------
openmp/module/CMakeLists.txt | 10 +++++++
openmp/runtime/CMakeLists.txt | 2 --
4 files changed, 11 insertions(+), 32 deletions(-)
delete mode 100644 openmp/cmake/modules/LibompCheckFortranFlag.cmake
diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt
index 3587c6b8d714e..189a85a6feaa2 100644
--- a/openmp/CMakeLists.txt
+++ b/openmp/CMakeLists.txt
@@ -128,7 +128,7 @@ if (LLVM_RUNTIMES_BUILD)
set(LIBOMP_FORTRAN_MODULES "${RUNTIMES_FLANG_MODULES_ENABLED}" CACHE BOOL
"Create Fortran module files? (requires fortran compiler)")
else ()
- set(LIBOMP_FORTRAN_MODULES OFF)
+ set(LIBOMP_FORTRAN_MODULES FALSE)
endif ()
# Set up testing infrastructure.
diff --git a/openmp/cmake/modules/LibompCheckFortranFlag.cmake b/openmp/cmake/modules/LibompCheckFortranFlag.cmake
deleted file mode 100644
index 344389f989388..0000000000000
--- a/openmp/cmake/modules/LibompCheckFortranFlag.cmake
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-#//===----------------------------------------------------------------------===//
-#//
-#// 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
-#//
-#//===----------------------------------------------------------------------===//
-#
-
-# Checking a fortran compiler flag
-# There is no real trivial way to do this in CMake, so we implement it here
-# this will have ${boolean} = TRUE if the flag succeeds, otherwise false.
-function(libomp_check_fortran_flag flag boolean)
- if(NOT DEFINED "${boolean}")
- set(retval TRUE)
- set(fortran_source
-" program hello
- print *, \"Hello World!\"
- end program hello")
-
- # Compiling as a part of runtimes introduces ARCH-unknown-linux-gnu as a
- # part of a working directory. So adding a guard for unknown.
- set(failed_regexes "[Ee]rror;[Uu]nknown[^-];[Ss]kipping")
- include(CheckFortranSourceCompiles)
- check_fortran_source_compiles("${fortran_source}" ${boolean} FAIL_REGEX "${failed_regexes}")
- set(${boolean} ${${boolean}} PARENT_SCOPE)
- endif()
-endfunction()
diff --git a/openmp/module/CMakeLists.txt b/openmp/module/CMakeLists.txt
index b475251fcf3d6..2f54ccd18b4de 100644
--- a/openmp/module/CMakeLists.txt
+++ b/openmp/module/CMakeLists.txt
@@ -11,6 +11,7 @@
# has been deprecated.
configure_file(omp_lib.F90.var "{CMAKE_CURRENT_BINARY_DIR}/omp_lib.F90" @ONLY)
+configure_file(omp_lib.h.var "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib.h" @ONLY)
# One compilation step creates both omp_lib.mod and omp_lib_kinds.mod. Only
# these files are used, the object file itself can be discarded.
@@ -28,3 +29,12 @@ flang_module_target(libomp-mod PUBLIC)
if (FORTRAN_MODULE_DEPS)
add_dependencies(libomp-mod ${FORTRAN_MODULE_DEPS})
endif ()
+
+set(destination "${LIBOMP_HEADERS_INSTALL_PATH}")
+if (LIBOMP_MODULES_INSTALL_PATH)
+ set(destination "${LIBOMP_MODULES_INSTALL_PATH}")
+endif ()
+install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib.h"
+ DESTINATION ${destination}
+)
diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt
index 7773cbef9caed..93948b941f0dc 100644
--- a/openmp/runtime/CMakeLists.txt
+++ b/openmp/runtime/CMakeLists.txt
@@ -454,5 +454,3 @@ set(LIBOMP_OMP_TOOLS_INCLUDE_DIR ${LIBOMP_OMP_TOOLS_INCLUDE_DIR} PARENT_SCOPE)
# make these variables available for tools/libompd:
set(LIBOMP_SRC_DIR ${LIBOMP_SRC_DIR} PARENT_SCOPE)
set(LIBOMP_OMPD_SUPPORT ${LIBOMP_OMPD_SUPPORT} PARENT_SCOPE)
-
-
>From 194898917152beb4220e6fec4894e63389b4ad6a Mon Sep 17 00:00:00 2001
From: Michael Kruse <llvm-project at meinersbur.de>
Date: Fri, 28 Nov 2025 20:06:25 +0100
Subject: [PATCH 15/15] Exact CMake version
---
runtimes/CMakeLists.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt
index 885ddd837e73c..a5bb2d975272e 100644
--- a/runtimes/CMakeLists.txt
+++ b/runtimes/CMakeLists.txt
@@ -225,9 +225,9 @@ if (CMAKE_Fortran_COMPILER AND ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR "open
set(CMAKE_Fortran_LINK_MODE DRIVER)
endif ()
- # Optimization flags are only passed after CMake 3.27
+ # Optimization flags are only passed after CMake 3.27.4
# https://gitlab.kitware.com/cmake/cmake/-/commit/1140087adea98bd8d8974e4c18979f4949b52c34
- if (CMAKE_VERSION VERSION_LESS "3.27")
+ if (CMAKE_VERSION VERSION_LESS "3.27.4")
string(APPEND CMAKE_Fortran_FLAGS_DEBUG_INIT " -O0 -g")
string(APPEND CMAKE_Fortran_FLAGS_RELWITHDEBINFO_INIT " -O2 -g")
string(APPEND CMAKE_Fortran_FLAGS_RELEASE_INIT " -O3")
More information about the llvm-branch-commits
mailing list