[WebAssembly] Don't use default GetLinkerPath
We can't (don't want to) honor the same set of "-fuse-ld" flags with WebAssembly since the ELF linkers (ld.lld, ld.gnu, etc) don't work with wasm object files. Instead we implement our own linker finding logic, similar or other non-ELF platforms like MSVC. We've had a few issues with CLANG_DEFAULT_LINKER overriding the WebAssembly linker which doesn't make sense since there is no generic linker that can handle WebAssembly today. Differential Revision: https://reviews.llvm.org/D59743 llvm-svn: 356953
This commit is contained in:
@@ -12,6 +12,8 @@
|
||||
#include "clang/Driver/Driver.h"
|
||||
#include "clang/Driver/DriverDiagnostic.h"
|
||||
#include "clang/Driver/Options.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Option/ArgList.h"
|
||||
|
||||
using namespace clang::driver;
|
||||
@@ -36,6 +38,25 @@ bool wasm::Linker::isLinkJob() const { return true; }
|
||||
|
||||
bool wasm::Linker::hasIntegratedCPP() const { return false; }
|
||||
|
||||
std::string wasm::Linker::getLinkerPath(const ArgList &Args) const {
|
||||
const ToolChain &ToolChain = getToolChain();
|
||||
if (const Arg* A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
|
||||
StringRef UseLinker = A->getValue();
|
||||
if (!UseLinker.empty()) {
|
||||
if (llvm::sys::path::is_absolute(UseLinker) &&
|
||||
llvm::sys::fs::can_execute(UseLinker))
|
||||
return UseLinker;
|
||||
|
||||
// Accept 'lld', and 'ld' as aliases for the default linker
|
||||
if (UseLinker != "lld" && UseLinker != "ld")
|
||||
ToolChain.getDriver().Diag(diag::err_drv_invalid_linker_name)
|
||||
<< A->getAsString(Args);
|
||||
}
|
||||
}
|
||||
|
||||
return ToolChain.getDefaultLinker();
|
||||
}
|
||||
|
||||
void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
const InputInfo &Output,
|
||||
const InputInfoList &Inputs,
|
||||
@@ -43,7 +64,7 @@ void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
||||
const char *LinkingOutput) const {
|
||||
|
||||
const ToolChain &ToolChain = getToolChain();
|
||||
const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
|
||||
const char *Linker = Args.MakeArgString(getLinkerPath(Args));
|
||||
ArgStringList CmdArgs;
|
||||
|
||||
if (Args.hasArg(options::OPT_s))
|
||||
|
||||
@@ -23,6 +23,7 @@ public:
|
||||
explicit Linker(const ToolChain &TC);
|
||||
bool isLinkJob() const override;
|
||||
bool hasIntegratedCPP() const override;
|
||||
std::string getLinkerPath(const llvm::opt::ArgList &Args) const;
|
||||
void ConstructJob(Compilation &C, const JobAction &JA,
|
||||
const InputInfo &Output, const InputInfoList &Inputs,
|
||||
const llvm::opt::ArgList &TCArgs,
|
||||
|
||||
@@ -12,25 +12,25 @@
|
||||
|
||||
// A basic C link command-line with unknown OS.
|
||||
|
||||
// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo -fuse-ld=wasm-ld %s 2>&1 | FileCheck -check-prefix=LINK %s
|
||||
// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s 2>&1 | FileCheck -check-prefix=LINK %s
|
||||
// LINK: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK: wasm-ld{{.*}}" "-L/foo/lib" "crt1.o" "[[temp]]" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
// A basic C link command-line with optimization with unknown OS.
|
||||
|
||||
// RUN: %clang -### -O2 -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo -fuse-ld=wasm-ld %s 2>&1 | FileCheck -check-prefix=LINK_OPT %s
|
||||
// RUN: %clang -### -O2 -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s 2>&1 | FileCheck -check-prefix=LINK_OPT %s
|
||||
// LINK_OPT: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK_OPT: wasm-ld{{.*}}" "-L/foo/lib" "crt1.o" "[[temp]]" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
// A basic C link command-line with known OS.
|
||||
|
||||
// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo -fuse-ld=wasm-ld %s 2>&1 | FileCheck -check-prefix=LINK_KNOWN %s
|
||||
// RUN: %clang -### -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo %s 2>&1 | FileCheck -check-prefix=LINK_KNOWN %s
|
||||
// LINK_KNOWN: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK_KNOWN: wasm-ld{{.*}}" "-L/foo/lib/wasm32-wasi-musl" "crt1.o" "[[temp]]" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
// A basic C link command-line with optimization with known OS.
|
||||
|
||||
// RUN: %clang -### -O2 -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo -fuse-ld=wasm-ld %s 2>&1 | FileCheck -check-prefix=LINK_OPT_KNOWN %s
|
||||
// RUN: %clang -### -O2 -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo %s 2>&1 | FileCheck -check-prefix=LINK_OPT_KNOWN %s
|
||||
// LINK_OPT_KNOWN: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK_OPT_KNOWN: wasm-ld{{.*}}" "-L/foo/lib/wasm32-wasi-musl" "crt1.o" "[[temp]]" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
|
||||
@@ -12,25 +12,25 @@
|
||||
|
||||
// A basic C++ link command-line with unknown OS.
|
||||
|
||||
// RUN: %clangxx -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo -fuse-ld=wasm-ld --stdlib=c++ %s 2>&1 | FileCheck -check-prefix=LINK %s
|
||||
// RUN: %clangxx -### -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo --stdlib=c++ %s 2>&1 | FileCheck -check-prefix=LINK %s
|
||||
// LINK: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK: wasm-ld{{.*}}" "-L/foo/lib" "crt1.o" "[[temp]]" "-lc++" "-lc++abi" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
// A basic C++ link command-line with optimization with unknown OS.
|
||||
|
||||
// RUN: %clangxx -### -O2 -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s --stdlib=c++ -fuse-ld=wasm-ld 2>&1 | FileCheck -check-prefix=LINK_OPT %s
|
||||
// RUN: %clangxx -### -O2 -no-canonical-prefixes -target wasm32-unknown-unknown --sysroot=/foo %s --stdlib=c++ 2>&1 | FileCheck -check-prefix=LINK_OPT %s
|
||||
// LINK_OPT: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK_OPT: wasm-ld{{.*}}" "-L/foo/lib" "crt1.o" "[[temp]]" "-lc++" "-lc++abi" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
// A basic C++ link command-line with known OS.
|
||||
|
||||
// RUN: %clangxx -### -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo -fuse-ld=wasm-ld --stdlib=c++ %s 2>&1 | FileCheck -check-prefix=LINK_KNOWN %s
|
||||
// RUN: %clangxx -### -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo --stdlib=c++ %s 2>&1 | FileCheck -check-prefix=LINK_KNOWN %s
|
||||
// LINK_KNOWN: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK_KNOWN: wasm-ld{{.*}}" "-L/foo/lib/wasm32-wasi-musl" "crt1.o" "[[temp]]" "-lc++" "-lc++abi" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
// A basic C++ link command-line with optimization with known OS.
|
||||
|
||||
// RUN: %clangxx -### -O2 -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo %s --stdlib=c++ -fuse-ld=wasm-ld 2>&1 | FileCheck -check-prefix=LINK_OPT_KNOWN %s
|
||||
// RUN: %clangxx -### -O2 -no-canonical-prefixes -target wasm32-unknown-wasi-musl --sysroot=/foo %s --stdlib=c++ 2>&1 | FileCheck -check-prefix=LINK_OPT_KNOWN %s
|
||||
// LINK_OPT_KNOWN: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
|
||||
// LINK_OPT_KNOWN: wasm-ld{{.*}}" "-L/foo/lib/wasm32-wasi-musl" "crt1.o" "[[temp]]" "-lc++" "-lc++abi" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user