diff --git a/driver/linker-gcc.cpp b/driver/linker-gcc.cpp index 4ae7ed9e9e..56ebfde858 100644 --- a/driver/linker-gcc.cpp +++ b/driver/linker-gcc.cpp @@ -52,6 +52,7 @@ private: virtual void addFuzzLinkFlags(); virtual void addCppStdlibLinkFlags(); + virtual void addLinker(); virtual void addUserSwitches(); void addDefaultLibs(); virtual void addTargetFlags(); @@ -366,6 +367,7 @@ void ArgsBuilder::build(llvm::StringRef outputPath, addLTOLinkFlags(); #endif + addLinker(); addUserSwitches(); // libs added via pragma(lib, libname) @@ -390,6 +392,13 @@ void ArgsBuilder::build(llvm::StringRef outputPath, ////////////////////////////////////////////////////////////////////////////// +void ArgsBuilder::addLinker() { + if (!opts::linker.empty()) + args.push_back("-fuse-ld=" + opts::linker); +} + +////////////////////////////////////////////////////////////////////////////// + void ArgsBuilder::addUserSwitches() { // additional linker and cc switches (preserve order across both lists) for (unsigned ilink = 0, icc = 0;;) { @@ -486,6 +495,8 @@ void ArgsBuilder::addTargetFlags() { class LdArgsBuilder : public ArgsBuilder { void addSanitizers() override {} + void addLinker() override {} + void addUserSwitches() override { if (!opts::ccSwitches.empty()) { warning(Loc(), "Ignoring -Xcc options"); diff --git a/driver/linker-msvc.cpp b/driver/linker-msvc.cpp index 11a2b5e871..7dcbf325a4 100644 --- a/driver/linker-msvc.cpp +++ b/driver/linker-msvc.cpp @@ -62,8 +62,6 @@ int linkObjToBinaryMSVC(llvm::StringRef outputPath, bool useInternalLinker, windows::setupMsvcEnvironment(); #endif - const std::string tool = "link.exe"; - // build arguments std::vector args; @@ -180,5 +178,9 @@ int linkObjToBinaryMSVC(llvm::StringRef outputPath, bool useInternalLinker, #endif // try to call linker - return executeToolAndWait(tool, args, global.params.verbose); + std::string linker = opts::linker; + if (linker.empty()) + linker = "link.exe"; + + return executeToolAndWait(linker, args, global.params.verbose); } diff --git a/driver/tool.cpp b/driver/tool.cpp index 5d73614ea7..f7a0a8f26b 100644 --- a/driver/tool.cpp +++ b/driver/tool.cpp @@ -22,6 +22,12 @@ ////////////////////////////////////////////////////////////////////////////// +namespace opts { +llvm::cl::opt + linker("linker", llvm::cl::ZeroOrMore, llvm::cl::desc("Linker to use"), + llvm::cl::value_desc("lld-link|lld|gold|bfd|...")); +} + static llvm::cl::opt gcc("gcc", llvm::cl::desc("GCC to use for assembling and linking"), llvm::cl::Hidden, llvm::cl::ZeroOrMore); diff --git a/driver/tool.h b/driver/tool.h index 4ad16e095e..685fb584df 100644 --- a/driver/tool.h +++ b/driver/tool.h @@ -20,6 +20,10 @@ #include "llvm/Support/CommandLine.h" +namespace opts { +extern llvm::cl::opt linker; +} + std::string getGcc(); void appendTargetArgsForGcc(std::vector &args);