[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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -71,6 +71,10 @@ class Sdk {
|
||||
'dart2js.dart.snapshot',
|
||||
);
|
||||
|
||||
String get dart2jsAotSnapshot => _snapshotPathFor(
|
||||
'dart2js_aot.dart.snapshot',
|
||||
);
|
||||
|
||||
String get dart2wasmSnapshot => _snapshotPathFor(
|
||||
'dart2wasm_product.snapshot',
|
||||
);
|
||||
|
||||
@@ -30,7 +30,7 @@ void _sdk() {
|
||||
});
|
||||
|
||||
test('dart2js snapshot', () {
|
||||
expectFileExists(Sdk().dart2jsSnapshot);
|
||||
expectSnapshotExists(Sdk().dart2jsAotSnapshot, Sdk().dart2jsSnapshot);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+13
-5
@@ -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 = [
|
||||
|
||||
@@ -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/")
|
||||
|
||||
Reference in New Issue
Block a user