From d233e787f0adfa2acd2e6c67aa2c362f9cf47ab4 Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Tue, 9 Dec 2025 22:36:44 +0100 Subject: [PATCH] Revert "[Flang] Move builtin .mod generation into runtimes (Reapply #137828) (#169638)" This reverts commit 7675fc79c802cf7f6a95660f6ee59bf6cb62102f. Requested in PR: https://github.com/llvm/llvm-project/pull/169638#issuecomment-3634227707 --- 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/AMDGPU.cpp | 3 +- clang/lib/Driver/ToolChains/Flang.cpp | 8 - clang/lib/Driver/ToolChains/HIPAMD.cpp | 3 +- clang/lib/Driver/ToolChains/HIPSPV.cpp | 3 +- flang-rt/CMakeLists.txt | 122 +++++-- flang-rt/cmake/modules/AddFlangRT.cmake | 38 +-- .../cmake/modules/AddFlangRTOffload.cmake | 15 +- .../cmake/modules/FlangRTIntrospection.cmake | 36 --- .../cmake/modules}/GetToolchainDirs.cmake | 11 - flang-rt/lib/CMakeLists.txt | 15 +- flang-rt/lib/runtime/CMakeLists.txt | 175 +++------- 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 + .../module}/__cuda_builtins.f90 | 0 .../module}/__cuda_device.f90 | 0 .../module}/__fortran_builtins.f90 | 2 +- .../module}/__fortran_ieee_exceptions.f90 | 2 +- .../module}/__fortran_type_info.f90 | 0 .../module}/__ppc_intrinsics.f90 | 0 .../runtime => flang/module}/__ppc_types.f90 | 0 .../module}/cooperative_groups.f90 | 1 - .../runtime => flang/module}/cudadevice.f90 | 0 .../runtime => flang/module}/flang_debug.f90 | 0 .../module}/ieee_arithmetic.f90 | 2 +- .../module}/ieee_exceptions.f90 | 0 .../module}/ieee_features.f90 | 0 .../module}/iso_c_binding.f90 | 0 .../module}/iso_fortran_env.f90 | 2 +- .../module}/iso_fortran_env_impl.f90 | 0 .../lib/runtime => flang/module}/mma.f90 | 0 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 | 171 ++++++++++ flang/tools/f18/dump.cpp | 42 +++ llvm/runtimes/CMakeLists.txt | 24 +- openmp/CMakeLists.txt | 11 +- openmp/README.rst | 7 +- .../modules/LibompCheckFortranFlag.cmake | 29 ++ openmp/cmake/modules/LibompHandleFlags.cmake | 11 + openmp/module/CMakeLists.txt | 89 +++-- openmp/runtime/CMakeLists.txt | 2 +- openmp/runtime/cmake/LibompExports.cmake | 10 +- openmp/runtime/test/lit.cfg | 1 - openmp/runtime/test/lit.site.cfg.in | 1 - runtimes/CMakeLists.txt | 303 +----------------- 70 files changed, 596 insertions(+), 878 deletions(-) delete mode 100644 flang-rt/cmake/modules/FlangRTIntrospection.cmake rename {cmake/Modules => flang-rt/cmake/modules}/GetToolchainDirs.cmake (94%) create mode 100644 flang/module/.clang-format rename {flang-rt/lib/runtime => flang/module}/__cuda_builtins.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/__cuda_device.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/__fortran_builtins.f90 (99%) rename {flang-rt/lib/runtime => flang/module}/__fortran_ieee_exceptions.f90 (98%) rename {flang-rt/lib/runtime => flang/module}/__fortran_type_info.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/__ppc_intrinsics.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/__ppc_types.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/cooperative_groups.f90 (96%) rename {flang-rt/lib/runtime => flang/module}/cudadevice.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/flang_debug.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/ieee_arithmetic.f90 (99%) rename {flang-rt/lib/runtime => flang/module}/ieee_exceptions.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/ieee_features.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/iso_c_binding.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/iso_fortran_env.f90 (98%) rename {flang-rt/lib/runtime => flang/module}/iso_fortran_env_impl.f90 (100%) rename {flang-rt/lib/runtime => flang/module}/mma.f90 (100%) delete mode 100644 flang/test/Driver/intrinsic-module-path.F90 create mode 100644 flang/test/Driver/intrinsic-module-path.f90 create mode 100644 flang/tools/f18/CMakeLists.txt create mode 100644 flang/tools/f18/dump.cpp create mode 100644 openmp/cmake/modules/LibompCheckFortranFlag.cmake diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 26af88242eb3..1425714d3411 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -538,10 +538,6 @@ public: // 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 getDefaultIntrinsicModuleDir() const; - // Returns the target specific runtime path if it exists. std::optional getRuntimePath() const; diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 90fc78db45d0..cac122d29662 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -6124,7 +6124,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 ">, MetaVarName<"">, - Visibility<[ClangOption, FlangOption, CLOption]>; + Visibility<[ClangOption, 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 6f0d8078825d..8644a271a04b 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6607,17 +6607,6 @@ 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 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 f8520725b9b0..77a2c73f0d44 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1020,12 +1020,6 @@ ToolChain::getTargetSubDirPath(StringRef BaseDir) const { return {}; } -std::optional ToolChain::getDefaultIntrinsicModuleDir() const { - SmallString<128> P(D.ResourceDir); - llvm::sys::path::append(P, "finclude", "flang"); - return getTargetSubDirPath(P); -} - std::optional ToolChain::getRuntimePath() const { SmallString<128> P(D.ResourceDir); llvm::sys::path::append(P, "lib"); diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index d3515c8fa236..87ccd4037268 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -858,8 +858,7 @@ 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) && - !getDriver().IsFlangMode()) { + options::OPT_fvisibility_ms_compat)) { CC1Args.push_back("-fvisibility=hidden"); CC1Args.push_back("-fapply-global-visibility-to-externs"); } diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 2c7a06f2893b..2f5e93d13985 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -1069,14 +1069,6 @@ 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 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/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 8bfd3c887452..f2f64922cb40 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -274,8 +274,7 @@ 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) && - !getDriver().IsFlangMode()) { + options::OPT_fvisibility_ms_compat)) { 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 261adc2b1c44..be0f49d8e149 100644 --- a/clang/lib/Driver/ToolChains/HIPSPV.cpp +++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp @@ -143,8 +143,7 @@ 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) && - !getDriver().IsFlangMode()) + options::OPT_fvisibility_ms_compat)) CC1Args.append( {"-fvisibility=hidden", "-fapply-global-visibility-to-externs"}); diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt index 20ca6dc7124b..50b8e834776f 100644 --- a/flang-rt/CMakeLists.txt +++ b/flang-rt/CMakeLists.txt @@ -23,6 +23,40 @@ 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 + " -cpp -E > ") + + 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" @@ -31,22 +65,69 @@ 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") -# Fortran compiler not optional for building Flang-RT -enable_language(Fortran) +# 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//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) ################# @@ -56,6 +137,8 @@ enable_language(Fortran) # 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}.") @@ -68,14 +151,7 @@ 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 () -if (LLVM_RUNTIMES_TARGET MATCHES "^amdgcn|^nvptx") - # Compiling libraries for offload targets is currently experimental; - # 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}") +option(FLANG_RT_ENABLE_STATIC "Build Flang-RT as a static library." ON) if (WIN32) # Windows DLL currently not implemented. set(FLANG_RT_ENABLE_SHARED OFF) @@ -88,14 +164,11 @@ else () # breaking change unless the driver is changed. option(FLANG_RT_ENABLE_SHARED "Build Flang-RT as a shared library." OFF) 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 of the libraries - message(STATUS "Flang-RT testing disabled without either FLANG_RT_ENABLE_STATIC OR FLANG_RT_ENABLE_SHARED") - set(FLANG_RT_INCLUDE_TESTS OFF) +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) + ") endif () @@ -113,7 +186,7 @@ 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 - set(FLANG_RT_DEVICE_ARCHITECTURES "${RUNTIMES_DEVICE_ARCHITECTURES}" CACHE STRING + 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')" ) @@ -161,10 +234,6 @@ 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) @@ -262,7 +331,6 @@ else () add_custom_target(check-flang-rt) endif() - ################### # Install headers # ################### diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake index 0ba485a79beb..923507764d69 100644 --- a/flang-rt/cmake/modules/AddFlangRT.cmake +++ b/flang-rt/cmake/modules/AddFlangRT.cmake @@ -94,10 +94,6 @@ 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 @@ -172,18 +168,14 @@ function (add_flangrt_library name) if (BUILD_SHARED_LIBS) if (build_shared) set(default_target "${name_shared}") - elseif (build_static) - set(default_target "${name_static}") else () - set(default_target "${name_object}") + set(default_target "${name_static}") endif () else () if (build_static) set(default_target "${name_static}") - elseif (build_shared) - set(default_target "${name_shared}") else () - set(default_target "${name_object}") + set(default_target "${name_shared}") endif () endif () add_library(${name}.default ALIAS "${default_target}") @@ -198,12 +190,6 @@ 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. @@ -233,14 +219,6 @@ 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 extension - "$<$:-cpp>" - - # Missing type descriptors are expected for intrinsic modules - "$<$:SHELL:-mmlir;SHELL:-ignore-missing-type-desc>" - ) - # 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. @@ -248,10 +226,6 @@ 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 @@ -370,13 +344,13 @@ function (add_flangrt_library name) if (ARG_INSTALL_WITH_TOOLCHAIN) set_target_properties(${tgtname} PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_LIB_DIR}" - LIBRARY_OUTPUT_DIRECTORY "${RUNTIMES_OUTPUT_RESOURCE_LIB_DIR}" + ARCHIVE_OUTPUT_DIRECTORY "${FLANG_RT_OUTPUT_RESOURCE_LIB_DIR}" + LIBRARY_OUTPUT_DIRECTORY "${FLANG_RT_OUTPUT_RESOURCE_LIB_DIR}" ) install(TARGETS ${tgtname} - ARCHIVE DESTINATION "${RUNTIMES_INSTALL_RESOURCE_LIB_PATH}" - LIBRARY DESTINATION "${RUNTIMES_INSTALL_RESOURCE_LIB_PATH}" + ARCHIVE DESTINATION "${FLANG_RT_INSTALL_RESOURCE_LIB_PATH}" + LIBRARY DESTINATION "${FLANG_RT_INSTALL_RESOURCE_LIB_PATH}" ) endif () diff --git a/flang-rt/cmake/modules/AddFlangRTOffload.cmake b/flang-rt/cmake/modules/AddFlangRTOffload.cmake index 5b6464741c9c..cbc69f3a9656 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 -fopenmp -fvisibility=hidden -fopenmp-cuda-mode --offload-arch=${compile_for_architectures} # Force LTO for the device part. -foffload-lto - >) - set_property(SOURCE ${files} APPEND - PROPERTY COMPILE_DEFINITIONS ${OMP_COMPILE_OPTIONS} + ) + set_source_files_properties(${files} PROPERTIES COMPILE_OPTIONS + "${OMP_COMPILE_OPTIONS}" ) target_link_options(${name}.static PUBLIC ${OMP_COMPILE_OPTIONS}) @@ -105,13 +105,6 @@ 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$") - 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 deleted file mode 100644 index 10830ff1ac57..000000000000 --- a/flang-rt/cmake/modules/FlangRTIntrospection.cmake +++ /dev/null @@ -1,36 +0,0 @@ -#===-- 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 -# -#===------------------------------------------------------------------------===# - -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. -# -# * 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") - 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/cmake/Modules/GetToolchainDirs.cmake b/flang-rt/cmake/modules/GetToolchainDirs.cmake similarity index 94% rename from cmake/Modules/GetToolchainDirs.cmake rename to flang-rt/cmake/modules/GetToolchainDirs.cmake index ce2f8c294b2b..fba12502b594 100644 --- a/cmake/Modules/GetToolchainDirs.cmake +++ b/flang-rt/cmake/modules/GetToolchainDirs.cmake @@ -47,17 +47,6 @@ 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/lib/CMakeLists.txt b/flang-rt/lib/CMakeLists.txt index 8738ae7b9c4b..aee51dcc9fa2 100644 --- a/flang-rt/lib/CMakeLists.txt +++ b/flang-rt/lib/CMakeLists.txt @@ -6,16 +6,11 @@ # #===------------------------------------------------------------------------===# -if (FLANG_RT_ENABLE_STATIC OR FLANG_RT_ENABLE_SHARED) - add_subdirectory(quadmath) - add_subdirectory(runtime) - if (FLANG_RT_INCLUDE_CUF) - add_subdirectory(cuda) - endif() -else () - # Generate modules files only, skip the libraries - add_subdirectory(runtime) -endif () +add_subdirectory(quadmath) +add_subdirectory(runtime) +if (FLANG_RT_INCLUDE_CUF) + add_subdirectory(cuda) +endif() if (FLANG_RT_INCLUDE_TESTS) add_subdirectory(Testing) diff --git a/flang-rt/lib/runtime/CMakeLists.txt b/flang-rt/lib/runtime/CMakeLists.txt index 4be679d1ca8a..e8f70bd544e0 100644 --- a/flang-rt/lib/runtime/CMakeLists.txt +++ b/flang-rt/lib/runtime/CMakeLists.txt @@ -12,30 +12,6 @@ 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 -) - -# Fortran sources for builtin .mod files -set(module_sources - __fortran_ieee_exceptions.f90 - __fortran_type_info.f90 - flang_debug.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 ${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp @@ -97,6 +73,7 @@ set(supported_sources # List of source not used for GPU offloading. set(host_sources + ${FLANG_SOURCE_DIR}/module/iso_fortran_env_impl.f90 command.cpp complex-powi.cpp complex-reduction.c @@ -172,91 +149,45 @@ 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 -set(f128_sources "") -if (TARGET FortranFloat128MathILib) - get_target_property(_propval - FortranFloat128MathILib INTERFACE_SOURCES +get_target_property(f128_sources + FortranFloat128MathILib INTERFACE_SOURCES + ) +if (f128_sources) + # The interface may define special macros for Float128Math files, + # so we need to propagate them. + get_target_property(f128_defs + FortranFloat128MathILib INTERFACE_COMPILE_DEFINITIONS + ) + set_property(SOURCE ${f128_sources} + APPEND PROPERTY COMPILE_DEFINITIONS + ${f128_defs} + ) + get_target_property(f128_include_dirs + FortranFloat128MathILib INTERFACE_INCLUDE_DIRECTORIES + ) + set_property(SOURCE ${f128_sources} + APPEND PROPERTY INCLUDE_DIRECTORIES + ${f128_include_dirs} ) - if (_propval) - set(f128_sources "${_propval}") - # The interface may define special macros for Float128Math files, - # so we need to propagate them. - get_target_property(f128_defs - FortranFloat128MathILib INTERFACE_COMPILE_DEFINITIONS - ) - set_property(SOURCE ${f128_sources} - APPEND PROPERTY COMPILE_DEFINITIONS - ${f128_defs} - ) - get_target_property(f128_include_dirs - FortranFloat128MathILib INTERFACE_INCLUDE_DIRECTORIES - ) - set_property(SOURCE ${f128_sources} - APPEND PROPERTY INCLUDE_DIRECTORIES - ${f128_include_dirs} - ) - endif () -endif () - -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") - set(sources ${gpu_sources} ${module_sources}) else () - set(sources ${supported_sources} ${host_sources} ${module_sources} ${f128_sources}) + set(f128_sources "") endif () - -# check-flang depends on flang-rt-mod to build intrinsic modules -if (NOT TARGET flang-rt-mod) - add_custom_target(flang-rt-mod) +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 () + 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 flang_rt.intrinsics.obj ${Backtrace_LIBRARY} + ${sources} + LINK_LIBRARIES ${Backtrace_LIBRARY} INSTALL_WITH_TOOLCHAIN ADDITIONAL_HEADERS ${public_headers} ${private_headers} ) @@ -265,17 +196,8 @@ if (NOT WIN32) enable_omp_offload_compilation(flang_rt.runtime "${supported_sources}") # Select a default runtime, which is used for unit and regression tests. - 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) - 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}) + get_target_property(default_target flang_rt.runtime.default ALIASED_TARGET) + add_library(flang_rt.runtime.unittest ALIAS "${default_target}") else() # Target for building all versions of the runtime add_custom_target(flang_rt.runtime) @@ -283,23 +205,12 @@ 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} ${ARGN} - LINK_LIBRARIES ${name}.intrinsics.obj ${Backtrace_LIBRARY} + LINK_LIBRARIES ${Backtrace_LIBRARY} ADDITIONAL_HEADERS ${public_headers} ${private_headers} ) - get_target_property(compile_target ${name}.compile ALIASED_TARGET) if (msvc_lib) set_target_properties(${name} @@ -309,19 +220,11 @@ else() endif () # Setting an unique Fortran_MODULE_DIRECTORY is required for each variant to - # 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) + # write a different .mod file. + set_target_properties(${name} + PROPERTIES + Fortran_MODULE_DIRECTORY "module.${suffix}" + ) enable_cuda_compilation(${name} "${supported_sources}") enable_omp_offload_compilation(${name} "${supported_sources}") diff --git a/flang-rt/test/lit.site.cfg.py.in b/flang-rt/test/lit.site.cfg.py.in index 0e9dc08b5992..662d076b1fe2 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 = "@RUNTIMES_OUTPUT_RESOURCE_LIB_DIR@" +config.flang_rt_output_resource_lib_dir = "@FLANG_RT_OUTPUT_RESOURCE_LIB_DIR@" config.flang_rt_experimental_offload_support = "@FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT@" config.cc = "@CMAKE_C_COMPILER@" config.flang = "@CMAKE_Fortran_COMPILER@" diff --git a/flang-rt/unittests/CMakeLists.txt b/flang-rt/unittests/CMakeLists.txt index 75b76e93cb56..e1ab73d7d930 100644 --- a/flang-rt/unittests/CMakeLists.txt +++ b/flang-rt/unittests/CMakeLists.txt @@ -49,8 +49,9 @@ 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_property(TARGET ${target} APPEND - PROPERTY LINK_OPTIONS -fopenmp --offload-arch=native + set_target_properties(${target} + PROPERTIES LINK_OPTIONS + "-fopenmp;--offload-arch=native" ) endif() endfunction() diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt index df38846998b9..c01eb56d5e49 100644 --- a/flang/CMakeLists.txt +++ b/flang/CMakeLists.txt @@ -273,6 +273,7 @@ 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 feaee28a5334..d294955af780 100644 --- a/flang/include/flang/Frontend/CompilerInvocation.h +++ b/flang/include/flang/Frontend/CompilerInvocation.h @@ -92,10 +92,6 @@ 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. @@ -181,9 +177,6 @@ public: 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 ace24e09d86e..b6c4e6303cda 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -884,6 +884,16 @@ 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; @@ -1557,14 +1567,6 @@ 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::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)) { @@ -1831,11 +1833,9 @@ void CompilerInvocation::setFortranOpts() { preprocessorOptions.searchDirectoriesFromIntrModPath.begin(), preprocessorOptions.searchDirectoriesFromIntrModPath.end()); - // Add the ordered list of -fintrinsic-modules-path - fortranOptions.intrinsicModuleDirectories.insert( - fortranOptions.intrinsicModuleDirectories.end(), - preprocessorOptions.searchDirectoriesFromIntrModPath.begin(), - preprocessorOptions.searchDirectoriesFromIntrModPath.end()); + // Add the default intrinsic module directory + fortranOptions.intrinsicModuleDirectories.emplace_back( + getIntrinsicDir(getArgv0())); // 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 f4b90bf01abe..2606d997b1cd 100644 --- a/flang/lib/Semantics/semantics.cpp +++ b/flang/lib/Semantics/semantics.cpp @@ -621,15 +621,12 @@ bool Semantics::Perform() { const auto *frontModule{std::get_if>( &program_.v.front().u)}; if (frontModule && - std::get>(frontModule->value().t) - .statement.v.source == "__fortran_builtins") { + (std::get>(frontModule->value().t) + .statement.v.source == "__fortran_builtins" || + std::get>( + frontModule->value().t) + .statement.v.source == "__ppc_types")) { // Don't try to read the builtins module when we're actually building it. - } else if (frontModule && - std::get>(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>(frontModule->value().t) .statement.v.source == "__ppc_intrinsics" || diff --git a/flang/module/.clang-format b/flang/module/.clang-format new file mode 100644 index 000000000000..e3845288a2ae --- /dev/null +++ b/flang/module/.clang-format @@ -0,0 +1 @@ +DisableFormat: true diff --git a/flang-rt/lib/runtime/__cuda_builtins.f90 b/flang/module/__cuda_builtins.f90 similarity index 100% rename from flang-rt/lib/runtime/__cuda_builtins.f90 rename to flang/module/__cuda_builtins.f90 diff --git a/flang-rt/lib/runtime/__cuda_device.f90 b/flang/module/__cuda_device.f90 similarity index 100% rename from flang-rt/lib/runtime/__cuda_device.f90 rename to flang/module/__cuda_device.f90 diff --git a/flang-rt/lib/runtime/__fortran_builtins.f90 b/flang/module/__fortran_builtins.f90 similarity index 99% rename from flang-rt/lib/runtime/__fortran_builtins.f90 rename to flang/module/__fortran_builtins.f90 index cede255de7c2..a9b60508785d 100644 --- a/flang-rt/lib/runtime/__fortran_builtins.f90 +++ b/flang/module/__fortran_builtins.f90 @@ -6,7 +6,7 @@ ! !===------------------------------------------------------------------------===! -#include '../../../flang/include/flang/Runtime/magic-numbers.h' +#include '../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-rt/lib/runtime/__fortran_ieee_exceptions.f90 b/flang/module/__fortran_ieee_exceptions.f90 similarity index 98% rename from flang-rt/lib/runtime/__fortran_ieee_exceptions.f90 rename to flang/module/__fortran_ieee_exceptions.f90 index ff5c6b44317f..3ac9b993186a 100644 --- a/flang-rt/lib/runtime/__fortran_ieee_exceptions.f90 +++ b/flang/module/__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 '../../../flang/include/flang/Runtime/magic-numbers.h' +#include '../include/flang/Runtime/magic-numbers.h' module __fortran_ieee_exceptions use __fortran_builtins, only: & diff --git a/flang-rt/lib/runtime/__fortran_type_info.f90 b/flang/module/__fortran_type_info.f90 similarity index 100% rename from flang-rt/lib/runtime/__fortran_type_info.f90 rename to flang/module/__fortran_type_info.f90 diff --git a/flang-rt/lib/runtime/__ppc_intrinsics.f90 b/flang/module/__ppc_intrinsics.f90 similarity index 100% rename from flang-rt/lib/runtime/__ppc_intrinsics.f90 rename to flang/module/__ppc_intrinsics.f90 diff --git a/flang-rt/lib/runtime/__ppc_types.f90 b/flang/module/__ppc_types.f90 similarity index 100% rename from flang-rt/lib/runtime/__ppc_types.f90 rename to flang/module/__ppc_types.f90 diff --git a/flang-rt/lib/runtime/cooperative_groups.f90 b/flang/module/cooperative_groups.f90 similarity index 96% rename from flang-rt/lib/runtime/cooperative_groups.f90 rename to flang/module/cooperative_groups.f90 index 5ca0c3aa1f3a..8bb4af3afa79 100644 --- a/flang-rt/lib/runtime/cooperative_groups.f90 +++ b/flang/module/cooperative_groups.f90 @@ -11,7 +11,6 @@ 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-rt/lib/runtime/cudadevice.f90 b/flang/module/cudadevice.f90 similarity index 100% rename from flang-rt/lib/runtime/cudadevice.f90 rename to flang/module/cudadevice.f90 diff --git a/flang-rt/lib/runtime/flang_debug.f90 b/flang/module/flang_debug.f90 similarity index 100% rename from flang-rt/lib/runtime/flang_debug.f90 rename to flang/module/flang_debug.f90 diff --git a/flang-rt/lib/runtime/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90 similarity index 99% rename from flang-rt/lib/runtime/ieee_arithmetic.f90 rename to flang/module/ieee_arithmetic.f90 index 02cfae2dc6b1..4e938a2daaa9 100644 --- a/flang-rt/lib/runtime/ieee_arithmetic.f90 +++ b/flang/module/ieee_arithmetic.f90 @@ -8,7 +8,7 @@ ! Fortran 2018 Clause 17 -#include '../../../flang/include/flang/Runtime/magic-numbers.h' +#include '../include/flang/Runtime/magic-numbers.h' module ieee_arithmetic ! F18 Clause 17.1p1: diff --git a/flang-rt/lib/runtime/ieee_exceptions.f90 b/flang/module/ieee_exceptions.f90 similarity index 100% rename from flang-rt/lib/runtime/ieee_exceptions.f90 rename to flang/module/ieee_exceptions.f90 diff --git a/flang-rt/lib/runtime/ieee_features.f90 b/flang/module/ieee_features.f90 similarity index 100% rename from flang-rt/lib/runtime/ieee_features.f90 rename to flang/module/ieee_features.f90 diff --git a/flang-rt/lib/runtime/iso_c_binding.f90 b/flang/module/iso_c_binding.f90 similarity index 100% rename from flang-rt/lib/runtime/iso_c_binding.f90 rename to flang/module/iso_c_binding.f90 diff --git a/flang-rt/lib/runtime/iso_fortran_env.f90 b/flang/module/iso_fortran_env.f90 similarity index 98% rename from flang-rt/lib/runtime/iso_fortran_env.f90 rename to flang/module/iso_fortran_env.f90 index 2dc38bd1acfe..3729b95a339f 100644 --- a/flang-rt/lib/runtime/iso_fortran_env.f90 +++ b/flang/module/iso_fortran_env.f90 @@ -8,7 +8,7 @@ ! See Fortran 2023, subclause 16.10.2 -#include '../../../flang/include/flang/Runtime/magic-numbers.h' +#include '../include/flang/Runtime/magic-numbers.h' module iso_fortran_env diff --git a/flang-rt/lib/runtime/iso_fortran_env_impl.f90 b/flang/module/iso_fortran_env_impl.f90 similarity index 100% rename from flang-rt/lib/runtime/iso_fortran_env_impl.f90 rename to flang/module/iso_fortran_env_impl.f90 diff --git a/flang-rt/lib/runtime/mma.f90 b/flang/module/mma.f90 similarity index 100% rename from flang-rt/lib/runtime/mma.f90 rename to flang/module/mma.f90 diff --git a/flang/test/CMakeLists.txt b/flang/test/CMakeLists.txt index c43ef8b29b30..8c8e92faa787 100644 --- a/flang/test/CMakeLists.txt +++ b/flang/test/CMakeLists.txt @@ -2,31 +2,11 @@ # 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=") - -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) @@ -79,6 +59,7 @@ set(FLANG_TEST_PARAMS set(FLANG_TEST_DEPENDS flang + module_files fir-opt tco bbc @@ -120,14 +101,8 @@ if (LLVM_BUILD_EXAMPLES) ) endif () -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 () +if ("openmp" IN_LIST LLVM_ENABLE_RUNTIMES AND NOT FLANG_STANDALONE_BUILD) + list(APPEND FLANG_TEST_DEPENDS "libomp-mod") 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 264ff8d03562..30fd57801970 100644 --- a/flang/test/Driver/Inputs/ieee_arithmetic.mod +++ b/flang/test/Driver/Inputs/ieee_arithmetic.mod @@ -1,6 +1,5 @@ ! 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 c53375d78dec..689297d52027 100644 --- a/flang/test/Driver/Inputs/iso_fortran_env.mod +++ b/flang/test/Driver/Inputs/iso_fortran_env.mod @@ -1,6 +1,5 @@ ! 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 deleted file mode 100644 index 3317eb776f0a..000000000000 --- a/flang/test/Driver/intrinsic-module-path.F90 +++ /dev/null @@ -1,55 +0,0 @@ -! 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 new file mode 100644 index 000000000000..615d8f9a1730 --- /dev/null +++ b/flang/test/Driver/intrinsic-module-path.f90 @@ -0,0 +1,23 @@ +! 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 9adf264f114d..2ea251eafacb 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",@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 fb9e1dd0d1e6..bb869cd3341a 100644 --- a/flang/test/Driver/pp-fixed-form.f90 +++ b/flang/test/Driver/pp-fixed-form.f90 @@ -8,12 +8,12 @@ FIXED-NEXT: "-fc1" {{.*}} "-ffixed-form" {{.*}} "-x" "f95-cpp-input" "fixed-form !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 29a9784b984b..2e0c72ccfe04 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_bare -emit-hlfir %s -o - -I nw | FileCheck %s +! RUN: bbc -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 2e4136273c75..735237223bcb 100644 --- a/flang/test/Lower/OpenMP/simd_aarch64.f90 +++ b/flang/test/Lower/OpenMP/simd_aarch64.f90 @@ -1,11 +1,6 @@ -! Tests for 2.9.3.1 Simd and target dependent default alignment for AArch64 +! Tests for 2.9.3.1 Simd and target dependent defult 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 df3f88eabbfc..a717b38a7659 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 7140bc6aec36..95f63a4d71e4 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 ab08a4f838a9..3e49df3deb25 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 3c0a2b6b3222..5e020aeb4dc0 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 39af27e91424..c356c0739257 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 c3050dc876ec..4221354df34a 100644 --- a/flang/test/lit.cfg.py +++ b/flang/test/lit.cfg.py @@ -139,95 +139,18 @@ config.substitutions.append(("%isysroot", " ".join(isysroot_flag))) 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=flang_exe, - extra_args=flang_extra_search_args, + command=FindTool("flang"), unresolved="fatal", ), ToolSubst( "%flang_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"), + command=FindTool("flang"), + extra_args=["-fc1"], unresolved="fatal", ), ] @@ -270,7 +193,16 @@ result = lit_config.params.get("LIBPGMATH") if result: config.environment["LIBPGMATH"] = True -config.substitutions.append(("%openmp_flags", "-fopenmp")) +# 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)) # 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 25f2a88d068d..cc1f4fa6cc9c 100644 --- a/flang/test/lit.site.cfg.py.in +++ b/flang/test/lit.site.cfg.py.in @@ -13,12 +13,10 @@ 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@ @@ -27,6 +25,11 @@ 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 1b297af74cae..1d2d2c608faf 100644 --- a/flang/tools/CMakeLists.txt +++ b/flang/tools/CMakeLists.txt @@ -7,6 +7,7 @@ #===------------------------------------------------------------------------===# 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 ab35fb3af6c2..8b12da3a7b50 100644 --- a/flang/tools/bbc/bbc.cpp +++ b/flang/tools/bbc/bbc.cpp @@ -98,11 +98,6 @@ 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 moduleDir("module", llvm::cl::desc("module output directory (default .)"), llvm::cl::init(".")); @@ -579,6 +574,14 @@ 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 new file mode 100644 index 000000000000..58ea782ce213 --- /dev/null +++ b/flang/tools/f18/CMakeLists.txt @@ -0,0 +1,171 @@ +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" + "flang_debug" +) + +# Check if 128-bit float computations can be done via long double. +check_cxx_source_compiles( + "#include + #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 new file mode 100644 index 000000000000..f11b5aedf4c6 --- /dev/null +++ b/flang/tools/f18/dump.cpp @@ -0,0 +1,42 @@ +//===-- 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 7f8f239efbe6..88fb323e5e44 100644 --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -252,11 +252,6 @@ 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") @@ -556,15 +551,18 @@ 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("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) + 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") + endif() 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 44d831623014..df568419824a 100644 --- a/openmp/CMakeLists.txt +++ b/openmp/CMakeLists.txt @@ -134,8 +134,6 @@ 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 (e.g. additional module search paths via -fintrinsic-modules-path )") set(ENABLE_LIBOMPTARGET ON) # Currently libomptarget cannot be compiled on Windows or MacOS X. @@ -159,18 +157,13 @@ else() get_clang_resource_dir(LIBOMP_HEADERS_INSTALL_PATH SUBDIR include) endif() -if(RUNTIMES_FLANG_MODULES_ENABLED) - add_subdirectory(module) -else() - message(STATUS "Building omp_lib.mod disabled by RUNTIMES_FLANG_MODULES_ENABLED='${RUNTIMES_FLANG_MODULES_ENABLED}'; libomp-mod does nothing") - add_custom_target(libomp-mod) -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") add_subdirectory(device) else() + add_subdirectory(module) + # Build host runtime library, after LIBOMPTARGET variables are set since they # are needed to enable time profiling support in the OpenMP runtime. add_subdirectory(runtime) diff --git a/openmp/README.rst b/openmp/README.rst index e16cfa658308..cc485f9a56ce 100644 --- a/openmp/README.rst +++ b/openmp/README.rst @@ -96,7 +96,7 @@ variable. **CMAKE_Fortran_COMPILER** = Specify the Fortran compiler. This option is only needed when - **RUNTIMES_FLANG_MODULES_ENABLED** is ``ON``. So typically, a Fortran + **LIBOMP_FORTRAN_MODULES** is ``ON`` (see below). So typically, a Fortran compiler is not needed during the build. **CMAKE_ASM_MASM_COMPILER** = ``ml|ml64`` @@ -166,6 +166,9 @@ Options for ``libomp`` Static libraries are not supported on Windows*. +**LIBOMP_FORTRAN_MODULES** = ``OFF|ON`` + Create the Fortran modules (requires Fortran compiler). + macOS* Fat Libraries """""""""""""""""""" On macOS* machines, it is possible to build universal (or fat) libraries which @@ -340,7 +343,7 @@ Advanced Builds with Various Options .. code-block:: console - $ cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_Fortran_COMPILER=ifort -DRUNTIMES_FLANG_MODULES_ENABLED=on .. + $ cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_Fortran_COMPILER=ifort -DLIBOMP_FORTRAN_MODULES=on .. - Have CMake find the C/C++ compiler and specify additional flags for the preprocessor and C++ compiler. diff --git a/openmp/cmake/modules/LibompCheckFortranFlag.cmake b/openmp/cmake/modules/LibompCheckFortranFlag.cmake new file mode 100644 index 000000000000..344389f98938 --- /dev/null +++ b/openmp/cmake/modules/LibompCheckFortranFlag.cmake @@ -0,0 +1,29 @@ +# +#//===----------------------------------------------------------------------===// +#// +#// 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/cmake/modules/LibompHandleFlags.cmake b/openmp/cmake/modules/LibompHandleFlags.cmake index a27c8cc407e1..c36a88fb862a 100644 --- a/openmp/cmake/modules/LibompHandleFlags.cmake +++ b/openmp/cmake/modules/LibompHandleFlags.cmake @@ -156,6 +156,17 @@ 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/module/CMakeLists.txt b/openmp/module/CMakeLists.txt index 5a54546fcd28..48f5b0f7a2e8 100644 --- a/openmp/module/CMakeLists.txt +++ b/openmp/module/CMakeLists.txt @@ -6,38 +6,71 @@ #// #//===----------------------------------------------------------------------===// -# Build the module files if a Fortran compiler is available. -# Only LLVM_ENABLE_RUNTIMES=openmp is supported, LLVM_ENABLE_PROJECTS=openmp -# has been deprecated. +include(LibompCheckFortranFlag) -configure_file(omp_lib.F90.var "{CMAKE_CURRENT_BINARY_DIR}/omp_lib.F90" @ONLY) +set(LIBOMP_FFLAGS "" CACHE STRING + "Appended user specified Fortran compiler flags. These are only used if LIBOMP_FORTRAN_MODULES==TRUE.") + +# Enabling Fortran if it is needed +if (LIBOMP_FORTRAN_MODULES) + enable_language(Fortran) + + libomp_check_fortran_flag(-m32 LIBOMP_HAVE_M32_FORTRAN_FLAG) +endif () + +# Building the Fortran module files +# One compilation step creates both omp_lib.mod and omp_lib_kinds.mod +configure_file(omp_lib.F90.var 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. -# 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") - -# 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") - target_compile_options(libomp-mod PRIVATE -fno-range-check) +set(BUILD_FORTRAN_MODULES False) +if (LIBOMP_FORTRAN_MODULES_COMPILER) + # 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 "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib.mod" "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib_kinds.mod") + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib.mod" "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib_kinds.mod" + COMMAND ${LIBOMP_FORTRAN_MODULES_COMPILER} -cpp -fsyntax-only ${LIBOMP_FORTRAN_SOURCE_FILE} "-J${CMAKE_CURRENT_BINARY_DIR}/../runtime/src" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_FORTRAN_SOURCE_FILE}" + ) + 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 "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib.mod" "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/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 "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib.mod" "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib_kinds.mod" + COMMAND ${CMAKE_Fortran_COMPILER} -c ${ADDITIONAL_Fortran_FLAGS} + ${LIBOMP_CONFIGURED_FFLAGS} ${LIBOMP_FORTRAN_SOURCE_FILE} "-J${CMAKE_CURRENT_BINARY_DIR}/../runtime/src" + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${LIBOMP_FORTRAN_SOURCE_FILE}" + ) + set_property(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src" PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "omp_lib${CMAKE_C_OUTPUT_EXTENSION}") + set(BUILD_FORTRAN_MODULES True) 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 (LIBOMP_MODULES_INSTALL_PATH) - set(destination "${LIBOMP_MODULES_INSTALL_PATH}") +if (BUILD_FORTRAN_MODULES) + 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.mod" + "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib_kinds.mod" + "${CMAKE_CURRENT_BINARY_DIR}/../runtime/src/omp_lib.h" + DESTINATION ${destination} + ) 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 1917af595288..93948b941f0d 100644 --- a/openmp/runtime/CMakeLists.txt +++ b/openmp/runtime/CMakeLists.txt @@ -422,7 +422,7 @@ if(${OPENMP_STANDALONE_BUILD}) libomp_say("Build Type -- ${CMAKE_BUILD_TYPE}") libomp_say("Library Kind -- ${LIBOMP_LIBRARY_KIND}") libomp_say("Library Type -- ${LIBOMP_LIB_TYPE}") - libomp_say("Fortran Modules -- ${RUNTIMES_FLANG_MODULES_ENABLED}") + libomp_say("Fortran Modules -- ${LIBOMP_FORTRAN_MODULES}") # will say development if all zeros if(${LIBOMP_VERSION_BUILD} STREQUAL 00000000) set(LIBOMP_BUILD Development) diff --git a/openmp/runtime/cmake/LibompExports.cmake b/openmp/runtime/cmake/LibompExports.cmake index 39bc8cebbe17..6dfe4f4569aa 100644 --- a/openmp/runtime/cmake/LibompExports.cmake +++ b/openmp/runtime/cmake/LibompExports.cmake @@ -56,21 +56,21 @@ 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 ${LIBOMP_HEADERS_INTDIR}/omp.h ${LIBOMP_EXPORTS_CMN_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${LIBOMP_HEADERS_INTDIR}/ompx.h ${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} ) if(${LIBOMP_OMPT_SUPPORT}) add_custom_command(TARGET omp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy omp-tools.h ${LIBOMP_EXPORTS_CMN_DIR} ) endif() -if(RUNTIMES_FLANG_MODULES_ENABLED) +if(${LIBOMP_FORTRAN_MODULES}) # We cannot attach a POST_BUILD command to libomp-mod, so instead attach it # to omp and ensure that libomp-mod is built before 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} + 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} ) add_dependencies(omp libomp-mod) add_custom_command(TARGET omp POST_BUILD diff --git a/openmp/runtime/test/lit.cfg b/openmp/runtime/test/lit.cfg index a4e3aa505638..72da1ba1411f 100644 --- a/openmp/runtime/test/lit.cfg +++ b/openmp/runtime/test/lit.cfg @@ -48,7 +48,6 @@ 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 fd0ad3022802..cc8b3b252d7d 100644 --- a/openmp/runtime/test/lit.site.cfg.in +++ b/openmp/runtime/test/lit.site.cfg.in @@ -8,7 +8,6 @@ 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 a5bb2d975272..5220b9353fed 100644 --- a/runtimes/CMakeLists.txt +++ b/runtimes/CMakeLists.txt @@ -85,195 +85,6 @@ include(CheckLibraryExists) include(LLVMCheckCompilerLinkerFlag) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) -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 () - - target_compile_options(${tgtname} PRIVATE - # Let non-public modules find the public module files - "$<$:-fintrinsic-modules-path=${RUNTIMES_OUTPUT_RESOURCE_MOD_DIR}>" - - # Flang bug workaround: Reformating of cooked token buffer causes identifier to be split between lines - "$<$:SHELL:-Xflang;SHELL:-fno-reformat>" - ) - - if (LLVM_RUNTIMES_TARGET MATCHES "^nvptx") - foreach (_arch IN LISTS RUNTIMES_DEVICE_ARCHITECTURES) - target_compile_options(${tgtname} PRIVATE - "$<$:-march=${_arch}>" - ) - endforeach() - endif () - - 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 "") -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") - - 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 - " -cpp -E > ") - - 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_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_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.4 - # https://gitlab.kitware.com/cmake/cmake/-/commit/1140087adea98bd8d8974e4c18979f4949b52c34 - 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") - 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 () - - 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 () # Determine whether we are in the runtimes/runtimes-bins directory of a @@ -283,6 +94,17 @@ 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 @@ -414,109 +236,6 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang") 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 - # 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//lib.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. -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 (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 () - - -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)