forked from OSchip/llvm-project
Driver: Defer computation of linker path until it is needed.
This allows us to construct Linux toolchains without a valid linker. This is needed for example to build a CUDA device toolchain after r253385. llvm-svn: 253707
This commit is contained in:
parent
0d7f89d1ac
commit
39719a77d1
|
@ -92,6 +92,7 @@ private:
|
|||
|
||||
protected:
|
||||
MultilibSet Multilibs;
|
||||
const char *DefaultLinker = "ld";
|
||||
|
||||
ToolChain(const Driver &D, const llvm::Triple &T,
|
||||
const llvm::opt::ArgList &Args);
|
||||
|
|
|
@ -359,7 +359,7 @@ std::string ToolChain::GetLinkerPath() const {
|
|||
return "";
|
||||
}
|
||||
|
||||
return GetProgramPath("ld");
|
||||
return GetProgramPath(DefaultLinker);
|
||||
}
|
||||
|
||||
types::ID ToolChain::LookupTypeForExtension(const char *Ext) const {
|
||||
|
|
|
@ -2455,8 +2455,7 @@ MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
|
|||
getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
|
||||
|
||||
// Use LLD by default.
|
||||
if (!Args.getLastArg(options::OPT_fuse_ld_EQ))
|
||||
Linker = GetProgramPath("lld");
|
||||
DefaultLinker = "lld";
|
||||
}
|
||||
|
||||
void MipsLLVMToolChain::AddClangSystemIncludeArgs(
|
||||
|
@ -2837,8 +2836,6 @@ NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
|
|||
break;
|
||||
}
|
||||
|
||||
// Use provided linker, not system linker
|
||||
Linker = GetLinkerPath();
|
||||
NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
|
||||
}
|
||||
|
||||
|
@ -3693,8 +3690,6 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
|
|||
GCCInstallation.getTriple().str() + "/bin")
|
||||
.str());
|
||||
|
||||
Linker = GetLinkerPath();
|
||||
|
||||
Distro Distro = DetectDistro(D, Arch);
|
||||
|
||||
if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
|
||||
|
|
|
@ -796,7 +796,6 @@ public:
|
|||
llvm::opt::ArgStringList &CmdArgs) const override;
|
||||
virtual std::string computeSysRoot() const;
|
||||
|
||||
std::string Linker;
|
||||
std::vector<std::string> ExtraOpts;
|
||||
|
||||
protected:
|
||||
|
@ -921,7 +920,6 @@ public:
|
|||
|
||||
std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
|
||||
types::ID InputType) const override;
|
||||
std::string Linker;
|
||||
|
||||
protected:
|
||||
Tool *buildLinker() const override;
|
||||
|
|
|
@ -8500,7 +8500,8 @@ void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
// handled somewhere else.
|
||||
Args.ClaimAllArgs(options::OPT_w);
|
||||
|
||||
if (llvm::sys::path::filename(ToolChain.Linker) == "lld") {
|
||||
const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
|
||||
if (llvm::sys::path::filename(Exec) == "lld") {
|
||||
CmdArgs.push_back("-flavor");
|
||||
CmdArgs.push_back("old-gnu");
|
||||
CmdArgs.push_back("-target");
|
||||
|
@ -8686,8 +8687,7 @@ void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
} else if (Args.hasArg(options::OPT_rtlib_EQ))
|
||||
AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
|
||||
|
||||
C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
|
||||
CmdArgs, Inputs));
|
||||
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
|
||||
}
|
||||
|
||||
// NaCl ARM assembly (inline or standalone) can be written with a set of macros
|
||||
|
@ -8858,8 +8858,8 @@ void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
}
|
||||
}
|
||||
|
||||
C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
|
||||
CmdArgs, Inputs));
|
||||
const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
|
||||
C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
|
||||
}
|
||||
|
||||
void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
|
|
|
@ -1,16 +1,19 @@
|
|||
// RUN: %clang -### -target i686-pc-windows-gnu --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s 2>&1 | FileCheck -check-prefix=CHECK_LD_32 %s
|
||||
// CHECK_LD_32: {{ld|ld.exe}}"
|
||||
// CHECK_LD_32: "i386pe"
|
||||
// CHECK_LD_32_NOT: "-flavor" "old-gnu"
|
||||
// CHECK_LD_32-NOT: "-flavor" "old-gnu"
|
||||
|
||||
// RUN: %clang -### -target i686-pc-windows-gnu --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -fuse-ld=lld 2>&1 | FileCheck -check-prefix=CHECK_LLD_32 %s
|
||||
// CHECK_LLD_32-NOT: invalid linker name in argument
|
||||
// CHECK_LLD_32: lld" "-flavor" "old-gnu"
|
||||
// CHECK_LLD_32: "i386pe"
|
||||
|
||||
// RUN: %clang -### -target x86_64-pc-windows-gnu --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -fuse-ld=lld 2>&1 | FileCheck -check-prefix=CHECK_LLD_64 %s
|
||||
// CHECK_LLD_64-NOT: invalid linker name in argument
|
||||
// CHECK_LLD_64: lld" "-flavor" "old-gnu"
|
||||
// CHECK_LLD_64: "i386pep"
|
||||
|
||||
// RUN: %clang -### -target arm-pc-windows-gnu --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -fuse-ld=lld 2>&1 | FileCheck -check-prefix=CHECK_LLD_ARM %s
|
||||
// CHECK_LLD_ARM-NOT: invalid linker name in argument
|
||||
// CHECK_LLD_ARM: lld" "-flavor" "old-gnu"
|
||||
// CHECK_LLD_ARM: "thumb2pe"
|
||||
|
|
Loading…
Reference in New Issue