[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>
This commit is contained in:
asiva
2024-10-08 17:49:34 +00:00
committed by Commit Queue
parent 75d15bbfa3
commit 9fec00aeed
6 changed files with 74 additions and 35 deletions
+19 -27
View File
@@ -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<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;
}
}
+21 -2
View File
@@ -119,8 +119,11 @@ Future<int> 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<int> runProcess(
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,
+4
View File
@@ -71,6 +71,10 @@ class Sdk {
'dart2js.dart.snapshot',
);
String get dart2jsAotSnapshot => _snapshotPathFor(
'dart2js_aot.dart.snapshot',
);
String get dart2wasmSnapshot => _snapshotPathFor(
'dart2wasm_product.snapshot',
);
+1 -1
View File
@@ -30,7 +30,7 @@ void _sdk() {
});
test('dart2js snapshot', () {
expectFileExists(Sdk().dart2jsSnapshot);
expectSnapshotExists(Sdk().dart2jsAotSnapshot, Sdk().dart2jsSnapshot);
});
}
+13 -5
View File
@@ -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 = [
+16
View File
@@ -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/")