Skip to content

Commit 58f700c

Browse files
fishythefishCommit Queue
authored andcommitted
[dart2wasm] Don't use IDs as keys for export name mapping.
We have means of serializing References and Constants directly, so it is unnecessary to generate IDs as indices. This does cause the export name mapping to get split up a little (just as callable reference IDs were stored separately from constant export IDs). This is because the kernel metadata repositories are serialized by the kernel's BinarySink, which correctly handles Constants, but cannot serialize References from the TFA'd component to the metadata of the un-TFA'd component. Meanwhile, the dart2wasm DataSerializer can serialize these References, but does not handle Constants. Therefore, the callable reference mapping is stored on the main module metadata (just as callable reference IDs were), while the constant mapping is stored in a metadata repository (just as constant IDs were). The exporter must then be aware of both of these to be used as a centralized interface. Change-Id: I1c0fc3eed5a96b3c3e755826749ebd29c3fa2b4b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/446990 Reviewed-by: Nate Biggs <[email protected]>
1 parent 6cbc6df commit 58f700c

File tree

6 files changed

+133
-192
lines changed

6 files changed

+133
-192
lines changed

pkg/dart2wasm/lib/constants.dart

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import 'package:wasm_builder/wasm_builder.dart' as w;
1313
import 'class_info.dart';
1414
import 'closures.dart';
1515
import 'code_generator.dart';
16-
import 'dynamic_module_kernel_metadata.dart'
17-
show DynamicModuleConstantRepository;
1816
import 'dynamic_modules.dart';
1917
import 'param_info.dart';
2018
import 'translator.dart';
@@ -72,10 +70,6 @@ typedef ConstantCodeGenerator = void Function(w.InstructionsBuilder);
7270
class Constants {
7371
final Translator translator;
7472
final Map<Constant, ConstantInfo> constantInfo = {};
75-
late final Map<Constant, int>? dynamicMainModuleConstantId = (translator
76-
.component.metadata[DynamicModuleConstantRepository.repositoryTag]
77-
as DynamicModuleConstantRepository?)
78-
?.mapping[translator.component] ??= {};
7973
w.DataSegmentBuilder? int32Segment;
8074
late final ClassInfo typeInfo = translator.classInfo[translator.typeClass]!;
8175

@@ -498,10 +492,6 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?>
498492
return info;
499493
}
500494

501-
static String _dynamicModuleConstantExportName(int id) => '#constant$id';
502-
static String _dynamicModuleInitFunctionExportName(int id) =>
503-
'#constantFunction$id';
504-
505495
static int _nextGlobalId = 0;
506496
String _constantName(Constant constant) {
507497
final id = _nextGlobalId++;
@@ -557,16 +547,19 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?>
557547
assert(!type.nullable);
558548

559549
// This function is only called once per [Constant]. If we compile a dynamic
560-
// submodule then the [dynamicModuleConstantIdMap] is pre-populated and
550+
// submodule then `translator.dynamicModuleConstants` is pre-populated and
561551
// we may find an export name. If we compile the main module, then the id
562552
// will be `null`.
563-
final dynamicModuleConstantIdMap = constants.dynamicMainModuleConstantId;
564-
final mainModuleExportId = dynamicModuleConstantIdMap?[constant];
565-
final isShareableAcrossModules = dynamicModuleConstantIdMap != null &&
566-
constant.accept(_ConstantDynamicModuleSharedChecker(translator));
553+
final isExportedFromMainModule = translator
554+
.dynamicModuleConstants?.constantNames
555+
.containsKey(constant) ??
556+
false;
557+
final isShareableAcrossModules =
558+
translator.dynamicModuleConstants != null &&
559+
constant.accept(_ConstantDynamicModuleSharedChecker(translator));
567560
final needsRuntimeCanonicalization = isShareableAcrossModules &&
568561
translator.isDynamicSubmodule &&
569-
mainModuleExportId == null;
562+
!isExportedFromMainModule;
570563

571564
if (lazy || needsRuntimeCanonicalization) {
572565
// Create uninitialized global and function to initialize it.
@@ -577,16 +570,15 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?>
577570
w.FunctionType ftype =
578571
translator.typesBuilder.defineFunction(const [], [type]);
579572

580-
if (mainModuleExportId != null) {
573+
if (isExportedFromMainModule) {
581574
global = targetModule.globals.import(
582575
translator.mainModule.moduleName,
583-
translator.dynamicModuleExports!
584-
.getConstantName(mainModuleExportId)!,
576+
translator.dynamicModuleConstants!.constantNames[constant]!,
585577
globalType);
586578
initFunction = targetModule.functions.import(
587579
translator.mainModule.moduleName,
588-
translator.dynamicModuleExports!
589-
.getConstantInitializerName(mainModuleExportId)!,
580+
translator
581+
.dynamicModuleConstants!.constantInitializerNames[constant]!,
590582
ftype);
591583
} else {
592584
final name = _constantName(constant);
@@ -599,19 +591,9 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?>
599591
targetModule.functions.define(ftype, '$name (lazy initializer)}');
600592

601593
if (isShareableAcrossModules) {
602-
final exportId = dynamicModuleConstantIdMap[constant] =
603-
dynamicModuleConstantIdMap.length;
604-
605-
translator.exporter.exportConstant(
606-
targetModule,
607-
_dynamicModuleConstantExportName(exportId),
608-
definedGlobal,
609-
exportId);
610-
translator.exporter.exportConstantInitializer(
611-
targetModule,
612-
_dynamicModuleInitFunctionExportName(exportId),
613-
function,
614-
exportId);
594+
translator.exporter.exportDynamicConstant(
595+
targetModule, constant, definedGlobal,
596+
initializer: function);
615597
}
616598
final b2 = function.body;
617599
generator(b2);
@@ -632,11 +614,10 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?>
632614
assert(!constants.currentlyCreating);
633615
final globalType = w.GlobalType(type, mutable: false);
634616
w.Global global;
635-
if (mainModuleExportId != null) {
617+
if (isExportedFromMainModule) {
636618
global = targetModule.globals.import(
637619
translator.mainModule.moduleName,
638-
translator.dynamicModuleExports!
639-
.getConstantName(mainModuleExportId)!,
620+
translator.dynamicModuleConstants!.constantNames[constant]!,
640621
globalType);
641622
} else {
642623
constants.currentlyCreating = true;
@@ -647,14 +628,8 @@ class ConstantCreator extends ConstantVisitor<ConstantInfo?>
647628
constants.currentlyCreating = false;
648629

649630
if (isShareableAcrossModules) {
650-
final exportId = dynamicModuleConstantIdMap[constant] =
651-
dynamicModuleConstantIdMap.length;
652-
653-
translator.exporter.exportConstant(
654-
targetModule,
655-
_dynamicModuleConstantExportName(exportId),
656-
definedGlobal,
657-
exportId);
631+
translator.exporter
632+
.exportDynamicConstant(targetModule, constant, definedGlobal);
658633
}
659634
}
660635

pkg/dart2wasm/lib/dynamic_module_kernel_metadata.dart

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import 'class_info.dart';
2727
import 'compiler_options.dart';
2828
import 'dispatch_table.dart';
2929
import 'dynamic_modules.dart';
30-
import 'exports.dart';
3130
import 'js/method_collector.dart' show JSMethods;
3231
import 'serialization.dart';
3332
import 'translator.dart';
@@ -62,34 +61,57 @@ class DynamicModuleGlobalIdRepository extends MetadataRepository<int> {
6261

6362
/// Repository for kernel constants.
6463
class DynamicModuleConstantRepository
65-
extends MetadataRepository<Map<Constant, int>> {
64+
extends MetadataRepository<DynamicModuleConstants> {
6665
static const repositoryTag = 'wasm.dynamic-modules.constants';
6766

6867
@override
6968
final String tag = repositoryTag;
7069

7170
@override
72-
final Map<TreeNode, Map<Constant, int>> mapping = {};
71+
final Map<TreeNode, DynamicModuleConstants> mapping = {};
7372

7473
@override
75-
Map<Constant, int> readFromBinary(Node node, BinarySource source) {
76-
final length = source.readUInt30();
77-
final Map<Constant, int> constants = {};
78-
for (int i = 0; i < length; i++) {
79-
final constant = source.readConstantReference();
80-
final id = source.readUInt30();
81-
constants[constant] = id;
74+
DynamicModuleConstants readFromBinary(_, BinarySource source) =>
75+
DynamicModuleConstants._readFromBinary(source);
76+
77+
@override
78+
void writeToBinary(DynamicModuleConstants data, _, BinarySink sink) =>
79+
data._writeToBinary(sink);
80+
}
81+
82+
class DynamicModuleConstants {
83+
final Map<Constant, String> constantNames = {};
84+
final Map<Constant, String> constantInitializerNames = {};
85+
86+
DynamicModuleConstants();
87+
88+
factory DynamicModuleConstants._readFromBinary(BinarySource source) {
89+
void readMap(Map<Constant, String> map) {
90+
final length = source.readUInt30();
91+
for (int i = 0; i < length; i++) {
92+
final constant = source.readConstantReference();
93+
final name = source.readStringReference();
94+
map[constant] = name;
95+
}
8296
}
83-
return constants;
97+
98+
final exports = DynamicModuleConstants();
99+
readMap(exports.constantNames);
100+
readMap(exports.constantInitializerNames);
101+
return exports;
84102
}
85103

86-
@override
87-
void writeToBinary(Map<Constant, int> constants, Node node, BinarySink sink) {
88-
sink.writeUInt30(constants.length);
89-
constants.forEach((constant, id) {
90-
sink.writeConstantReference(constant);
91-
sink.writeUInt30(id);
92-
});
104+
void _writeToBinary(BinarySink sink) {
105+
void writeMap(Map<Constant, String> map) {
106+
sink.writeUInt30(map.length);
107+
map.forEach((key, name) {
108+
sink.writeConstantReference(key);
109+
sink.writeStringReference(name);
110+
});
111+
}
112+
113+
writeMap(constantNames);
114+
writeMap(constantInitializerNames);
93115
}
94116
}
95117

@@ -215,9 +237,8 @@ class MainModuleMetadata {
215237
/// Class to metadata about the class.
216238
final Map<Class, ClassMetadata> classMetadata;
217239

218-
/// Maps dynamic callable references to a unique ID that is used to generate
219-
/// the export name for the reference.
220-
final Map<Reference, int> callableReferenceIds;
240+
/// Maps dynamic callable references to export names.
241+
final Map<Reference, String> callableReferenceNames;
221242

222243
late final DispatchTable dispatchTable;
223244

@@ -239,7 +260,7 @@ class MainModuleMetadata {
239260

240261
MainModuleMetadata._(
241262
this.classMetadata,
242-
this.callableReferenceIds,
263+
this.callableReferenceNames,
243264
this.dispatchTable,
244265
this.invokedOverridableReferences,
245266
this.keyInvocationToIndex,
@@ -250,7 +271,7 @@ class MainModuleMetadata {
250271
MainModuleMetadata.empty(
251272
this.mainModuleTranslatorOptions, this.mainModuleEnvironment)
252273
: classMetadata = {},
253-
callableReferenceIds = {},
274+
callableReferenceNames = {},
254275
invokedOverridableReferences = {},
255276
keyInvocationToIndex = {},
256277
dfsOrderClassIds = [];
@@ -296,7 +317,8 @@ class MainModuleMetadata {
296317

297318
sink.writeMap(classMetadata, sink.writeClass, (m) => m.serialize(sink));
298319

299-
sink.writeMap(callableReferenceIds, sink.writeReference, sink.writeInt);
320+
sink.writeMap(
321+
callableReferenceNames, sink.writeReference, sink.writeString);
300322

301323
dispatchTable.serialize(sink);
302324

@@ -314,8 +336,8 @@ class MainModuleMetadata {
314336
final classMetadata = source.readMap(
315337
source.readClass, () => ClassMetadata.deserialize(source));
316338

317-
final callableReferenceIds =
318-
source.readMap(source.readReference, source.readInt);
339+
final callableReferenceNames =
340+
source.readMap(source.readReference, source.readString);
319341

320342
final dispatchTable = DispatchTable.deserialize(source);
321343

@@ -331,7 +353,7 @@ class MainModuleMetadata {
331353

332354
final metadata = MainModuleMetadata._(
333355
classMetadata,
334-
callableReferenceIds,
356+
callableReferenceNames,
335357
dispatchTable,
336358
invokedReferences,
337359
keyInvocationToIndex,
@@ -475,7 +497,6 @@ Future<(Component, JSMethods)> generateDynamicSubmoduleComponent(
475497
final newComponent = Component()
476498
..addMetadataRepository(DynamicModuleGlobalIdRepository())
477499
..addMetadataRepository(DynamicModuleConstantRepository())
478-
..addMetadataRepository(DynamicModuleExportRepository())
479500
..addMetadataRepository(ProcedureAttributesMetadataRepository())
480501
..addMetadataRepository(TableSelectorMetadataRepository())
481502
..addMetadataRepository(DirectCallMetadataRepository())

pkg/dart2wasm/lib/dynamic_modules.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import 'compiler_options.dart';
2222
import 'constants.dart' show maxArrayNewFixedLength;
2323
import 'dispatch_table.dart';
2424
import 'dynamic_module_kernel_metadata.dart';
25-
import 'exports.dart';
2625
import 'intrinsics.dart' show MemberIntrinsic;
2726
import 'kernel_nodes.dart';
2827
import 'modules.dart';
@@ -130,7 +129,6 @@ class DynamicMainModuleStrategy extends ModuleStrategy with KernelNodes {
130129

131130
component.addMetadataRepository(DynamicModuleConstantRepository());
132131
component.addMetadataRepository(DynamicModuleGlobalIdRepository());
133-
component.addMetadataRepository(DynamicModuleExportRepository());
134132
}
135133

136134
@override
@@ -520,8 +518,6 @@ class DynamicModuleInfo {
520518
final classId =
521519
(translator.classInfo[cls]!.classId as AbsoluteClassId).value;
522520

523-
metadata.callableReferenceIds[target] ??=
524-
metadata.callableReferenceIds.length;
525521
// The class must be allocated in order for the target to be live.
526522
translator.functions.recordClassTargetUse(classId, target);
527523
}
@@ -537,8 +533,6 @@ class DynamicModuleInfo {
537533

538534
// Generate static members immediately since they are unconditionally
539535
// callable.
540-
metadata.callableReferenceIds[target] ??=
541-
metadata.callableReferenceIds.length;
542536
translator.functions.getFunction(target);
543537
}
544538

0 commit comments

Comments
 (0)