diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -90,6 +90,28 @@ CmdArgs.push_back(Output.getFilename()); C.addCommand(llvm::make_unique(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(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); } } diff --git a/clang/test/Driver/wasm-toolchain-lto.c b/clang/test/Driver/wasm-toolchain-lto.c new file mode 100644 --- /dev/null +++ b/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"