https://github.com/parabola94 created https://github.com/llvm/llvm-project/pull/149786
The default linker could be changed by a CMake variable CLANG_DEFAULT_LINKER before. However, it also changes the default linker invoked by clang. This patch distincts the default linkers of clang and flang. Note that FLANG_DEFAULT_LINKER will be the same as CLANG_DEFAULT_LINKER unless it is defined explicitly. That means this patch does not affect the current behavior. Fixes #73153 >From c6d3516b04946c9529083b293ce640f14c1879fe Mon Sep 17 00:00:00 2001 From: parabola94 <heavybaby5...@toki.waseda.jp> Date: Mon, 21 Jul 2025 18:00:05 +0900 Subject: [PATCH 1/2] [clang][Driver] Add a new member for CLANG_DEFAULT_LINKER to clang::driver::Driver (NFC) The default linker can be changed by a CMake variable CLANG_DEFAULT_LINKER, but it is shared in all toolchains. This patch intends to resolve this. --- clang/include/clang/Driver/Driver.h | 9 +++++++++ clang/lib/Driver/Driver.cpp | 4 ++-- clang/lib/Driver/ToolChain.cpp | 2 +- clang/lib/Driver/ToolChains/MSVC.cpp | 4 ++-- clang/lib/Driver/ToolChains/MinGW.cpp | 2 +- clang/lib/Driver/ToolChains/Solaris.cpp | 6 +++--- clang/lib/Driver/ToolChains/UEFI.cpp | 4 ++-- 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index d9e328fe918bc..107b3d95dde42 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -337,6 +337,10 @@ class Driver { /// "clang" as it's first argument. const char *PrependArg; + /// The default value of -fuse-ld= option. An empty string means the default + /// system linker. + std::string PreferredLinker; + /// Whether to check that input files exist when constructing compilation /// jobs. LLVM_PREFERRED_TYPE(bool) @@ -450,6 +454,11 @@ class Driver { return ClangExecutable.c_str(); } + StringRef getPreferredLinker() const { return PreferredLinker; } + void setPreferredLinker(std::string Value) { + PreferredLinker = std::move(Value); + } + bool isSaveTempsEnabled() const { return SaveTemps != SaveTempsNone; } bool isSaveTempsObj() const { return SaveTemps == SaveTempsObj; } diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ec1135eecd401..46c8ffbc493d2 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -266,8 +266,8 @@ Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple, CCLogDiagnostics(false), CCGenDiagnostics(false), CCPrintProcessStats(false), CCPrintInternalStats(false), TargetTriple(TargetTriple), Saver(Alloc), PrependArg(nullptr), - CheckInputsExist(true), ProbePrecompiled(true), - SuppressMissingInputWarning(false) { + PreferredLinker(CLANG_DEFAULT_LINKER), CheckInputsExist(true), + ProbePrecompiled(true), SuppressMissingInputWarning(false) { // Provide a sane fallback if no VFS is specified. if (!this->VFS) this->VFS = llvm::vfs::getRealFileSystem(); diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 481f575518b93..38616a3f97183 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1100,7 +1100,7 @@ std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD) const { // Get -fuse-ld= first to prevent -Wunused-command-line-argument. -fuse-ld= is // considered as the linker flavor, e.g. "bfd", "gold", or "lld". const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ); - StringRef UseLinker = A ? A->getValue() : CLANG_DEFAULT_LINKER; + StringRef UseLinker = A ? A->getValue() : getDriver().getPreferredLinker(); // --ld-path= takes precedence over -fuse-ld= and specifies the executable // name. -B, COMPILER_PATH and PATH and consulted if the value does not diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 7d31eea603087..bb469ff095cd4 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -279,8 +279,8 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args); } - StringRef Linker = - Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER); + StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, + TC.getDriver().getPreferredLinker()); if (Linker.empty()) Linker = "link"; // We need to translate 'lld' into 'lld-link'. diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp index b2e36ae6f97c3..6abd0c04ecc0e 100644 --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -548,7 +548,7 @@ toolchains::MinGW::MinGW(const Driver &D, const llvm::Triple &Triple, getFilePaths().push_back(Base + "lib"); NativeLLVMSupport = - Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER) + Args.getLastArgValue(options::OPT_fuse_ld_EQ, D.getPreferredLinker()) .equals_insensitive("lld"); } diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp b/clang/lib/Driver/ToolChains/Solaris.cpp index a3574e1b701e8..02aa59817449d 100644 --- a/clang/lib/Driver/ToolChains/Solaris.cpp +++ b/clang/lib/Driver/ToolChains/Solaris.cpp @@ -39,7 +39,7 @@ void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA, bool solaris::isLinkerGnuLd(const ToolChain &TC, const ArgList &Args) { // Only used if targetting Solaris. const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ); - StringRef UseLinker = A ? A->getValue() : CLANG_DEFAULT_LINKER; + StringRef UseLinker = A ? A->getValue() : TC.getDriver().getPreferredLinker(); return UseLinker == "bfd" || UseLinker == "gld"; } @@ -52,7 +52,7 @@ static bool getPIE(const ArgList &Args, const ToolChain &TC) { TC.isPIEDefault(Args)); } -// FIXME: Need to handle CLANG_DEFAULT_LINKER here? +// FIXME: Need to handle PreferredLinker here? std::string solaris::Linker::getLinkerPath(const ArgList &Args) const { const ToolChain &ToolChain = getToolChain(); if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) { @@ -345,7 +345,7 @@ SanitizerMask Solaris::getSupportedSanitizers() const { const char *Solaris::getDefaultLinker() const { // FIXME: Only handle Solaris ld and GNU ld here. - return llvm::StringSwitch<const char *>(CLANG_DEFAULT_LINKER) + return llvm::StringSwitch<const char *>(getDriver().getPreferredLinker()) .Cases("bfd", "gld", "/usr/gnu/bin/ld") .Default("/usr/bin/ld"); } diff --git a/clang/lib/Driver/ToolChains/UEFI.cpp b/clang/lib/Driver/ToolChains/UEFI.cpp index ac6668e6bdd5f..2b41173543477 100644 --- a/clang/lib/Driver/ToolChains/UEFI.cpp +++ b/clang/lib/Driver/ToolChains/UEFI.cpp @@ -83,8 +83,8 @@ void tools::uefi::Linker::ConstructJob(Compilation &C, const JobAction &JA, // This should ideally be handled by ToolChain::GetLinkerPath but we need // to special case some linker paths. In the case of lld, we need to // translate 'lld' into 'lld-link'. - StringRef Linker = - Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER); + StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, + TC.getDriver().getPreferredLinker()); if (Linker.empty() || Linker == "lld") Linker = "lld-link"; >From 7a97f531134060f7b0480cdb2d980373834d7ea2 Mon Sep 17 00:00:00 2001 From: parabola94 <heavybaby5...@toki.waseda.jp> Date: Mon, 21 Jul 2025 18:29:59 +0900 Subject: [PATCH 2/2] [flang][Driver] Enable FLANG_DEFAULT_LINKER The default linker could be changed by a CMake variable CLANG_DEFAULT_LINKER before. However, it also changes the default linker invoked by clang. This patch distincts the default linkers of clang and flang. Note that FLANG_DEFAULT_LINKER will be the same as CLANG_DEFAULT_LINKER unless it is defined explicitly. That means this patch does not affect the current behavior. Fixes #73153 --- flang/CMakeLists.txt | 2 +- flang/include/flang/Config/config.h.cmake | 16 +++++++++------- flang/tools/flang-driver/driver.cpp | 2 ++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/flang/CMakeLists.txt b/flang/CMakeLists.txt index 0bfada476348a..6cbe6d4ed6a3e 100644 --- a/flang/CMakeLists.txt +++ b/flang/CMakeLists.txt @@ -317,7 +317,7 @@ if (NOT ENABLE_LINKER_BUILD_ID) set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld") endif() -set(FLANG_DEFAULT_LINKER "" CACHE STRING +set(FLANG_DEFAULT_LINKER ${CLANG_DEFAULT_LINKER} CACHE STRING "Default linker to use (linker name or absolute path, empty for platform default)") set(FLANG_DEFAULT_RTLIB "" CACHE STRING diff --git a/flang/include/flang/Config/config.h.cmake b/flang/include/flang/Config/config.h.cmake index fd34d3f403631..f7ff495880fa1 100644 --- a/flang/include/flang/Config/config.h.cmake +++ b/flang/include/flang/Config/config.h.cmake @@ -1,10 +1,10 @@ -#===-- include/flang/Config/config.h.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/flang/Config/config.h.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 +// +//===------------------------------------------------------------------------===// /* This generated file is for internal use. Do not include it from headers. */ @@ -16,6 +16,8 @@ #define FLANG_VERSION "${FLANG_VERSION}" +#define FLANG_DEFAULT_LINKER "${FLANG_DEFAULT_LINKER}" + #endif diff --git a/flang/tools/flang-driver/driver.cpp b/flang/tools/flang-driver/driver.cpp index 3a2dffc66428f..b1e02383cd33d 100644 --- a/flang/tools/flang-driver/driver.cpp +++ b/flang/tools/flang-driver/driver.cpp @@ -16,6 +16,7 @@ //===----------------------------------------------------------------------===// #include "clang/Driver/Driver.h" +#include "flang/Config/config.h" #include "flang/Frontend/CompilerInvocation.h" #include "flang/Frontend/TextDiagnosticPrinter.h" #include "clang/Basic/Diagnostic.h" @@ -138,6 +139,7 @@ int main(int argc, const char **argv) { llvm::sys::getDefaultTargetTriple(), diags, "flang LLVM compiler"); theDriver.setTargetAndMode(targetandMode); + theDriver.setPreferredLinker(FLANG_DEFAULT_LINKER); #ifdef FLANG_RUNTIME_F128_MATH_LIB theDriver.setFlangF128MathLibrary(FLANG_RUNTIME_F128_MATH_LIB); #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits