summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver
diff options
context:
space:
mode:
authorDan Gohman <sunfish@mozilla.com>2019-11-20 15:25:43 -0800
committerDan Gohman <sunfish@mozilla.com>2019-11-22 22:16:28 -0800
commit812828984c10857a4cd260eb638c52a4411f9143 (patch)
treeb88b3e18eb60ff280ba5f5f32c1fe5aba1102316 /clang/lib/Driver
parent81b0a3284af1dcef26e56b0de9fd74002083c471 (diff)
downloadbcm5719-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.cpp36
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);
}
}
OpenPOWER on IntegriCloud