Skip to content

Commit c329ecf

Browse files
parabola94mahesh-attarde
authored andcommitted
[clang][Driver] Add a new member for CLANG_DEFAULT_LINKER to clang::driver::Driver (NFC) (llvm#149784)
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.
1 parent e98aa29 commit c329ecf

File tree

7 files changed

+20
-11
lines changed

7 files changed

+20
-11
lines changed

clang/include/clang/Driver/Driver.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,10 @@ class Driver {
337337
/// "clang" as it's first argument.
338338
const char *PrependArg;
339339

340+
/// The default value of -fuse-ld= option. An empty string means the default
341+
/// system linker.
342+
std::string PreferredLinker;
343+
340344
/// Whether to check that input files exist when constructing compilation
341345
/// jobs.
342346
LLVM_PREFERRED_TYPE(bool)
@@ -449,6 +453,11 @@ class Driver {
449453
return ClangExecutable.c_str();
450454
}
451455

456+
StringRef getPreferredLinker() const { return PreferredLinker; }
457+
void setPreferredLinker(std::string Value) {
458+
PreferredLinker = std::move(Value);
459+
}
460+
452461
bool isSaveTempsEnabled() const { return SaveTemps != SaveTempsNone; }
453462
bool isSaveTempsObj() const { return SaveTemps == SaveTempsObj; }
454463

clang/lib/Driver/Driver.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple,
209209
CCLogDiagnostics(false), CCGenDiagnostics(false),
210210
CCPrintProcessStats(false), CCPrintInternalStats(false),
211211
TargetTriple(TargetTriple), Saver(Alloc), PrependArg(nullptr),
212-
CheckInputsExist(true), ProbePrecompiled(true),
213-
SuppressMissingInputWarning(false) {
212+
PreferredLinker(CLANG_DEFAULT_LINKER), CheckInputsExist(true),
213+
ProbePrecompiled(true), SuppressMissingInputWarning(false) {
214214
// Provide a sane fallback if no VFS is specified.
215215
if (!this->VFS)
216216
this->VFS = llvm::vfs::getRealFileSystem();

clang/lib/Driver/ToolChain.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1087,7 +1087,7 @@ std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD) const {
10871087
// Get -fuse-ld= first to prevent -Wunused-command-line-argument. -fuse-ld= is
10881088
// considered as the linker flavor, e.g. "bfd", "gold", or "lld".
10891089
const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ);
1090-
StringRef UseLinker = A ? A->getValue() : CLANG_DEFAULT_LINKER;
1090+
StringRef UseLinker = A ? A->getValue() : getDriver().getPreferredLinker();
10911091

10921092
// --ld-path= takes precedence over -fuse-ld= and specifies the executable
10931093
// name. -B, COMPILER_PATH and PATH and consulted if the value does not

clang/lib/Driver/ToolChains/MSVC.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,8 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
279279
AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
280280
}
281281

282-
StringRef Linker =
283-
Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER);
282+
StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ,
283+
TC.getDriver().getPreferredLinker());
284284
if (Linker.empty())
285285
Linker = "link";
286286
// We need to translate 'lld' into 'lld-link'.

clang/lib/Driver/ToolChains/MinGW.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ toolchains::MinGW::MinGW(const Driver &D, const llvm::Triple &Triple,
548548
getFilePaths().push_back(Base + "lib");
549549

550550
NativeLLVMSupport =
551-
Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER)
551+
Args.getLastArgValue(options::OPT_fuse_ld_EQ, D.getPreferredLinker())
552552
.equals_insensitive("lld");
553553
}
554554

clang/lib/Driver/ToolChains/Solaris.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
3939
bool solaris::isLinkerGnuLd(const ToolChain &TC, const ArgList &Args) {
4040
// Only used if targetting Solaris.
4141
const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ);
42-
StringRef UseLinker = A ? A->getValue() : CLANG_DEFAULT_LINKER;
42+
StringRef UseLinker = A ? A->getValue() : TC.getDriver().getPreferredLinker();
4343
return UseLinker == "bfd" || UseLinker == "gld";
4444
}
4545

@@ -52,7 +52,7 @@ static bool getPIE(const ArgList &Args, const ToolChain &TC) {
5252
TC.isPIEDefault(Args));
5353
}
5454

55-
// FIXME: Need to handle CLANG_DEFAULT_LINKER here?
55+
// FIXME: Need to handle PreferredLinker here?
5656
std::string solaris::Linker::getLinkerPath(const ArgList &Args) const {
5757
const ToolChain &ToolChain = getToolChain();
5858
if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
@@ -345,7 +345,7 @@ SanitizerMask Solaris::getSupportedSanitizers() const {
345345

346346
const char *Solaris::getDefaultLinker() const {
347347
// FIXME: Only handle Solaris ld and GNU ld here.
348-
return llvm::StringSwitch<const char *>(CLANG_DEFAULT_LINKER)
348+
return llvm::StringSwitch<const char *>(getDriver().getPreferredLinker())
349349
.Cases("bfd", "gld", "/usr/gnu/bin/ld")
350350
.Default("/usr/bin/ld");
351351
}

clang/lib/Driver/ToolChains/UEFI.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ void tools::uefi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8383
// This should ideally be handled by ToolChain::GetLinkerPath but we need
8484
// to special case some linker paths. In the case of lld, we need to
8585
// translate 'lld' into 'lld-link'.
86-
StringRef Linker =
87-
Args.getLastArgValue(options::OPT_fuse_ld_EQ, CLANG_DEFAULT_LINKER);
86+
StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ,
87+
TC.getDriver().getPreferredLinker());
8888
if (Linker.empty() || Linker == "lld")
8989
Linker = "lld-link";
9090

0 commit comments

Comments
 (0)