diff options
| author | Dan Gohman <sunfish@mozilla.com> | 2019-11-20 15:25:43 -0800 |
|---|---|---|
| committer | Dan Gohman <sunfish@mozilla.com> | 2019-11-22 22:16:28 -0800 |
| commit | 812828984c10857a4cd260eb638c52a4411f9143 (patch) | |
| tree | b88b3e18eb60ff280ba5f5f32c1fe5aba1102316 /clang/lib/Driver | |
| parent | 81b0a3284af1dcef26e56b0de9fd74002083c471 (diff) | |
| download | bcm5719-llvm-812828984c10857a4cd260eb638c52a4411f9143.tar.gz bcm5719-llvm-812828984c10857a4cd260eb638c52a4411f9143.zip | |
[WebAssembly] Use wasm-opt and LTO libraries when available.
When there's a wasm-opt in the PATH, run the it to optimize LLVM's
output. This fixes PR43796.
And, add an "llvm-lto" directory to the sysroot library search paths,
so that sysroots can provide LTO-enabled system libraries.
Differential Revision: https://reviews.llvm.org/D70500
Diffstat (limited to 'clang/lib/Driver')
| -rw-r--r-- | clang/lib/Driver/ToolChains/WebAssembly.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp index ab648025f22..a2a9dff79e5 100644 --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -8,6 +8,7 @@ #include "WebAssembly.h" #include "CommonArgs.h" +#include "clang/Basic/Version.h" #include "clang/Config/config.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" @@ -90,6 +91,31 @@ void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Output.getFilename()); C.addCommand(std::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs)); + + // When optimizing, if wasm-opt is in the PATH, run wasm-opt. + if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { + if (llvm::ErrorOr<std::string> WasmOptPath = + llvm::sys::findProgramByName("wasm-opt")) { + StringRef OOpt = "s"; + if (A->getOption().matches(options::OPT_O4) || + A->getOption().matches(options::OPT_Ofast)) + OOpt = "4"; + else if (A->getOption().matches(options::OPT_O0)) + OOpt = "0"; + else if (A->getOption().matches(options::OPT_O)) + OOpt = A->getValue(); + + if (OOpt != "0") { + const char *WasmOpt = Args.MakeArgString(*WasmOptPath); + ArgStringList CmdArgs; + CmdArgs.push_back(Output.getFilename()); + CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt)); + CmdArgs.push_back("-o"); + CmdArgs.push_back(Output.getFilename()); + C.addCommand(std::make_unique<Command>(JA, *this, WasmOpt, CmdArgs, Inputs)); + } + } + } } WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple, @@ -109,6 +135,16 @@ WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple, } else { const std::string MultiarchTriple = getMultiarchTriple(getDriver(), Triple, getDriver().SysRoot); + if (D.isUsingLTO()) { + auto LLVMRevision = getLLVMRevision(); + if (!LLVMRevision.empty()) { + // For LTO, enable use of lto-enabled sysroot libraries too, if available. + // Note that the directory is keyed to the LLVM revision, as LLVM's + // bitcode format is not stable. + getFilePaths().push_back(getDriver().SysRoot + "/lib/" + MultiarchTriple + + "/llvm-lto/" + LLVMRevision); + } + } getFilePaths().push_back(getDriver().SysRoot + "/lib/" + MultiarchTriple); } } |

