Author: pcc Date: Fri Nov 20 14:49:39 2015 New Revision: 253707 URL: http://llvm.org/viewvc/llvm-project?rev=253707&view=rev Log: 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. Modified: cfe/trunk/include/clang/Driver/ToolChain.h cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/lib/Driver/ToolChains.cpp cfe/trunk/lib/Driver/ToolChains.h cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/test/Driver/mingw-useld.c Modified: cfe/trunk/include/clang/Driver/ToolChain.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=253707&r1=253706&r2=253707&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/ToolChain.h (original) +++ cfe/trunk/include/clang/Driver/ToolChain.h Fri Nov 20 14:49:39 2015 @@ -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); Modified: cfe/trunk/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=253707&r1=253706&r2=253707&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChain.cpp (original) +++ cfe/trunk/lib/Driver/ToolChain.cpp Fri Nov 20 14:49:39 2015 @@ -359,7 +359,7 @@ std::string ToolChain::GetLinkerPath() c return ""; } - return GetProgramPath("ld"); + return GetProgramPath(DefaultLinker); } types::ID ToolChain::LookupTypeForExtension(const char *Ext) const { Modified: cfe/trunk/lib/Driver/ToolChains.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=253707&r1=253706&r2=253707&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains.cpp Fri Nov 20 14:49:39 2015 @@ -2455,8 +2455,7 @@ MipsLLVMToolChain::MipsLLVMToolChain(con 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 Drive 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 GCCInstallation.getTriple().str() + "/bin") .str()); - Linker = GetLinkerPath(); - Distro Distro = DetectDistro(D, Arch); if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) { Modified: cfe/trunk/lib/Driver/ToolChains.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=253707&r1=253706&r2=253707&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.h (original) +++ cfe/trunk/lib/Driver/ToolChains.h Fri Nov 20 14:49:39 2015 @@ -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; Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=253707&r1=253706&r2=253707&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Fri Nov 20 14:49:39 2015 @@ -8500,7 +8500,8 @@ void gnutools::Linker::ConstructJob(Comp // 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(Comp } 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(Com } } - 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, Modified: cfe/trunk/test/Driver/mingw-useld.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/mingw-useld.c?rev=253707&r1=253706&r2=253707&view=diff ============================================================================== --- cfe/trunk/test/Driver/mingw-useld.c (original) +++ cfe/trunk/test/Driver/mingw-useld.c Fri Nov 20 14:49:39 2015 @@ -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" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits