From b890ed4cc32f5807a9786ab325524109d71430f0 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 10 Mar 2023 18:34:10 +0000 Subject: [PATCH] Reland x3 [dart2wasm] Include wasm-opt in the shipped dart-sdk. Hide this behind a flag, so that we can disable it when building in the flutter in-tree build. The flag will be set to false for the in-tree flutter build, see https://github.com/flutter/engine/pull/40195 Change-Id: I248376985d05bfb248a2eab6fa377cbb01d75654 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/288040 Commit-Queue: Jackson Gardner Reviewed-by: Martin Kustermann --- build/config/compiler/BUILD.gn | 15 +++++++-- build/toolchain/win/tool_wrapper.py | 24 +++++++++++++- sdk/BUILD.gn | 16 ++++++++++ third_party/binaryen/BUILD.gn | 47 +++++++++++++++++++++------- third_party/binaryen/list_sources.py | 7 ++--- tools/gn.py | 1 + 6 files changed, 91 insertions(+), 19 deletions(-) diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index e928288a369..f6c2c6625dc 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn @@ -608,12 +608,12 @@ if (is_win) { default_warning_flags += [ "-Wno-tautological-constant-compare", "-Wno-unused-but-set-variable", # icu - "-Wno-unused-but-set-parameter", # binaryen "-Wno-deprecated-non-prototype", # zlib ] } else { - default_warning_flags += - [ "-Wno-ignored-qualifiers" ] # Warnings in BoringSSL headers + default_warning_flags += [ + "-Wno-ignored-qualifiers", # Warnings in BoringSSL headers + ] } if (is_mac) { @@ -727,6 +727,15 @@ config("no_rtti") { } } +config("enable_exceptions") { + if (is_win) { + cflags_cc = [ "/EHsc" ] + defines = [ "_HAS_EXCEPTIONS=1" ] + } else if (is_clang) { + cflags_cc = [ "-fexceptions" ] + } +} + # Optimization ----------------------------------------------------------------- # # Note that BUILDCONFIG.gn sets up a variable "default_optimization_config" diff --git a/build/toolchain/win/tool_wrapper.py b/build/toolchain/win/tool_wrapper.py index 652a879466e..3f52ee0c87d 100644 --- a/build/toolchain/win/tool_wrapper.py +++ b/build/toolchain/win/tool_wrapper.py @@ -8,6 +8,7 @@ is used to set up calls to tools used by the build that need wrappers. """ import os +import pathlib import re import shutil import subprocess @@ -149,7 +150,28 @@ class WinTool(object): not line.startswith('Generating code') and not line.startswith('Finished generating code')): print(line) - return link.wait() + link_result = link.wait() + + if link_result != 0: + return link_result + + # The toolchain configuration in gn always expects a .lib file to be + # included in the output of the link step. However, this only happens + # when the output has exports, and that is not always the case. In + # order to satisfy the expected outputs, we create a dummy .lib file + # in cases where the link step didn't actually create one. + for arg in args: + m = _LINK_EXE_OUT_ARG.match(arg) + if m: + output_filename = m.group('out') + (basename, extension) = os.path.splitext(output_filename) + if extension == '.exe': + lib_path = pathlib.Path(basename + ".lib") + if not os.path.exists(lib_path): + lib_path.touch() + break + + return link_result def ExecMidlWrapper(self, arch, outdir, tlb, h, dlldata, iid, proxy, idl, *flags): diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 61874d8750c..f4db77069a4 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -27,6 +27,9 @@ declare_args() { dart_precompiled_runtime_stripped_binary = "dart_precompiled_runtime_product" gen_snapshot_stripped_binary = "gen_snapshot_product" analyze_snapshot_binary = "analyze_snapshot" + wasm_opt_stripped_binary = "wasm-opt" + + dart_include_wasm_opt = true } # The directory layout of the SDK is as follows: @@ -518,6 +521,16 @@ copy("copy_dart2wasm_snapshot") { [ "$root_out_dir/$dart_sdk_output/bin/snapshots/{{source_file_part}}" ] } +copy("copy_wasm_opt") { + visibility = [ ":create_full_sdk" ] + deps = [ + ":copy_libraries", + "../third_party/binaryen:wasm-opt", + ] + sources = [ "$root_out_dir/${wasm_opt_stripped_binary}${executable_suffix}" ] + outputs = [ "$root_out_dir/$dart_sdk_output/bin/utils/{{source_file_part}}" ] +} + # Copies DDC's SDK full and outline .dill files to lib/_internal. copy("copy_dev_compiler_dills") { visibility = [ ":copy_dev_compiler_sdk" ] @@ -756,6 +769,9 @@ group("create_full_sdk") { ":copy_dart2wasm_platform", ":copy_dart2wasm_snapshot", ] + if (dart_include_wasm_opt) { + public_deps += [ ":copy_wasm_opt" ] + } } } diff --git a/third_party/binaryen/BUILD.gn b/third_party/binaryen/BUILD.gn index 139d9f8e1b8..d474908af5b 100644 --- a/third_party/binaryen/BUILD.gn +++ b/third_party/binaryen/BUILD.gn @@ -4,6 +4,14 @@ import("../../sdk_args.gni") +config("binaryen_warnings") { + if (is_clang) { + cflags = [ "-Wno-unused-but-set-parameter" ] + } else if (!is_win) { + cflags = [ "-Wno-unused-variable" ] + } +} + action("generate_needed_files") { script = "generate_needed_files.py" @@ -31,24 +39,31 @@ action("generate_needed_files") { source_set("binaryen_sources") { src_dirs = [ - rebase_path("src/src/ir", root_build_dir), - rebase_path("src/src/asmjs", root_build_dir), - rebase_path("src/src/cfg", root_build_dir), - rebase_path("src/src/passes", root_build_dir), - rebase_path("src/src/support", root_build_dir), - rebase_path("src/src/wasm", root_build_dir), - rebase_path("src/src/tools/fuzzing", root_build_dir), - rebase_path("src/src/emscripten-optimizer", root_build_dir), + "src/src/ir", + "src/src/asmjs", + "src/src/cfg", + "src/src/passes", + "src/src/support", + "src/src/wasm", + "src/src/tools/fuzzing", + "src/src/emscripten-optimizer", ] # We avoid listing all sources manually, this means when updating # binaryen in DEPS (or manually editing) one has to ensure to # re-run GN in DEPS to ensure new dependencies are picked up. # (this lowers the maintenance burden of GN build support for binaryen) - sources = exec_script("list_sources.py", - src_dirs, + sources = [] + foreach(src_dir, src_dirs) { + foreach(src_file, + exec_script("list_sources.py", + [ rebase_path(src_dir, root_build_dir) ], "list lines", - [ "$default_git_folder/logs/HEAD" ]) + [ "$default_git_folder/logs/HEAD" ])) { + sources += [ "$src_dir/$src_file" ] + } + } + include_dirs = [ "src/src" ] # Ensure WasmIntrinsics.cpp/config.h files are generated. @@ -59,6 +74,11 @@ source_set("binaryen_sources") { # Ensure generated config.h file is include path. include_dirs += [ "$target_gen_dir" ] + + configs += [ + "//build/config/compiler:enable_exceptions", + ":binaryen_warnings", + ] } template("wasm_tool") { @@ -72,6 +92,11 @@ template("wasm_tool") { include_dirs = [ "src/src" ] deps = [ ":binaryen_sources" ] forward_variables_from(invoker, "*") + + configs += [ + "//build/config/compiler:enable_exceptions", + ":binaryen_warnings", + ] } } diff --git a/third_party/binaryen/list_sources.py b/third_party/binaryen/list_sources.py index 2d894adcbfb..903ebf6455e 100644 --- a/third_party/binaryen/list_sources.py +++ b/third_party/binaryen/list_sources.py @@ -8,10 +8,9 @@ import sys def main(args): - for dirname in args: - for file in os.listdir(dirname): - if file.endswith('.cpp') or file.endswith('.h'): - print(os.path.join(dirname, file)) + for file in os.listdir(args[0]): + if file.endswith('.cpp') or file.endswith('.h'): + print(file) if __name__ == '__main__': diff --git a/tools/gn.py b/tools/gn.py index 701ab47e817..99114843129 100755 --- a/tools/gn.py +++ b/tools/gn.py @@ -297,6 +297,7 @@ def ToGnArgs(args, mode, arch, target_os, sanitizer, verify_sdk_hash): gn_args['gen_snapshot_stripped_binary'] = ( 'exe.stripped/gen_snapshot_product') gn_args['analyze_snapshot_binary'] = ('exe.stripped/analyze_snapshot') + gn_args['wasm_opt_stripped_binary'] = 'exe.stripped/wasm-opt' # Setup the user-defined sysroot. if UseSysroot(args, gn_args):