Skip to content

Commit df0671d

Browse files
liamappelbecommit-bot@chromium.org
authored andcommitted
[VM] Experimental flags in the dart CLI
Blocked on https://dart-review.googlesource.com/c/sdk/+/88840 Bug: #35602 Change-Id: I72b1cf574c9cb3d1dac2fbd8dfeb0f3fd80e330e Reviewed-on: https://dart-review.googlesource.com/c/89042 Reviewed-by: Siva Annamalai <[email protected]> Commit-Queue: Liam Appelbe <[email protected]>
1 parent 3e5e05d commit df0671d

File tree

4 files changed

+191
-20
lines changed

4 files changed

+191
-20
lines changed

pkg/vm/bin/kernel_service.dart

+29-4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ import 'package:vm/incremental_compiler.dart';
3737
import 'package:vm/kernel_front_end.dart' show runWithFrontEndCompilerContext;
3838
import 'package:vm/http_filesystem.dart';
3939
import 'package:vm/target/vm.dart' show VmTarget;
40+
import 'package:front_end/src/api_prototype/compiler_options.dart'
41+
show CompilerOptions, parseExperimentalFlags;
4042

4143
final bool verbose = new bool.fromEnvironment('DFE_VERBOSE');
4244
const String platformKernelFile = 'virtual_platform_kernel.dill';
@@ -67,6 +69,7 @@ abstract class Compiler {
6769
final FileSystem fileSystem;
6870
final Uri platformKernelPath;
6971
bool suppressWarnings;
72+
List<String> experimentalFlags;
7073
bool bytecode;
7174
String packageConfig;
7275

@@ -76,6 +79,7 @@ abstract class Compiler {
7679

7780
Compiler(this.fileSystem, this.platformKernelPath,
7881
{this.suppressWarnings: false,
82+
this.experimentalFlags: null,
7983
this.bytecode: false,
8084
this.packageConfig: null}) {
8185
Uri packagesUri = null;
@@ -92,13 +96,22 @@ abstract class Compiler {
9296
print("DFE: platformKernelPath: ${platformKernelPath}");
9397
}
9498

99+
var expFlags = List<String>();
100+
if (experimentalFlags != null) {
101+
for (String flag in experimentalFlags) {
102+
expFlags.addAll(flag.split(","));
103+
}
104+
}
105+
95106
options = new CompilerOptions()
96107
..fileSystem = fileSystem
97108
..target = new VmTarget(new TargetFlags())
98109
..packagesFileUri = packagesUri
99110
..sdkSummary = platformKernelPath
100111
..verbose = verbose
101112
..bytecode = bytecode
113+
..experimentalFlags =
114+
parseExperimentalFlags(expFlags, (msg) => errors.add(msg))
102115
..onDiagnostic = (DiagnosticMessage message) {
103116
bool printMessage;
104117
switch (message.severity) {
@@ -163,10 +176,12 @@ class IncrementalCompilerWrapper extends Compiler {
163176

164177
IncrementalCompilerWrapper(FileSystem fileSystem, Uri platformKernelPath,
165178
{bool suppressWarnings: false,
179+
List<String> experimentalFlags: null,
166180
bool bytecode: false,
167181
String packageConfig: null})
168182
: super(fileSystem, platformKernelPath,
169183
suppressWarnings: suppressWarnings,
184+
experimentalFlags: experimentalFlags,
170185
bytecode: bytecode,
171186
packageConfig: packageConfig);
172187

@@ -186,6 +201,7 @@ class IncrementalCompilerWrapper extends Compiler {
186201
IncrementalCompilerWrapper clone = IncrementalCompilerWrapper(
187202
fileSystem, platformKernelPath,
188203
suppressWarnings: suppressWarnings,
204+
experimentalFlags: experimentalFlags,
189205
bytecode: bytecode,
190206
packageConfig: packageConfig);
191207

@@ -213,10 +229,12 @@ class SingleShotCompilerWrapper extends Compiler {
213229
SingleShotCompilerWrapper(FileSystem fileSystem, Uri platformKernelPath,
214230
{this.requireMain: false,
215231
bool suppressWarnings: false,
232+
List<String> experimentalFlags: null,
216233
bool bytecode: false,
217234
String packageConfig: null})
218235
: super(fileSystem, platformKernelPath,
219236
suppressWarnings: suppressWarnings,
237+
experimentalFlags: experimentalFlags,
220238
bytecode: bytecode,
221239
packageConfig: packageConfig);
222240

@@ -240,6 +258,7 @@ IncrementalCompilerWrapper lookupIncrementalCompiler(int isolateId) {
240258
Future<Compiler> lookupOrBuildNewIncrementalCompiler(int isolateId,
241259
List sourceFiles, Uri platformKernelPath, List<int> platformKernel,
242260
{bool suppressWarnings: false,
261+
List<String> experimentalFlags: null,
243262
bool bytecode: false,
244263
String packageConfig: null,
245264
String multirootFilepaths,
@@ -268,6 +287,7 @@ Future<Compiler> lookupOrBuildNewIncrementalCompiler(int isolateId,
268287
// isolate was shut down. Message should be handled here in this script.
269288
compiler = new IncrementalCompilerWrapper(fileSystem, platformKernelPath,
270289
suppressWarnings: suppressWarnings,
290+
experimentalFlags: experimentalFlags,
271291
bytecode: bytecode,
272292
packageConfig: packageConfig);
273293
}
@@ -445,10 +465,12 @@ Future _processLoadRequest(request) async {
445465
final int isolateId = request[6];
446466
final List sourceFiles = request[7];
447467
final bool suppressWarnings = request[8];
448-
final bool bytecode = request[9];
449-
final String packageConfig = request[10];
450-
final String multirootFilepaths = request[11];
451-
final String multirootScheme = request[12];
468+
final List<String> experimentalFlags =
469+
request[9] != null ? request[9].cast<String>() : null;
470+
final bool bytecode = request[10];
471+
final String packageConfig = request[11];
472+
final String multirootFilepaths = request[12];
473+
final String multirootScheme = request[13];
452474

453475
if (bytecode) {
454476
// Bytecode generator is hooked into kernel service after kernel component
@@ -507,6 +529,7 @@ Future _processLoadRequest(request) async {
507529
compiler = await lookupOrBuildNewIncrementalCompiler(
508530
isolateId, sourceFiles, platformKernelPath, platformKernel,
509531
suppressWarnings: suppressWarnings,
532+
experimentalFlags: experimentalFlags,
510533
bytecode: bytecode,
511534
packageConfig: packageConfig,
512535
multirootFilepaths: multirootFilepaths,
@@ -517,6 +540,7 @@ Future _processLoadRequest(request) async {
517540
compiler = new SingleShotCompilerWrapper(fileSystem, platformKernelPath,
518541
requireMain: false,
519542
suppressWarnings: suppressWarnings,
543+
experimentalFlags: experimentalFlags,
520544
bytecode: bytecode,
521545
packageConfig: packageConfig);
522546
}
@@ -641,6 +665,7 @@ train(String scriptUri, String platformKernelPath) {
641665
1 /* isolateId chosen randomly */,
642666
[] /* source files */,
643667
false /* suppress warnings */,
668+
null /* experimental_flags */,
644669
false /* generate bytecode */,
645670
null /* package_config */,
646671
null /* multirootFilepaths */,

runtime/vm/kernel_isolate.cc

+69-16
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "vm/compiler/jit/compiler.h"
1010
#include "vm/dart_api_impl.h"
1111
#include "vm/dart_entry.h"
12+
#include "vm/flags.h"
1213
#include "vm/isolate.h"
1314
#include "vm/lockers.h"
1415
#include "vm/message.h"
@@ -343,6 +344,17 @@ static void PassThroughFinalizer(void* isolate_callback_data,
343344
Dart_WeakPersistentHandle handle,
344345
void* peer) {}
345346

347+
MallocGrowableArray<char*>* KernelIsolate::experimental_flags_ =
348+
new MallocGrowableArray<char*>();
349+
350+
void KernelIsolate::AddExperimentalFlag(const char* value) {
351+
experimental_flags_->Add(strdup(value));
352+
}
353+
354+
DEFINE_OPTION_HANDLER(KernelIsolate::AddExperimentalFlag,
355+
enable_experiment,
356+
"Comma separated list of experimental features.");
357+
346358
class KernelCompilationRequest : public ValueObject {
347359
public:
348360
KernelCompilationRequest()
@@ -373,7 +385,8 @@ class KernelCompilationRequest : public ValueObject {
373385
const Array& type_definitions,
374386
char const* library_uri,
375387
char const* klass,
376-
bool is_static) {
388+
bool is_static,
389+
const MallocGrowableArray<char*>* experimental_flags) {
377390
Thread* thread = Thread::Current();
378391
TransitionNativeToVM transition(thread);
379392
Dart_CObject tag;
@@ -443,12 +456,25 @@ class KernelCompilationRequest : public ValueObject {
443456
isolate_id.value.as_int64 =
444457
isolate != NULL ? static_cast<int64_t>(isolate->main_port()) : 0;
445458

446-
Dart_CObject message;
447-
message.type = Dart_CObject_kArray;
448459
Dart_CObject suppress_warnings;
449460
suppress_warnings.type = Dart_CObject_kBool;
450461
suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
451462

463+
intptr_t num_experimental_flags = experimental_flags->length();
464+
Dart_CObject** experimental_flags_array =
465+
new Dart_CObject*[num_experimental_flags];
466+
for (intptr_t i = 0; i < num_experimental_flags; ++i) {
467+
experimental_flags_array[i] = new Dart_CObject;
468+
experimental_flags_array[i]->type = Dart_CObject_kString;
469+
experimental_flags_array[i]->value.as_string = (*experimental_flags)[i];
470+
}
471+
Dart_CObject experimental_flags_object;
472+
experimental_flags_object.type = Dart_CObject_kArray;
473+
experimental_flags_object.value.as_array.values = experimental_flags_array;
474+
experimental_flags_object.value.as_array.length = num_experimental_flags;
475+
476+
Dart_CObject message;
477+
message.type = Dart_CObject_kArray;
452478
Dart_CObject* message_arr[] = {&tag,
453479
&send_port,
454480
&isolate_id,
@@ -458,7 +484,8 @@ class KernelCompilationRequest : public ValueObject {
458484
&library_uri_object,
459485
&class_object,
460486
&is_static_object,
461-
&suppress_warnings};
487+
&suppress_warnings,
488+
&experimental_flags_object};
462489
message.value.as_array.values = message_arr;
463490
message.value.as_array.length = ARRAY_SIZE(message_arr);
464491

@@ -486,6 +513,11 @@ class KernelCompilationRequest : public ValueObject {
486513
}
487514
delete[] type_definitions_array;
488515

516+
for (intptr_t i = 0; i < num_experimental_flags; ++i) {
517+
delete experimental_flags_array[i];
518+
}
519+
delete[] experimental_flags_array;
520+
489521
return result_;
490522
}
491523

@@ -500,7 +532,8 @@ class KernelCompilationRequest : public ValueObject {
500532
bool incremental_compile,
501533
const char* package_config,
502534
const char* multiroot_filepaths,
503-
const char* multiroot_scheme) {
535+
const char* multiroot_scheme,
536+
const MallocGrowableArray<char*>* experimental_flags) {
504537
// Build the [null, send_port, script_uri, platform_kernel,
505538
// incremental_compile, isolate_id, [files]] message for the Kernel isolate.
506539
// tag is used to specify which operation the frontend should perform.
@@ -570,6 +603,19 @@ class KernelCompilationRequest : public ValueObject {
570603
suppress_warnings.type = Dart_CObject_kBool;
571604
suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
572605

606+
intptr_t num_experimental_flags = experimental_flags->length();
607+
Dart_CObject** experimental_flags_array =
608+
new Dart_CObject*[num_experimental_flags];
609+
for (intptr_t i = 0; i < num_experimental_flags; ++i) {
610+
experimental_flags_array[i] = new Dart_CObject;
611+
experimental_flags_array[i]->type = Dart_CObject_kString;
612+
experimental_flags_array[i]->value.as_string = (*experimental_flags)[i];
613+
}
614+
Dart_CObject experimental_flags_object;
615+
experimental_flags_object.type = Dart_CObject_kArray;
616+
experimental_flags_object.value.as_array.values = experimental_flags_array;
617+
experimental_flags_object.value.as_array.length = num_experimental_flags;
618+
573619
Dart_CObject bytecode;
574620
bytecode.type = Dart_CObject_kBool;
575621
// Interpreter is supported only on x64 and arm64.
@@ -625,6 +671,7 @@ class KernelCompilationRequest : public ValueObject {
625671
&isolate_id,
626672
&files,
627673
&suppress_warnings,
674+
&experimental_flags_object,
628675
&bytecode,
629676
&package_config_uri,
630677
&multiroot_filepaths_object,
@@ -643,6 +690,11 @@ class KernelCompilationRequest : public ValueObject {
643690
ml.Wait();
644691
}
645692

693+
for (intptr_t i = 0; i < num_experimental_flags; ++i) {
694+
delete experimental_flags_array[i];
695+
}
696+
delete[] experimental_flags_array;
697+
646698
return result_;
647699
}
648700

@@ -774,11 +826,11 @@ Dart_KernelCompilationResult KernelIsolate::CompileToKernel(
774826
}
775827

776828
KernelCompilationRequest request;
777-
return request.SendAndWaitForResponse(kCompileTag, kernel_port, script_uri,
778-
platform_kernel, platform_kernel_size,
779-
source_file_count, source_files,
780-
incremental_compile, package_config,
781-
multiroot_filepaths, multiroot_scheme);
829+
return request.SendAndWaitForResponse(
830+
kCompileTag, kernel_port, script_uri, platform_kernel,
831+
platform_kernel_size, source_file_count, source_files,
832+
incremental_compile, package_config, multiroot_filepaths,
833+
multiroot_scheme, experimental_flags_);
782834
}
783835

784836
Dart_KernelCompilationResult KernelIsolate::ListDependencies() {
@@ -793,7 +845,7 @@ Dart_KernelCompilationResult KernelIsolate::ListDependencies() {
793845
KernelCompilationRequest request;
794846
return request.SendAndWaitForResponse(kListDependenciesTag, kernel_port, NULL,
795847
NULL, 0, 0, NULL, false, NULL, NULL,
796-
NULL);
848+
NULL, experimental_flags_);
797849
}
798850

799851
Dart_KernelCompilationResult KernelIsolate::AcceptCompilation() {
@@ -809,7 +861,8 @@ Dart_KernelCompilationResult KernelIsolate::AcceptCompilation() {
809861

810862
KernelCompilationRequest request;
811863
return request.SendAndWaitForResponse(kAcceptTag, kernel_port, NULL, NULL, 0,
812-
0, NULL, true, NULL, NULL, NULL);
864+
0, NULL, true, NULL, NULL, NULL,
865+
experimental_flags_);
813866
}
814867

815868
Dart_KernelCompilationResult KernelIsolate::CompileExpressionToKernel(
@@ -831,7 +884,7 @@ Dart_KernelCompilationResult KernelIsolate::CompileExpressionToKernel(
831884
KernelCompilationRequest request;
832885
return request.SendAndWaitForResponse(kernel_port, expression, definitions,
833886
type_definitions, library_url, klass,
834-
is_static);
887+
is_static, experimental_flags_);
835888
}
836889

837890
Dart_KernelCompilationResult KernelIsolate::UpdateInMemorySources(
@@ -848,9 +901,9 @@ Dart_KernelCompilationResult KernelIsolate::UpdateInMemorySources(
848901
}
849902

850903
KernelCompilationRequest request;
851-
return request.SendAndWaitForResponse(kUpdateSourcesTag, kernel_port, NULL,
852-
NULL, 0, source_files_count,
853-
source_files, true, NULL, NULL, NULL);
904+
return request.SendAndWaitForResponse(
905+
kUpdateSourcesTag, kernel_port, NULL, NULL, 0, source_files_count,
906+
source_files, true, NULL, NULL, NULL, experimental_flags_);
854907
}
855908

856909
void KernelIsolate::NotifyAboutIsolateShutdown(const Isolate* isolate) {

runtime/vm/kernel_isolate.h

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#ifndef RUNTIME_VM_KERNEL_ISOLATE_H_
66
#define RUNTIME_VM_KERNEL_ISOLATE_H_
77

8+
#include <vector>
9+
810
#include "include/dart_api.h"
911
#include "include/dart_native_api.h"
1012

@@ -65,6 +67,8 @@ class KernelIsolate : public AllStatic {
6567

6668
static void NotifyAboutIsolateShutdown(const Isolate* isolate);
6769

70+
static void AddExperimentalFlag(const char* value);
71+
6872
protected:
6973
static Monitor* monitor_;
7074
static Dart_IsolateCreateCallback create_callback_;
@@ -82,6 +86,8 @@ class KernelIsolate : public AllStatic {
8286
return create_callback_;
8387
}
8488

89+
static MallocGrowableArray<char*>* experimental_flags_;
90+
8591
friend class Dart;
8692
friend class Isolate;
8793
friend class RunKernelTask;

0 commit comments

Comments
 (0)