Add -linker command-line option (#2386)

To set the linker executable for MSVC targets (e.g., `lld-link`) or the
`-fuse-ld` arg for the gcc linking command-line for the other targets.
This commit is contained in:
kinke 2017-10-28 01:21:24 +02:00 committed by GitHub
parent fa3a78174f
commit aeaf35c42f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 3 deletions

View file

@ -52,6 +52,7 @@ private:
virtual void addFuzzLinkFlags(); virtual void addFuzzLinkFlags();
virtual void addCppStdlibLinkFlags(); virtual void addCppStdlibLinkFlags();
virtual void addLinker();
virtual void addUserSwitches(); virtual void addUserSwitches();
void addDefaultLibs(); void addDefaultLibs();
virtual void addTargetFlags(); virtual void addTargetFlags();
@ -366,6 +367,7 @@ void ArgsBuilder::build(llvm::StringRef outputPath,
addLTOLinkFlags(); addLTOLinkFlags();
#endif #endif
addLinker();
addUserSwitches(); addUserSwitches();
// libs added via pragma(lib, libname) // 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() { void ArgsBuilder::addUserSwitches() {
// additional linker and cc switches (preserve order across both lists) // additional linker and cc switches (preserve order across both lists)
for (unsigned ilink = 0, icc = 0;;) { for (unsigned ilink = 0, icc = 0;;) {
@ -486,6 +495,8 @@ void ArgsBuilder::addTargetFlags() {
class LdArgsBuilder : public ArgsBuilder { class LdArgsBuilder : public ArgsBuilder {
void addSanitizers() override {} void addSanitizers() override {}
void addLinker() override {}
void addUserSwitches() override { void addUserSwitches() override {
if (!opts::ccSwitches.empty()) { if (!opts::ccSwitches.empty()) {
warning(Loc(), "Ignoring -Xcc options"); warning(Loc(), "Ignoring -Xcc options");

View file

@ -62,8 +62,6 @@ int linkObjToBinaryMSVC(llvm::StringRef outputPath, bool useInternalLinker,
windows::setupMsvcEnvironment(); windows::setupMsvcEnvironment();
#endif #endif
const std::string tool = "link.exe";
// build arguments // build arguments
std::vector<std::string> args; std::vector<std::string> args;
@ -180,5 +178,9 @@ int linkObjToBinaryMSVC(llvm::StringRef outputPath, bool useInternalLinker,
#endif #endif
// try to call linker // 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);
} }

View file

@ -22,6 +22,12 @@
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
namespace opts {
llvm::cl::opt<std::string>
linker("linker", llvm::cl::ZeroOrMore, llvm::cl::desc("Linker to use"),
llvm::cl::value_desc("lld-link|lld|gold|bfd|..."));
}
static llvm::cl::opt<std::string> static llvm::cl::opt<std::string>
gcc("gcc", llvm::cl::desc("GCC to use for assembling and linking"), gcc("gcc", llvm::cl::desc("GCC to use for assembling and linking"),
llvm::cl::Hidden, llvm::cl::ZeroOrMore); llvm::cl::Hidden, llvm::cl::ZeroOrMore);

View file

@ -20,6 +20,10 @@
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
namespace opts {
extern llvm::cl::opt<std::string> linker;
}
std::string getGcc(); std::string getGcc();
void appendTargetArgsForGcc(std::vector<std::string> &args); void appendTargetArgsForGcc(std::vector<std::string> &args);