[PATCH] D70500: [WebAssembly] Enable use of wasm-opt and LTO-enabled system libraries
Dan Gohman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 20 10:39:57 PST 2019
sunfish created this revision.
sunfish added reviewers: sbc100, dschuff, aheejin.
Herald added subscribers: dexonsmith, steven_wu, hiraditya, jgravelle-google, inglorion, aprantl, mehdi_amini.
Herald added a project: clang.
When the WASM_OPT environment variable is set, run the wasm-opt tool to optimize LLVM's output. Note that using wasm-opt currently means invalidating all debug info, however we can just tell users this when we tell them about WASM_OPT. This fixes PR43796.
Also, add an "llvm-lto" directory to the sysroot library search paths, so that sysroots can optionally provide LTO-enabled system libraries.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D70500
Files:
clang/lib/Driver/ToolChains/WebAssembly.cpp
clang/test/Driver/wasm-toolchain-lto.c
Index: clang/test/Driver/wasm-toolchain-lto.c
===================================================================
--- /dev/null
+++ clang/test/Driver/wasm-toolchain-lto.c
@@ -0,0 +1,6 @@
+// A basic C link command-line with optimization with known OS and LTO enabled.
+
+// RUN: %clang -### -O2 -flto -no-canonical-prefixes -target wasm32-wasi --sysroot=/foo %s 2>&1 \
+// RUN: | FileCheck -check-prefix=LINK_OPT_KNOWN %s
+// LINK_OPT_KNOWN: clang{{.*}}" "-cc1" {{.*}} "-o" "[[temp:[^"]*]]"
+// LINK_OPT_KNOWN: wasm-ld{{.*}}" "-L/foo/lib/wasm32-wasi/llvm-lto" "-L/foo/lib/wasm32-wasi" "crt1.o" "[[temp]]" "-lc" "{{.*[/\\]}}libclang_rt.builtins-wasm32.a" "-o" "a.out"
Index: clang/lib/Driver/ToolChains/WebAssembly.cpp
===================================================================
--- clang/lib/Driver/ToolChains/WebAssembly.cpp
+++ clang/lib/Driver/ToolChains/WebAssembly.cpp
@@ -90,6 +90,28 @@
CmdArgs.push_back(Output.getFilename());
C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
+
+ // When optimizing, if WASM_OPT is set, run wasm-opt.
+ if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
+ if (const char *WasmOptPath = getenv("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();
+
+ 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(llvm::make_unique<Command>(JA, *this, WasmOpt, CmdArgs, Inputs));
+ }
+ }
}
WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
@@ -109,6 +131,11 @@
} else {
const std::string MultiarchTriple =
getMultiarchTriple(getDriver(), Triple, getDriver().SysRoot);
+ if (D.isUsingLTO()) {
+ // For LTO, enable use of lto-enabled sysroot libraries too, if available.
+ getFilePaths().push_back(getDriver().SysRoot + "/lib/" + MultiarchTriple +
+ "/llvm-lto");
+ }
getFilePaths().push_back(getDriver().SysRoot + "/lib/" + MultiarchTriple);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70500.230290.patch
Type: text/x-patch
Size: 2472 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191120/25087e0c/attachment-0001.bin>
More information about the cfe-commits
mailing list