[SDK] Reland : Switch dart2js to an AOT snapshot.

TESTS=ci

Change-Id: I8c9f9d01cb462d1027c7a6a6521f40946fc7638b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/388071
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index c8cc3f2..23ad8d6 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 @@
 
   @override
   FutureOr<int> 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 = <String>[
+    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<int>();
-    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 c6a8c79..8e89b55 100644
--- a/pkg/dartdev/lib/src/core.dart
+++ b/pkg/dartdev/lib/src/core.dart
@@ -119,8 +119,11 @@
   }
 
   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 @@
   return exitCode;
 }
 
+Future<int> runProcessInheritStdio(
+  List<String> 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<List<int>> stream,
   Function(String line) handler,
diff --git a/pkg/dartdev/lib/src/sdk.dart b/pkg/dartdev/lib/src/sdk.dart
index 168294b..5ef7626 100644
--- a/pkg/dartdev/lib/src/sdk.dart
+++ b/pkg/dartdev/lib/src/sdk.dart
@@ -71,6 +71,10 @@
         '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 de39966..9ef7801 100644
--- a/pkg/dartdev/test/sdk_test.dart
+++ b/pkg/dartdev/test/sdk_test.dart
@@ -30,7 +30,7 @@
   });
 
   test('dart2js snapshot', () {
-    expectFileExists(Sdk().dart2jsSnapshot);
+    expectSnapshotExists(Sdk().dart2jsAotSnapshot, Sdk().dart2jsSnapshot);
   });
 }
 
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index e03cf3e..93cf022 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -43,7 +43,8 @@
 # ......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
@@ -153,10 +154,6 @@
 
 _full_sdk_snapshots = _platform_sdk_snapshots + [
                         [
-                          "dart2js",
-                          "../utils/compiler:dart2js",
-                        ],
-                        [
                           "dartdevc",
                           "../utils/ddc:dartdevc",
                         ],
@@ -165,6 +162,17 @@
                           "../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 7a3093b..f76196a 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -87,6 +87,22 @@
   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/")