Skip to content

Commit db24e48

Browse files
jensjohadart-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[vm] Pass --enable-ffi value to compiler for better error message
Done to mirror how `--enable-mirrors` is implemented. For this file: ``` $ cat tffi.dart import "dart:ffi"; void main() {} ``` Before: ``` $ out/ReleaseX64/dart --enable-ffi=false tffi.dart error: import of dart:ffi is not supported in the current Dart runtime ``` Now: ``` $ out/ReleaseX64/dart --enable-ffi=false tffi.dart tffi.dart:1:8: Error: Dart library 'dart:ffi' is not available on this platform. import "dart:ffi"; ^ ``` and for ``` $ cat tffi2.dart const x = bool.fromEnvironment("dart.library.ffi"); final y = bool.fromEnvironment("dart.library.ffi"); void main() { print("$x vs $y"); } ``` Before: ``` $ out/ReleaseX64/dart --enable-ffi=false tffi2.dart true vs false ``` Now: ``` $ out/ReleaseX64/dart --enable-ffi=false tffi2.dart false vs false ``` Tested: Updated tests/ffi/vmspecific_enable_ffi_test.dart Change-Id: I8194fcf8ad227baec66e05f2b3d235315e2a9f80 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/545840 Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Jens Johansen <jensj@google.com>
1 parent 65988f9 commit db24e48

6 files changed

Lines changed: 49 additions & 7 deletions

File tree

‎pkg/kernel/lib/target/targets.dart‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'changed_structure_notifier.dart';
1414
class TargetFlags {
1515
final bool trackCreationLocations;
1616
final bool supportMirrors;
17+
final bool supportFfi;
1718

1819
/// Whether the backend expects closure contexts to be present in the AST.
1920
///
@@ -34,6 +35,7 @@ class TargetFlags {
3435
const new({
3536
this.trackCreationLocations = false,
3637
this.supportMirrors = true,
38+
this.supportFfi = true,
3739
this.isClosureContextLoweringEnabled = false,
3840
this.constKeepLocalsIndicator,
3941
this.includeUnsupportedPlatformLibraryStubs = false,
@@ -45,6 +47,7 @@ class TargetFlags {
4547
return other is TargetFlags &&
4648
trackCreationLocations == other.trackCreationLocations &&
4749
supportMirrors == other.supportMirrors &&
50+
supportFfi == other.supportFfi &&
4851
includeUnsupportedPlatformLibraryStubs ==
4952
other.includeUnsupportedPlatformLibraryStubs &&
5053
constKeepLocalsIndicator == other.constKeepLocalsIndicator;
@@ -55,6 +58,7 @@ class TargetFlags {
5558
int hash = 485786;
5659
hash = 0x3fffffff & (hash * 31 + (hash ^ trackCreationLocations.hashCode));
5760
hash = 0x3fffffff & (hash * 31 + (hash ^ supportMirrors.hashCode));
61+
hash = 0x3fffffff & (hash * 31 + (hash ^ supportFfi.hashCode));
5862
hash =
5963
0x3fffffff &
6064
(hash * 31 + (hash ^ includeUnsupportedPlatformLibraryStubs.hashCode));

‎pkg/vm/bin/kernel_service.dart‎

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ CompilerOptions setupCompilerOptions(
9797
String invocationModes,
9898
String verbosityLevel,
9999
bool enableMirrors,
100+
bool enableFfi,
100101
) {
101102
final expFlags = <String>[];
102103
if (experimentalFlags != null) {
@@ -106,7 +107,9 @@ CompilerOptions setupCompilerOptions(
106107
}
107108

108109
Verbosity verbosity = Verbosity.parseArgument(verbosityLevel);
109-
Target target = new VmTarget(new TargetFlags(supportMirrors: enableMirrors));
110+
Target target = new VmTarget(
111+
new TargetFlags(supportMirrors: enableMirrors, supportFfi: enableFfi),
112+
);
110113
return new CompilerOptions()
111114
..fileSystem = fileSystem
112115
..target = target
@@ -172,6 +175,7 @@ abstract class Compiler {
172175
final String invocationModes;
173176
final String verbosityLevel;
174177
final bool enableMirrors;
178+
final bool enableFfi;
175179
final bool generateBytecode;
176180

177181
final List<String> errorsPlain = <String>[];
@@ -189,6 +193,7 @@ abstract class Compiler {
189193
this.invocationModes = '',
190194
this.verbosityLevel = Verbosity.defaultValue,
191195
required this.enableMirrors,
196+
required this.enableFfi,
192197
required this.generateBytecode,
193198
}) {
194199
Uri? packagesUri = null;
@@ -215,6 +220,7 @@ abstract class Compiler {
215220
invocationModes,
216221
verbosityLevel,
217222
enableMirrors,
223+
enableFfi,
218224
);
219225
}
220226

@@ -309,6 +315,7 @@ class CompilerWrapper extends Compiler {
309315
String invocationModes = '',
310316
String verbosityLevel = Verbosity.defaultValue,
311317
required bool enableMirrors,
318+
required bool enableFfi,
312319
required super.generateBytecode,
313320
}) : super(
314321
isolateGroupId,
@@ -320,6 +327,7 @@ class CompilerWrapper extends Compiler {
320327
invocationModes: invocationModes,
321328
verbosityLevel: verbosityLevel,
322329
enableMirrors: enableMirrors,
330+
enableFfi: enableFfi,
323331
);
324332

325333
factory CompilerWrapper.forExpressionCompilationOnly(
@@ -332,6 +340,7 @@ class CompilerWrapper extends Compiler {
332340
String? packageConfig,
333341
String invocationModes = '',
334342
required bool enableMirrors,
343+
required bool enableFfi,
335344
required bool generateBytecode,
336345
}) {
337346
CompilerWrapper result = CompilerWrapper(
@@ -343,6 +352,7 @@ class CompilerWrapper extends Compiler {
343352
packageConfig: packageConfig,
344353
invocationModes: invocationModes,
345354
enableMirrors: enableMirrors,
355+
enableFfi: enableFfi,
346356
generateBytecode: generateBytecode,
347357
);
348358
result.generator = new IncrementalCompiler.forExpressionCompilationOnly(
@@ -381,6 +391,7 @@ class CompilerWrapper extends Compiler {
381391
packageConfig: packageConfig,
382392
invocationModes: invocationModes,
383393
enableMirrors: enableMirrors,
394+
enableFfi: enableFfi,
384395
generateBytecode: generateBytecode,
385396
);
386397
final generator = this.generator!;
@@ -431,6 +442,7 @@ Future<CompilerWrapper> lookupOrBuildNewIncrementalCompiler(
431442
String invocationModes = '',
432443
String verbosityLevel = Verbosity.defaultValue,
433444
required bool enableMirrors,
445+
required bool enableFfi,
434446
required bool generateBytecode,
435447
}) async {
436448
CompilerWrapper? compiler = lookupIncrementalCompiler(isolateGroupId);
@@ -470,6 +482,7 @@ Future<CompilerWrapper> lookupOrBuildNewIncrementalCompiler(
470482
invocationModes: invocationModes,
471483
verbosityLevel: verbosityLevel,
472484
enableMirrors: enableMirrors,
485+
enableFfi: enableFfi,
473486
generateBytecode: generateBytecode,
474487
);
475488
}
@@ -530,7 +543,8 @@ Future _processExpressionCompilationRequest(request) async {
530543
? request[19].cast<String>()
531544
: null;
532545
final bool enableMirrors = request[20];
533-
final bool generateBytecode = request[21];
546+
final bool enableFfi = request[21];
547+
final bool generateBytecode = request[22];
534548

535549
CompilerWrapper? compiler = isolateCompilers[isolateGroupId];
536550

@@ -629,6 +643,7 @@ Future _processExpressionCompilationRequest(request) async {
629643
experimentalFlags: experimentalFlags,
630644
packageConfig: packageConfigFile,
631645
enableMirrors: enableMirrors,
646+
enableFfi: enableFfi,
632647
generateBytecode: generateBytecode,
633648
);
634649
isolateCompilers[isolateGroupId] = compiler;
@@ -841,7 +856,8 @@ Future _processLoadRequest(request) async {
841856
final String? multirootScheme = request[13];
842857
final String verbosityLevel = request[14];
843858
final bool enableMirrors = request[15];
844-
final bool generateBytecode = request[16];
859+
final bool enableFfi = request[16];
860+
final bool generateBytecode = request[17];
845861
Uri platformKernelPath;
846862
List<int>? platformKernel = null;
847863
if (request[3] is String) {
@@ -922,6 +938,7 @@ Future _processLoadRequest(request) async {
922938
invocationModes: invocationModes,
923939
verbosityLevel: verbosityLevel,
924940
enableMirrors: enableMirrors,
941+
enableFfi: enableFfi,
925942
generateBytecode: generateBytecode,
926943
);
927944
FileSystem fileSystem = compiler.fileSystem;
@@ -1202,6 +1219,7 @@ Future trainInternal(String scriptUri, String? platformKernelPath) async {
12021219
null /* multirootScheme */,
12031220
'all' /* CFE logging mode */,
12041221
true /* enableMirrors */,
1222+
true /* enableFfi */,
12051223
false /* generateBytecode */,
12061224
];
12071225
await _processLoadRequest(request);

‎pkg/vm/lib/modular/target/vm.dart‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class VmTarget extends Target {
5050
Class? _closure;
5151
Class? _syncStarIterable;
5252

53+
DartLibrarySupport? _dartLibrarySupport;
54+
5355
VmTarget(this.flags);
5456

5557
@override
@@ -612,9 +614,15 @@ class VmTarget extends Target {
612614
}
613615

614616
@override
615-
DartLibrarySupport get dartLibrarySupport => flags.supportMirrors
617+
DartLibrarySupport get dartLibrarySupport =>
618+
_dartLibrarySupport ??= flags.supportMirrors && flags.supportFfi
616619
? const DefaultDartLibrarySupport()
617-
: const CustomizedDartLibrarySupport(unsupported: {'mirrors'});
620+
: CustomizedDartLibrarySupport(
621+
unsupported: {
622+
if (!flags.supportMirrors) 'mirrors',
623+
if (!flags.supportFfi) 'ffi',
624+
},
625+
);
618626

619627
@override
620628
bool isSupportedPragma(String pragmaName) =>

‎pkg/vm/test/kernel_service_test.dart‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ Future<kernel_service.Status> singleShotCompile(
150150
/* [13] = String? = multirootScheme = */ null,
151151
/* [14] = String = verbosityLevel = */ Verbosity.all.name,
152152
/* [15] = bool = enableMirrors = */ false,
153+
/* [15] = bool = enableFfi = */ false,
153154
/* [16] = bool = generateBytecode = */ false,
154155
]);
155156

‎runtime/vm/kernel_isolate.cc‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,11 @@ class KernelCompilationRequest : public ValueObject {
682682

683683
Dart_CObject enable_mirrors;
684684
enable_mirrors.type = Dart_CObject_kBool;
685-
enable_mirrors.value.as_bool = FLAG_enable_mirrors;
685+
enable_mirrors.value.as_bool = FLAG_enable_mirrors && !FLAG_interpreter;
686+
687+
Dart_CObject enable_ffi;
688+
enable_ffi.type = Dart_CObject_kBool;
689+
enable_ffi.value.as_bool = Api::IsFfiEnabled();
686690

687691
Dart_CObject generate_bytecode;
688692
generate_bytecode.type = Dart_CObject_kBool;
@@ -711,6 +715,7 @@ class KernelCompilationRequest : public ValueObject {
711715
&enable_asserts,
712716
&experimental_flags_object,
713717
&enable_mirrors,
718+
&enable_ffi,
714719
&generate_bytecode};
715720
message.value.as_array.values = message_arr;
716721
message.value.as_array.length = ARRAY_SIZE(message_arr);
@@ -918,6 +923,10 @@ class KernelCompilationRequest : public ValueObject {
918923
enable_mirrors.type = Dart_CObject_kBool;
919924
enable_mirrors.value.as_bool = FLAG_enable_mirrors && !FLAG_interpreter;
920925

926+
Dart_CObject enable_ffi;
927+
enable_ffi.type = Dart_CObject_kBool;
928+
enable_ffi.value.as_bool = Api::IsFfiEnabled();
929+
921930
Dart_CObject generate_bytecode;
922931
generate_bytecode.type = Dart_CObject_kBool;
923932
generate_bytecode.value.as_bool = FLAG_interpreter;
@@ -938,6 +947,7 @@ class KernelCompilationRequest : public ValueObject {
938947
&multiroot_scheme_object,
939948
&verbosity_str,
940949
&enable_mirrors,
950+
&enable_ffi,
941951
&generate_bytecode};
942952
message.value.as_array.values = message_arr;
943953
message.value.as_array.length = ARRAY_SIZE(message_arr);

‎tests/ffi/vmspecific_enable_ffi_test.dart‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ void main() {
3232

3333
Expect.equals(254, result.exitCode);
3434
Expect.contains(
35-
'import of dart:ffi is not supported in the current Dart runtime',
35+
"vmspecific_enable_ffi_test_helper.dart:8:8: "
36+
"Error: Dart library 'dart:ffi' is not available on this platform.",
3637
result.stderr,
3738
);
3839
}

0 commit comments

Comments
 (0)