diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart index c8cc3f2345a..23ad8d60195 100644 --- a/pkg/dartdev/lib/src/commands/compile.dart +++ b/pkg/dartdev/lib/src/commands/compile.dart @@ -4,7 +4,6 @@ import 'dart:async'; import 'dart:io'; -import 'dart:isolate'; import 'package:args/args.dart'; import 'package:dart2native/generate.dart'; @@ -88,48 +87,41 @@ class CompileJSCommand extends CompileSubcommandCommand { @override FutureOr run() async { - if (!Sdk.checkArtifactExists(sdk.dart2jsSnapshot) || - !Sdk.checkArtifactExists(sdk.librariesJson)) { - return 255; + if (!Sdk.checkArtifactExists(sdk.librariesJson)) { + return genericErrorExitCode; } - final args = argResults!; - - // Build arguments. - final buildArgs = [ + var snapshot = sdk.dart2jsAotSnapshot; + var runtime = sdk.dartAotRuntime; + if (!Sdk.checkArtifactExists(snapshot, logError: false)) { + // AOT snapshots cannot be generated on IA32, so we need this fallback + // branch until support for IA32 is dropped (https://dartbug.com/49969). + snapshot = sdk.dart2jsSnapshot; + runtime = sdk.dart; + if (!Sdk.checkArtifactExists(snapshot)) { + return genericErrorExitCode; + } + } + final dart2jsCommand = [ + runtime, + snapshot, '--libraries-spec=${sdk.librariesJson}', '--cfe-invocation-modes=compile', '--invoker=dart_cli', // Add the remaining arguments. if (args.rest.isNotEmpty) ...args.rest.sublist(0), ]; - - var retval = 0; - final result = Completer(); - final exitPort = ReceivePort() - ..listen((msg) { - result.complete(0); - }); - final errorPort = ReceivePort() - ..listen((error) { - log.stderr(error.toString()); - result.complete(255); - }); try { - await Isolate.spawnUri(Uri.file(sdk.dart2jsSnapshot), buildArgs, null, - onExit: exitPort.sendPort, onError: errorPort.sendPort); - retval = await result.future; + final exitCode = await runProcessInheritStdio(dart2jsCommand); + return exitCode; } catch (e, st) { log.stderr('Error: JS compilation failed'); log.stderr(e.toString()); if (verbose) { log.stderr(st.toString()); } - retval = compileErrorExitCode; + return compileErrorExitCode; } - errorPort.close(); - exitPort.close(); - return retval; } } diff --git a/pkg/dartdev/lib/src/core.dart b/pkg/dartdev/lib/src/core.dart index c6a8c79b13a..8e89b55745f 100644 --- a/pkg/dartdev/lib/src/core.dart +++ b/pkg/dartdev/lib/src/core.dart @@ -119,8 +119,11 @@ Future runProcess( } log.trace(command.join(' ')); - final process = await Process.start(command.first, command.skip(1).toList(), - workingDirectory: cwd); + final process = await Process.start( + command.first, + command.skip(1).toList(), + workingDirectory: cwd, + ); final (_, _, exitCode) = await ( forward(process.stdout, false), forward(process.stderr, true), @@ -129,6 +132,22 @@ Future runProcess( return exitCode; } +Future runProcessInheritStdio( + List command, { + bool logToTrace = false, + void Function(String str)? listener, + String? cwd, +}) async { + log.trace(command.join(' ')); + final process = await Process.start( + command.first, + command.skip(1).toList(), + workingDirectory: cwd, + mode: ProcessStartMode.inheritStdio, + ); + return await process.exitCode; +} + Future _streamLineTransform( Stream> stream, Function(String line) handler, diff --git a/pkg/dartdev/lib/src/sdk.dart b/pkg/dartdev/lib/src/sdk.dart index 168294bdf91..5ef7626abce 100644 --- a/pkg/dartdev/lib/src/sdk.dart +++ b/pkg/dartdev/lib/src/sdk.dart @@ -71,6 +71,10 @@ class Sdk { 'dart2js.dart.snapshot', ); + String get dart2jsAotSnapshot => _snapshotPathFor( + 'dart2js_aot.dart.snapshot', + ); + String get dart2wasmSnapshot => _snapshotPathFor( 'dart2wasm_product.snapshot', ); diff --git a/pkg/dartdev/test/sdk_test.dart b/pkg/dartdev/test/sdk_test.dart index de399660df7..9ef7801da80 100644 --- a/pkg/dartdev/test/sdk_test.dart +++ b/pkg/dartdev/test/sdk_test.dart @@ -30,7 +30,7 @@ void _sdk() { }); test('dart2js snapshot', () { - expectFileExists(Sdk().dart2jsSnapshot); + expectSnapshotExists(Sdk().dart2jsAotSnapshot, Sdk().dart2jsSnapshot); }); } diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index e03cf3e537b..93cf0222172 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -43,7 +43,8 @@ declare_args() { # ......snapshots/ # ........analysis_server.dart.snapshot # ........dart2bytecode.snapshot (if dart_dynamic_modules) -# ........dart2js.dart.snapshot +# ........dart2js_aot.dart.snapshot (AOT snapshot, if not on ia32) +# ........dart2js.dart.snapshot (JIT snapshot only on ia32) # ........dart2wasm_product.snapshot (if not on ia32) # ........dartdev.dart.snapshot (app-jit snapshot or kernel dill file) # ........dartdevc.dart.snapshot @@ -152,10 +153,6 @@ if (dart_dynamic_modules) { } _full_sdk_snapshots = _platform_sdk_snapshots + [ - [ - "dart2js", - "../utils/compiler:dart2js", - ], [ "dartdevc", "../utils/ddc:dartdevc", @@ -165,6 +162,17 @@ _full_sdk_snapshots = _platform_sdk_snapshots + [ "../utils/bazel:kernel_worker", ], ] +if (dart_target_arch != "ia32" && dart_target_arch != "x86") { + _full_sdk_snapshots += [ [ + "dart2js_aot", + "../utils/compiler:dart2js_sdk_aot", + ] ] +} else { + _full_sdk_snapshots += [ [ + "dart2js", + "../utils/compiler:dart2js", + ] ] +} # Libraries that go under lib/ _full_sdk_libraries = [ diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn index 7a3093b5acf..f76196af31d 100644 --- a/utils/compiler/BUILD.gn +++ b/utils/compiler/BUILD.gn @@ -87,6 +87,22 @@ aot_snapshot("dart2js_aot") { name = "dart2js_aot" } +aot_snapshot("dart2js_sdk_aot") { + deps = [ ":dart2js_create_snapshot_entry" ] + + main_dart = "$target_gen_dir/dart2js.dart" + name = "dart2js_aot.dart" + output = "$root_gen_dir/dart2js_aot.dart.snapshot" + + # dartaotruntime has dart_product_config applied to it, + # so it is built in # product mode in both release and + # product builds, and is only built in debug mode in debug + # builds. The following line ensures that the dartaotruntime + # and dartdevc_aot snapshot in an SDK build are + # always compatible with each other. + force_product_mode = !dart_debug +} + compile_platform("compile_dart2js_platform_unsound") { single_root_scheme = "org-dartlang-sdk" single_root_base = rebase_path("$sdk_root/")