diff options
author | Dan Gohman <dan433584@gmail.com> | 2019-01-15 06:58:16 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2019-01-15 06:58:16 +0000 |
commit | 055a6f0462ea2bc59127a446fa00fb66dc354fc1 (patch) | |
tree | 15ef679f993855fd668424e973ccd71327eb2445 /clang/lib | |
parent | 1839dfd6d44fb9c0b9b352fc7ecbabac90cc1c7e (diff) |
[WebAssembly] Support multilibs for wasm32 and add a wasm OS that uses it
This adds support for multilib paths for wasm32 targets, following
[Debian's Multiarch conventions], and also adds an experimental OS name in
order to test it.
[Debian's Multiarch conventions]: https://wiki.debian.org/Multiarch/
Differential Revision: https://reviews.llvm.org/D56553
llvm-svn: 351164
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 14 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/WebAssembly.cpp | 38 |
2 files changed, 43 insertions, 9 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index f79da4e5761f..fd201a9adda6 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -572,17 +572,19 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::wasm32: if (Triple.getSubArch() != llvm::Triple::NoSubArch || Triple.getVendor() != llvm::Triple::UnknownVendor || - Triple.getOS() != llvm::Triple::UnknownOS || - Triple.getEnvironment() != llvm::Triple::UnknownEnvironment || - !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm())) + !Triple.isOSBinFormatWasm()) + return nullptr; + if (Triple.getOS() != llvm::Triple::UnknownOS && + Triple.getOS() != llvm::Triple::COWS) return nullptr; return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts); case llvm::Triple::wasm64: if (Triple.getSubArch() != llvm::Triple::NoSubArch || Triple.getVendor() != llvm::Triple::UnknownVendor || - Triple.getOS() != llvm::Triple::UnknownOS || - Triple.getEnvironment() != llvm::Triple::UnknownEnvironment || - !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm())) + !Triple.isOSBinFormatWasm()) + return nullptr; + if (Triple.getOS() != llvm::Triple::UnknownOS && + Triple.getOS() != llvm::Triple::COWS) return nullptr; return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts); diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp index 6776a41dad06..6310d5fabaec 100644 --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -24,6 +24,15 @@ using namespace llvm::opt; wasm::Linker::Linker(const ToolChain &TC) : GnuTool("wasm::Linker", "lld", TC) {} +/// Following the conventions in https://wiki.debian.org/Multiarch/Tuples, +/// we remove the vendor field to form the multiarch triple. +static std::string getMultiarchTriple(const Driver &D, + const llvm::Triple &TargetTriple, + StringRef SysRoot) { + return (TargetTriple.getArchName() + "-" + + TargetTriple.getOSAndEnvironmentName()).str(); +} + bool wasm::Linker::isLinkJob() const { return true; } bool wasm::Linker::hasIntegratedCPP() const { return false; } @@ -75,7 +84,17 @@ WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple, getProgramPaths().push_back(getDriver().getInstalledDir()); - getFilePaths().push_back(getDriver().SysRoot + "/lib"); + if (getTriple().getOS() == llvm::Triple::UnknownOS) { + // Theoretically an "unknown" OS should mean no standard libraries, however + // it could also mean that a custom set of libraries is in use, so just add + // /lib to the search path. Disable multiarch in this case, to discourage + // paths containing "unknown" from acquiring meanings. + getFilePaths().push_back(getDriver().SysRoot + "/lib"); + } else { + const std::string MultiarchTriple = + getMultiarchTriple(getDriver(), Triple, getDriver().SysRoot); + getFilePaths().push_back(getDriver().SysRoot + "/lib/" + MultiarchTriple); + } } bool WebAssembly::IsMathErrnoDefault() const { return false; } @@ -124,16 +143,29 @@ WebAssembly::GetCXXStdlibType(const ArgList &Args) const { void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { - if (!DriverArgs.hasArg(options::OPT_nostdinc)) + if (!DriverArgs.hasArg(options::OPT_nostdinc)) { + if (getTriple().getOS() != llvm::Triple::UnknownOS) { + const std::string MultiarchTriple = + getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot); + addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include/" + MultiarchTriple); + } addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include"); + } } void WebAssembly::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { if (!DriverArgs.hasArg(options::OPT_nostdlibinc) && - !DriverArgs.hasArg(options::OPT_nostdincxx)) + !DriverArgs.hasArg(options::OPT_nostdincxx)) { + if (getTriple().getOS() != llvm::Triple::UnknownOS) { + const std::string MultiarchTriple = + getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot); + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/include/" + MultiarchTriple + "/c++/v1"); + } addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include/c++/v1"); + } } void WebAssembly::AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, |