mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-21 18:26:47 +00:00
[Flang] Don't use FortranDecimal for runtime (#121997)
Avoid using the same library for runtime and compiler. `FortranDecimal` was used in two ways: 1. As an auxiliary library needed for `libFortranRuntime.a`. This patch adds the two source files of FortranDecimal directly into FortranRuntime, so `FortranRuntime` is not used anymore. 2. As a library used by the Flang compiler. As the only remaining use of the library, extra CMake code to make it compatible with the runtime can be removed. Before this PR, `enable_cuda_compilation` is applied to `FortranDecimal` which causes everything that links to it, including flang (the compiler), to depend on libcudart when CUDA support is enabled. Having two runtime library just makes everything more complicated while the user ideally should not be concerned with how the runtime is structured internally. Some logic was copied for FortranDecimal because of this, such as the ability to be compiled out-of tree (b75a3c9f31c1ffdc9856aee32991d8129b372ee7) which is undocumented, the logic to link against the various versions of Microsofts runtime library (#70833), and avoiding dependency on the C++ runtime (7783bba22c7add678d796741d30669c73159b3d8).
This commit is contained in:
parent
612df14c00
commit
98e118ca43
clang/lib/Driver/ToolChains
flang
docs
lib/Decimal
runtime
test
lld/COFF
@ -1321,7 +1321,7 @@ void tools::addOpenMPHostOffloadingArgs(const Compilation &C,
|
||||
/// Add Fortran runtime libs
|
||||
void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
|
||||
llvm::opt::ArgStringList &CmdArgs) {
|
||||
// Link FortranRuntime and FortranDecimal
|
||||
// Link FortranRuntime
|
||||
// These are handled earlier on Windows by telling the frontend driver to
|
||||
// add the correct libraries to link against as dependents in the object
|
||||
// file.
|
||||
@ -1338,7 +1338,6 @@ void tools::addFortranRuntimeLibs(const ToolChain &TC, const ArgList &Args,
|
||||
addAsNeededOption(TC, Args, CmdArgs, /*as_needed=*/false);
|
||||
}
|
||||
CmdArgs.push_back("-lFortranRuntime");
|
||||
CmdArgs.push_back("-lFortranDecimal");
|
||||
addArchSpecificRPath(TC, Args, CmdArgs);
|
||||
|
||||
// needs libexecinfo for backtrace functions
|
||||
|
@ -365,21 +365,18 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
|
||||
CmdArgs.push_back("-D_MT");
|
||||
CmdArgs.push_back("--dependent-lib=libcmt");
|
||||
CmdArgs.push_back("--dependent-lib=FortranRuntime.static.lib");
|
||||
CmdArgs.push_back("--dependent-lib=FortranDecimal.static.lib");
|
||||
break;
|
||||
case options::OPT__SLASH_MTd:
|
||||
CmdArgs.push_back("-D_MT");
|
||||
CmdArgs.push_back("-D_DEBUG");
|
||||
CmdArgs.push_back("--dependent-lib=libcmtd");
|
||||
CmdArgs.push_back("--dependent-lib=FortranRuntime.static_dbg.lib");
|
||||
CmdArgs.push_back("--dependent-lib=FortranDecimal.static_dbg.lib");
|
||||
break;
|
||||
case options::OPT__SLASH_MD:
|
||||
CmdArgs.push_back("-D_MT");
|
||||
CmdArgs.push_back("-D_DLL");
|
||||
CmdArgs.push_back("--dependent-lib=msvcrt");
|
||||
CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic.lib");
|
||||
CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic.lib");
|
||||
break;
|
||||
case options::OPT__SLASH_MDd:
|
||||
CmdArgs.push_back("-D_MT");
|
||||
@ -387,7 +384,6 @@ static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
|
||||
CmdArgs.push_back("-D_DLL");
|
||||
CmdArgs.push_back("--dependent-lib=msvcrtd");
|
||||
CmdArgs.push_back("--dependent-lib=FortranRuntime.dynamic_dbg.lib");
|
||||
CmdArgs.push_back("--dependent-lib=FortranDecimal.dynamic_dbg.lib");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -175,19 +175,18 @@ like this:
|
||||
|
||||
```
|
||||
$ flang -v -o example example.o
|
||||
"/usr/bin/ld" [...] example.o [...] "-lFortranRuntime" "-lFortranDecimal" [...]
|
||||
"/usr/bin/ld" [...] example.o [...] "-lFortranRuntime" [...]
|
||||
```
|
||||
|
||||
The automatically added libraries are:
|
||||
|
||||
* `FortranRuntime`: Provides most of the Flang runtime library.
|
||||
* `FortranDecimal`: Provides operations for decimal numbers.
|
||||
|
||||
If the code is C/C++ based and invokes Fortran routines, one can either use Clang
|
||||
or Flang as the linker driver. If Clang is used, it will automatically all
|
||||
required runtime libraries needed by C++ (e.g., for STL) to the linker invocation.
|
||||
In this case, one has to explicitly provide the Fortran runtime libraries
|
||||
`FortranRuntime` and/or `FortranDecimal`. An alternative is to use Flang to link.
|
||||
In this case, one has to explicitly provide the Fortran runtime library
|
||||
`FortranRuntime`. An alternative is to use Flang to link.
|
||||
In this case, it may be required to explicitly supply C++ runtime libraries.
|
||||
|
||||
On Darwin, the logical root where the system libraries are located (sysroot)
|
||||
|
@ -6,89 +6,7 @@
|
||||
#
|
||||
#===------------------------------------------------------------------------===#
|
||||
|
||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
cmake_minimum_required(VERSION 3.20.0)
|
||||
|
||||
project(FortranDecimal 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")
|
||||
|
||||
# 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"
|
||||
)
|
||||
|
||||
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 ()
|
||||
include_directories(BEFORE
|
||||
${FLANG_SOURCE_DIR}/include)
|
||||
endif()
|
||||
|
||||
check_cxx_compiler_flag(-fno-lto FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
|
||||
if (FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
|
||||
append("-fno-lto" CMAKE_CXX_FLAGS)
|
||||
endif()
|
||||
|
||||
# Disable libstdc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build, to
|
||||
# avoid an unwanted dependency on libstdc++.so.
|
||||
add_definitions(-U_GLIBCXX_ASSERTIONS)
|
||||
|
||||
set(sources
|
||||
add_flang_library(FortranDecimal
|
||||
binary-to-decimal.cpp
|
||||
decimal-to-binary.cpp
|
||||
)
|
||||
|
||||
include(AddFlangOffloadRuntime)
|
||||
enable_cuda_compilation(FortranDecimal "${sources}")
|
||||
enable_omp_offload_compilation("${sources}")
|
||||
|
||||
add_flang_library(FortranDecimal INSTALL_WITH_TOOLCHAIN ${sources})
|
||||
|
||||
if (DEFINED MSVC)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
|
||||
add_flang_library(FortranDecimal.static INSTALL_WITH_TOOLCHAIN
|
||||
binary-to-decimal.cpp
|
||||
decimal-to-binary.cpp
|
||||
)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
|
||||
add_flang_library(FortranDecimal.dynamic INSTALL_WITH_TOOLCHAIN
|
||||
binary-to-decimal.cpp
|
||||
decimal-to-binary.cpp
|
||||
)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
|
||||
add_flang_library(FortranDecimal.static_dbg INSTALL_WITH_TOOLCHAIN
|
||||
binary-to-decimal.cpp
|
||||
decimal-to-binary.cpp
|
||||
)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
|
||||
add_flang_library(FortranDecimal.dynamic_dbg INSTALL_WITH_TOOLCHAIN
|
||||
binary-to-decimal.cpp
|
||||
decimal-to-binary.cpp
|
||||
)
|
||||
add_dependencies(FortranDecimal FortranDecimal.static FortranDecimal.dynamic
|
||||
FortranDecimal.static_dbg FortranDecimal.dynamic_dbg)
|
||||
endif()
|
||||
|
@ -59,7 +59,7 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
)
|
||||
endif()
|
||||
|
||||
set(linked_libraries FortranDecimal)
|
||||
set(linked_libraries "")
|
||||
|
||||
# function checks
|
||||
find_package(Backtrace)
|
||||
@ -116,6 +116,8 @@ add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
|
||||
add_subdirectory(Float128Math)
|
||||
|
||||
set(sources
|
||||
${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp
|
||||
${FLANG_SOURCE_DIR}/lib/Decimal/decimal-to-binary.cpp
|
||||
ISO_Fortran_binding.cpp
|
||||
allocator-registry.cpp
|
||||
allocatable.cpp
|
||||
@ -288,26 +290,18 @@ else()
|
||||
)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
|
||||
add_flang_library(FortranRuntime.static ${sources}
|
||||
LINK_LIBS
|
||||
FortranDecimal.static
|
||||
INSTALL_WITH_TOOLCHAIN)
|
||||
set_target_properties(FortranRuntime.static PROPERTIES FOLDER "Flang/Runtime Libraries")
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
|
||||
add_flang_library(FortranRuntime.dynamic ${sources}
|
||||
LINK_LIBS
|
||||
FortranDecimal.dynamic
|
||||
INSTALL_WITH_TOOLCHAIN)
|
||||
set_target_properties(FortranRuntime.dynamic PROPERTIES FOLDER "Flang/Runtime Libraries")
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
|
||||
add_flang_library(FortranRuntime.static_dbg ${sources}
|
||||
LINK_LIBS
|
||||
FortranDecimal.static_dbg
|
||||
INSTALL_WITH_TOOLCHAIN)
|
||||
set_target_properties(FortranRuntime.static_dbg PROPERTIES FOLDER "Flang/Runtime Libraries")
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
|
||||
add_flang_library(FortranRuntime.dynamic_dbg ${sources}
|
||||
LINK_LIBS
|
||||
FortranDecimal.dynamic_dbg
|
||||
INSTALL_WITH_TOOLCHAIN)
|
||||
set_target_properties(FortranRuntime.dynamic_dbg PROPERTIES FOLDER "Flang/Runtime Libraries")
|
||||
add_dependencies(FortranRuntime FortranRuntime.static FortranRuntime.dynamic
|
||||
|
@ -33,7 +33,7 @@
|
||||
! SOLARIS-F128NONE-NOT: FortranFloat128Math
|
||||
! UNIX-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
|
||||
! SOLARIS-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "-z" "ignore" "-lquadmath" "-z" "record"
|
||||
! UNIX-SAME: "-lFortranRuntime" "-lFortranDecimal" "-lm"
|
||||
! UNIX-SAME: "-lFortranRuntime" "-lm"
|
||||
! COMPILER-RT: "{{.*}}{{\\|/}}libclang_rt.builtins.a"
|
||||
|
||||
! BSD-LABEL: "{{.*}}ld{{(\.exe)?}}"
|
||||
@ -41,7 +41,6 @@
|
||||
! BSD-F128NONE-NOT: FortranFloat128Math
|
||||
! BSD-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
|
||||
! BSD-SAME: -lFortranRuntime
|
||||
! BSD-SAME: -lFortranDecimal
|
||||
! BSD-SAME: -lexecinfo
|
||||
|
||||
! DARWIN-LABEL: "{{.*}}ld{{(\.exe)?}}"
|
||||
@ -49,20 +48,18 @@
|
||||
! DARWIN-F128NONE-NOT: FortranFloat128Math
|
||||
! DARWIN-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
|
||||
! DARWIN-SAME: -lFortranRuntime
|
||||
! DARWIN-SAME: -lFortranDecimal
|
||||
|
||||
! HAIKU-LABEL: "{{.*}}ld{{(\.exe)?}}"
|
||||
! HAIKU-SAME: "[[object_file]]"
|
||||
! HAIKU-F128NONE-NOT: FortranFloat128Math
|
||||
! HAIKU-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
|
||||
! HAIKU-SAME: "-lFortranRuntime" "-lFortranDecimal"
|
||||
! HAIKU-SAME: "-lFortranRuntime"
|
||||
|
||||
! MINGW-LABEL: "{{.*}}ld{{(\.exe)?}}"
|
||||
! MINGW-SAME: "[[object_file]]"
|
||||
! MINGW-F128NONE-NOT: FortranFloat128Math
|
||||
! MINGW-F128LIBQUADMATH-SAME: "-lFortranFloat128Math" "--as-needed" "-lquadmath" "--no-as-needed"
|
||||
! MINGW-SAME: -lFortranRuntime
|
||||
! MINGW-SAME: -lFortranDecimal
|
||||
|
||||
! 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
|
||||
|
@ -8,7 +8,6 @@
|
||||
! MSVC-SAME: -D_MT
|
||||
! MSVC-SAME: --dependent-lib=libcmt
|
||||
! MSVC-SAME: --dependent-lib=FortranRuntime.static.lib
|
||||
! MSVC-SAME: --dependent-lib=FortranDecimal.static.lib
|
||||
|
||||
! MSVC-DEBUG: -fc1
|
||||
! MSVC-DEBUG-SAME: --dependent-lib=clang_rt.builtins.lib
|
||||
@ -16,7 +15,6 @@
|
||||
! MSVC-DEBUG-SAME: -D_DEBUG
|
||||
! MSVC-DEBUG-SAME: --dependent-lib=libcmtd
|
||||
! MSVC-DEBUG-SAME: --dependent-lib=FortranRuntime.static_dbg.lib
|
||||
! MSVC-DEBUG-SAME: --dependent-lib=FortranDecimal.static_dbg.lib
|
||||
|
||||
! MSVC-DLL: -fc1
|
||||
! MSVC-DLL-SAME: --dependent-lib=clang_rt.builtins.lib
|
||||
@ -24,7 +22,6 @@
|
||||
! MSVC-DLL-SAME: -D_DLL
|
||||
! MSVC-DLL-SAME: --dependent-lib=msvcrt
|
||||
! MSVC-DLL-SAME: --dependent-lib=FortranRuntime.dynamic.lib
|
||||
! MSVC-DLL-SAME: --dependent-lib=FortranDecimal.dynamic.lib
|
||||
|
||||
! MSVC-DLL-DEBUG: -fc1
|
||||
! MSVC-DLL-DEBUG-SAME: --dependent-lib=clang_rt.builtins.lib
|
||||
@ -33,4 +30,3 @@
|
||||
! MSVC-DLL-DEBUG-SAME: -D_DLL
|
||||
! MSVC-DLL-DEBUG-SAME: --dependent-lib=msvcrtd
|
||||
! MSVC-DLL-DEBUG-SAME: --dependent-lib=FortranRuntime.dynamic_dbg.lib
|
||||
! MSVC-DLL-DEBUG-SAME: --dependent-lib=FortranDecimal.dynamic_dbg.lib
|
||||
|
@ -25,5 +25,4 @@
|
||||
! platform individually.
|
||||
|
||||
! CHECK-NOT: "-lFortranRuntime"
|
||||
! CHECK-NOT: "-lFortranDecimal"
|
||||
! CHECK-NOT: "-lgcc"
|
||||
|
@ -6,7 +6,7 @@ a C compiler.
|
||||
REQUIRES: c-compiler
|
||||
|
||||
RUN: %if system-aix %{ export OBJECT_MODE=64 %}
|
||||
RUN: %cc -std=c99 %s -I%include %libruntime %libdecimal -lm \
|
||||
RUN: %cc -std=c99 %s -I%include %libruntime -lm \
|
||||
RUN: %if system-aix %{-lpthread %}
|
||||
RUN: rm a.out
|
||||
*/
|
||||
|
@ -168,12 +168,10 @@ else:
|
||||
# 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")
|
||||
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")
|
||||
@ -183,7 +181,6 @@ if config.cc:
|
||||
)
|
||||
)
|
||||
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
|
||||
|
@ -50,7 +50,6 @@ AutoExporter::AutoExporter(
|
||||
"libc++",
|
||||
"libc++abi",
|
||||
"libFortranRuntime",
|
||||
"libFortranDecimal",
|
||||
"libunwind",
|
||||
"libmsvcrt",
|
||||
"libucrtbase",
|
||||
|
Loading…
x
Reference in New Issue
Block a user