diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -921,12 +921,10 @@ llvm::opt::ArgStringList &CmdArgs) { if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { CmdArgs.push_back("Fortran_main.lib"); - CmdArgs.push_back("FortranRuntime.lib"); - CmdArgs.push_back("FortranDecimal.lib"); + CmdArgs.push_back("FlangRT.lib"); } else { CmdArgs.push_back("-lFortran_main"); - CmdArgs.push_back("-lFortranRuntime"); - CmdArgs.push_back("-lFortranDecimal"); + CmdArgs.push_back("-lFlangRT"); } } diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/flang-rt/CMakeLists.txt @@ -0,0 +1,124 @@ +# CMake build for the Flang runtime libraries +# The source for the flang runtime libraries (FortranDecimalRT, FortranRuntime) +# exist in the flang top-level directory. +# Flang-rt is only scaffolding and does not provide any additional source files. + +cmake_minimum_required(VERSION 3.20.0) + +#=============================================================================== +# Configure CMake +#=============================================================================== +set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake") +include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake + NO_POLICY_SCOPE) + +set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) + +# Check if flang-rt is built as a standalone project. +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR FLANG_RT_STANDALONE_BUILD) + project(FlangRT C CXX) + set(CMAKE_INCLUDE_CURRENT_DIR ON) + set(FLANG_RT_STANDALONE_BUILD TRUE) + set_property(GLOBAL PROPERTY USE_FOLDERS ON) +endif() + +set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../flang") +set(LLVM_COMMON_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../cmake") +set(LLVM_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../llvm/cmake") +set(CLANG_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../clang/cmake") + +# Add path for custom modules +list(INSERT CMAKE_MODULE_PATH 0 + "${FLANG_SOURCE_DIR}/cmake" + "${FLANG_SOURCE_DIR}/cmake/modules" + "${LLVM_COMMON_CMAKE_UTILS}" + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + "${LLVM_CMAKE_UTILS}" + "${LLVM_CMAKE_UTILS}/modules" + "${CLANG_CMAKE_UTILS}/modules" +) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY + ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + +include(AddClang) +include(AddLLVM) +include(AddFlang) +include(HandleLLVMOptions) +include(TestBigEndian) +test_big_endian(IS_BIGENDIAN) +if (IS_BIGENDIAN) + add_compile_definitions(FLANG_BIG_ENDIAN=1) +else () + add_compile_definitions(FLANG_LITTLE_ENDIAN=1) +endif () + +#=============================================================================== +# Setup CMake Options +#=============================================================================== +option(FLANG_RT_ENABLE_SHARED "Build flang-rt as a shared library." OFF) +option(FLANG_RT_ENABLE_STATIC "Build flang-rt as a static library." OFF) + +# TODO: Remove this section if using object libraries as its no longer needed. +#=============================================================================== +# Find Flang Libraries +#=============================================================================== +#set(FORTRAN_DECIMAL_SRC "${CMAKE_CURRENT_SOURCE_DIR}/../flang/lib/Decimal") +#set(FORTRAN_RUNTIME_SRC "${CMAKE_CURRENT_SOURCE_DIR}/../flang/runtime") +# +#find_library(FORTRAN_DECIMAL FortranDecimalRT PATHS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) +#find_library(FORTRAN_RUNTIME FortranRuntime PATHS ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) +# +#if (FORTRAN_DECIMAL) +# list(APPEND FLANG_RT_LIBS ${FORTRAN_DECIMAL}) +#else() +# add_subdirectory(${FORTRAN_DECIMAL_SRC} FortranDecimalRT) +# list(APPEND FLANG_RT_LIBS FortranDecimalRT) +#endif() +#if (FORTRAN_RUNTIME) +# list(APPEND FLANG_RT_LIBS ${FORTRAN_RUNTIME}) +#else() +# add_subdirectory(${FORTRAN_RUNTIME_SRC} FortranRuntime) +# list(APPEND FLANG_RT_LIBS FortranRuntime) +#endif() + +#=============================================================================== +# Create Flang-rt wrapper library +#=============================================================================== +# TODO: Removed commented code (previous implementation w/o object libraries) +# Build as shared by default if no linkage type option set. +if (NOT FLANG_RT_ENABLE_SHARED AND NOT FLANG_RT_ENABLE_STATIC) +# add_library(FlangRT SHARED src/dummy.cpp) + add_library(FlangRT SHARED $ + $) +endif() +if (FLANG_RT_ENABLE_SHARED) +# add_library(FlangRT SHARED src/dummy.cpp) + add_library(FlangRT SHARED $ + $) +endif() +if (FLANG_RT_ENABLE_STATIC AND NOT FLANG_RT_ENABLE_SHARED) +# add_library(FlangRT STATIC src/dummy.cpp) + add_library(FlangRT STATIC $ + $) +endif() +# When building both static and shared, we need to append _static to the name +# to avoid naming conflicts. +if (FLANG_RT_ENABLE_STATIC AND FLANG_RT_ENABLE_SHARED) +# add_library(FlangRT_static STATIC src/dummy.cpp) + add_library(FlangRT_static STATIC $ + $) +endif() + +# TODO: Remove all this if we are using object libraries +#=============================================================================== +# Link Flang Libraries +#=============================================================================== +#target_link_libraries(FlangRT PUBLIC ${FLANG_RT_LIBS}) +#if (FLANG_RT_ENABLE_STATIC AND FLANG_RT_ENABLE_SHARED) +# target_link_libraries(FlangRT_static PUBLIC ${FLANG_RT_LIBS}) +#endif() diff --git a/flang-rt/src/dummy.cpp b/flang-rt/src/dummy.cpp new file mode 100644 --- /dev/null +++ b/flang-rt/src/dummy.cpp @@ -0,0 +1,6 @@ +// TODO: If the object library approach is followed through. This entire src/ +// directory should be deleted. This dummy source file was needed to make +// CMake add a new library for FlangRT with the prvious approach that used +// target_link_libraries to link FortranRuntime and FortranDecimalRT instead. +// +// This file is intentionally left blank. diff --git a/flang/cmake/modules/AddFlang.cmake b/flang/cmake/modules/AddFlang.cmake --- a/flang/cmake/modules/AddFlang.cmake +++ b/flang/cmake/modules/AddFlang.cmake @@ -65,6 +65,7 @@ endif() llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs}) + set_target_properties(${name} PROPERTIES POSITION_INDEPENDENT_CODE ON) clang_target_link_libraries(${name} PRIVATE ${ARG_CLANG_LIBS}) diff --git a/flang/include/flang/Runtime/float128.h b/flang/include/flang/Runtime/float128.h --- a/flang/include/flang/Runtime/float128.h +++ b/flang/include/flang/Runtime/float128.h @@ -39,13 +39,13 @@ * since earlier versions may define the macros above, but * still do not support __float128 fully. */ -#if __x86_64__ -#if __GNUC__ >= 7 || __clang_major__ >= 7 -#define HAS_FLOAT128 1 -#endif -#elif defined __PPC__ && __GNUC__ >= 8 -#define HAS_FLOAT128 1 -#endif +//#if __x86_64__ +//#if __GNUC__ >= 7 || __clang_major__ >= 7 +//#define HAS_FLOAT128 1 +//#endif +//#elif defined __PPC__ && __GNUC__ >= 8 +//#define HAS_FLOAT128 1 +//#endif #endif /* (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) && \ !defined(_LIBCPP_VERSION) && !defined(__CUDA_ARCH__) */ diff --git a/flang/lib/Decimal/CMakeLists.txt b/flang/lib/Decimal/CMakeLists.txt --- a/flang/lib/Decimal/CMakeLists.txt +++ b/flang/lib/Decimal/CMakeLists.txt @@ -1,14 +1,14 @@ -if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) +set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..") +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR FLANG_RT_STANDALONE_BUILD) cmake_minimum_required(VERSION 3.20.0) project(FortranDecimal C CXX) + project(FortranDecimalRT C CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_EXTENSIONS OFF) - set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..") - set(LLVM_COMMON_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../cmake") set(LLVM_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../llvm/cmake") set(CLANG_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../clang/cmake") @@ -36,9 +36,9 @@ else () add_compile_definitions(FLANG_LITTLE_ENDIAN=1) endif () - include_directories(BEFORE - ${FLANG_SOURCE_DIR}/include) endif() +include_directories(BEFORE + ${FLANG_SOURCE_DIR}/include) check_cxx_compiler_flag(-fno-lto FLANG_RUNTIME_HAS_FNO_LTO_FLAG) if (FLANG_RUNTIME_HAS_FNO_LTO_FLAG) @@ -49,7 +49,18 @@ # avoid an unwanted dependency on libstdc++.so. add_definitions(-U_GLIBCXX_ASSERTIONS) -add_flang_library(FortranDecimal INSTALL_WITH_TOOLCHAIN - binary-to-decimal.cpp - decimal-to-binary.cpp -) +add_compile_options(-fPIC) + +if (NOT FLANG_RT_STANDALONE_BUILD) + add_flang_library(FortranDecimal + binary-to-decimal.cpp + decimal-to-binary.cpp + ) +endif() + +if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES OR FLANG_RT_STANDALONE_BUILD) + add_flang_library(FortranDecimalRT STATIC INSTALL_WITH_TOOLCHAIN + binary-to-decimal.cpp + decimal-to-binary.cpp + ) +endif() diff --git a/flang/runtime/CMakeLists.txt b/flang/runtime/CMakeLists.txt --- a/flang/runtime/CMakeLists.txt +++ b/flang/runtime/CMakeLists.txt @@ -5,8 +5,9 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # #===------------------------------------------------------------------------===# +set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") -if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR FLANG_RT_STANDALONE_BUILD) cmake_minimum_required(VERSION 3.20.0) project(FlangRuntime C CXX) @@ -15,7 +16,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_EXTENSIONS OFF) - set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") set(LLVM_COMMON_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../cmake") set(LLVM_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../llvm/cmake") @@ -44,9 +44,9 @@ else () add_compile_definitions(FLANG_LITTLE_ENDIAN=1) endif () - include_directories(BEFORE - ${FLANG_SOURCE_DIR}/include) endif() +include_directories(BEFORE + ${FLANG_SOURCE_DIR}/include) include(CheckCXXSymbolExists) include(CheckCXXSourceCompiles) @@ -246,10 +246,14 @@ add_compile_definitions(OMP_OFFLOAD_BUILD) endif() -add_flang_library(FortranRuntime - ${sources} - LINK_LIBS - FortranDecimal +add_compile_options(-fPIC) - INSTALL_WITH_TOOLCHAIN -) +if ("flang-rt" IN_LIST LLVM_ENABLE_RUNTIMES) + add_flang_library(FortranRuntime STATIC + ${sources} + LINK_LIBS + FortranDecimalRT + + INSTALL_WITH_TOOLCHAIN + ) +endif() diff --git a/flang/test/CMakeLists.txt b/flang/test/CMakeLists.txt --- a/flang/test/CMakeLists.txt +++ b/flang/test/CMakeLists.txt @@ -63,7 +63,7 @@ split-file FortranRuntime Fortran_main - FortranDecimal + FortranDecimalRT ) if (LLVM_ENABLE_PLUGINS AND NOT WIN32) list(APPEND FLANG_TEST_DEPENDS Bye) diff --git a/flang/test/Driver/linker-flags.f90 b/flang/test/Driver/linker-flags.f90 --- a/flang/test/Driver/linker-flags.f90 +++ b/flang/test/Driver/linker-flags.f90 @@ -24,21 +24,18 @@ ! GNU-LABEL: "{{.*}}ld{{(\.exe)?}}" ! GNU-SAME: "[[object_file]]" ! GNU-SAME: -lFortran_main -! GNU-SAME: -lFortranRuntime -! GNU-SAME: -lFortranDecimal +! GNU-SAME: -lFlangRT ! GNU-SAME: -lm ! DARWIN-LABEL: "{{.*}}ld{{(\.exe)?}}" ! DARWIN-SAME: "[[object_file]]" ! DARWIN-SAME: -lFortran_main -! DARWIN-SAME: -lFortranRuntime -! DARWIN-SAME: -lFortranDecimal +! DARWIN-SAME: -lFlangRT ! MINGW-LABEL: "{{.*}}ld{{(\.exe)?}}" ! MINGW-SAME: "[[object_file]]" ! MINGW-SAME: -lFortran_main -! MINGW-SAME: -lFortranRuntime -! MINGW-SAME: -lFortranDecimal +! MINGW-SAME: -lFlangRT ! NOTE: This also matches lld-link (when CLANG_DEFAULT_LINKER=lld) and ! any .exe suffix that is added when resolving to the full path of @@ -46,7 +43,6 @@ ! when the executable is not found or on non-Windows platforms. ! MSVC-LABEL: link ! MSVC-SAME: Fortran_main.lib -! MSVC-SAME: FortranRuntime.lib -! MSVC-SAME: FortranDecimal.lib +! MSVC-SAME: FlangRT.lib ! MSVC-SAME: /subsystem:console ! MSVC-SAME: "[[object_file]]" diff --git a/flang/test/lit.cfg.py b/flang/test/lit.cfg.py --- a/flang/test/lit.cfg.py +++ b/flang/test/lit.cfg.py @@ -153,19 +153,16 @@ # the C++ runtime libraries. For this we need a C compiler. If for some reason # we don't have one, we can just disable the test. if config.cc: - libruntime = os.path.join(config.flang_lib_dir, "libFortranRuntime.a") - libdecimal = os.path.join(config.flang_lib_dir, "libFortranDecimal.a") + libruntime = os.path.join(config.flang_lib_dir, "libFlangRT.a") include = os.path.join(config.flang_src_dir, "include") if ( os.path.isfile(libruntime) - and os.path.isfile(libdecimal) and os.path.isdir(include) ): config.available_features.add("c-compiler") tools.append(ToolSubst("%cc", command=config.cc, unresolved="fatal")) tools.append(ToolSubst("%libruntime", command=libruntime, unresolved="fatal")) - tools.append(ToolSubst("%libdecimal", command=libdecimal, unresolved="fatal")) tools.append(ToolSubst("%include", command=include, unresolved="fatal")) # Add all the tools and their substitutions (if applicable). Use the search paths provided for diff --git a/lld/COFF/MinGW.cpp b/lld/COFF/MinGW.cpp --- a/lld/COFF/MinGW.cpp +++ b/lld/COFF/MinGW.cpp @@ -50,8 +50,7 @@ "libc++", "libc++abi", "libFortran_main", - "libFortranRuntime", - "libFortranDecimal", + "libFlangRT", "libunwind", "libmsvcrt", "libucrtbase", diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -149,7 +149,10 @@ # As we migrate runtimes to using the bootstrapping build, the set of default runtimes # should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above. set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind") -set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc") +if ("flang" IN_LIST LLVM_ENABLE_PROJECTS) + set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind;flang-rt") +endif() +set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;flang-rt") set(LLVM_ENABLE_RUNTIMES "" CACHE STRING "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.") if(LLVM_ENABLE_RUNTIMES STREQUAL "all") diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt --- a/runtimes/CMakeLists.txt +++ b/runtimes/CMakeLists.txt @@ -19,7 +19,7 @@ # We order libraries to mirror roughly how they are layered, except that compiler-rt can depend # on libc++, so we put it after. -set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp") +set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;flang-rt") set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc") set(LLVM_ENABLE_RUNTIMES "" CACHE STRING "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")