@@ -350,11 +350,33 @@ struct OwnershipTracker {
350350 using FieldType = std::unordered_set<Name> UsedNames::*;
351351 using MapType = std::unordered_map<Name, ItemInfo> OwnershipTracker::*;
352352
353+ template <typename T> void insert (Name name, UsedNames* owner) {
354+ if constexpr (std::is_same_v<T, Table>) {
355+ insertImpl (name, owner, &OwnershipTracker::tables, &UsedNames::tables);
356+ } else if constexpr (std::is_same_v<T, Memory>) {
357+ insertImpl (
358+ name, owner, &OwnershipTracker::memories, &UsedNames::memories);
359+ } else if constexpr (std::is_same_v<T, Global>) {
360+ insertImpl (name, owner, &OwnershipTracker::globals, &UsedNames::globals);
361+ } else if constexpr (std::is_same_v<T, Tag>) {
362+ insertImpl (name, owner, &OwnershipTracker::tags, &UsedNames::tags);
363+ } else if constexpr (std::is_same_v<T, DataSegment>) {
364+ insertImpl (
365+ name, owner, &OwnershipTracker::dataSegments, &UsedNames::dataSegments);
366+ } else if constexpr (std::is_same_v<T, ElementSegment>) {
367+ insertImpl (name,
368+ owner,
369+ &OwnershipTracker::elementSegments,
370+ &UsedNames::elementSegments);
371+ }
372+ }
373+
353374 // 'mapField' points to one of OwnershipTracker's maps, such as
354375 // std::unordered_map<Name, ItemInfo> globals;
355376 // 'field' points to one of UsedName's sets, such as
356377 // std::unordered_set<Name> globals;
357- void insert (Name name, UsedNames* owner, MapType mapField, FieldType field) {
378+ void
379+ insertImpl (Name name, UsedNames* owner, MapType mapField, FieldType field) {
358380 (owner->*field).insert (name);
359381 // Figure out which module is the 'owner' of this item. If it is used by a
360382 // single secondary module, that secondary module is the owner. If it is
@@ -781,9 +803,6 @@ void ModuleSplitter::computeUsedNames() {
781803 UsedNames& primaryUsed = tracker.primaryUsed ;
782804 std::vector<UsedNames>& secondaryUsed = tracker.secondaryUsed ;
783805
784- #define ADD_ITEM_TO_TRACKER (field, val, owner ) \
785- tracker.insert (val, owner, &OwnershipTracker::field, &UsedNames::field)
786-
787806 struct NameCollector
788807 : public PostWalker<NameCollector,
789808 UnifiedExpressionVisitor<NameCollector>> {
@@ -811,22 +830,22 @@ void ModuleSplitter::computeUsedNames() {
811830 if (cast->field .is ()) { \
812831 switch (kind) { \
813832 case ModuleItemKind::Table: \
814- ADD_ITEM_TO_TRACKER (tables, cast->field , &used); \
833+ tracker. insert <Table>( cast->field , &used); \
815834 break ; \
816835 case ModuleItemKind::Memory: \
817- ADD_ITEM_TO_TRACKER (memories, cast->field , &used); \
836+ tracker. insert <Memory>( cast->field , &used); \
818837 break ; \
819838 case ModuleItemKind::Global: \
820- ADD_ITEM_TO_TRACKER (globals, cast->field , &used); \
839+ tracker. insert <Global>( cast->field , &used); \
821840 break ; \
822841 case ModuleItemKind::Tag: \
823- ADD_ITEM_TO_TRACKER (tags, cast->field , &used); \
842+ tracker. insert <Tag>( cast->field , &used); \
824843 break ; \
825844 case ModuleItemKind::DataSegment: \
826- ADD_ITEM_TO_TRACKER (dataSegments, cast->field , &used); \
845+ tracker. insert <DataSegment>( cast->field , &used); \
827846 break ; \
828847 case ModuleItemKind::ElementSegment: \
829- ADD_ITEM_TO_TRACKER (elementSegments, cast->field , &used); \
848+ tracker. insert <ElementSegment>( cast->field , &used); \
830849 break ; \
831850 case ModuleItemKind::Function: \
832851 case ModuleItemKind::Invalid: \
@@ -858,16 +877,16 @@ void ModuleSplitter::computeUsedNames() {
858877 for (auto & ex : primary.exports ) {
859878 switch (ex->kind ) {
860879 case ExternalKind::Global:
861- ADD_ITEM_TO_TRACKER (globals, *ex->getInternalName (), &primaryUsed);
880+ tracker. insert <Global>( *ex->getInternalName (), &primaryUsed);
862881 break ;
863882 case ExternalKind::Memory:
864- ADD_ITEM_TO_TRACKER (memories, *ex->getInternalName (), &primaryUsed);
883+ tracker. insert <Memory>( *ex->getInternalName (), &primaryUsed);
865884 break ;
866885 case ExternalKind::Table:
867- ADD_ITEM_TO_TRACKER (tables, *ex->getInternalName (), &primaryUsed);
886+ tracker. insert <Table>( *ex->getInternalName (), &primaryUsed);
868887 break ;
869888 case ExternalKind::Tag:
870- ADD_ITEM_TO_TRACKER (tags, *ex->getInternalName (), &primaryUsed);
889+ tracker. insert <Tag>( *ex->getInternalName (), &primaryUsed);
871890 break ;
872891 default :
873892 break ;
@@ -877,10 +896,10 @@ void ModuleSplitter::computeUsedNames() {
877896 // We need to assume the dispatch table and its base global are used in the
878897 // primary module, because we will create segments there later.
879898 if (tableManager.dispatchTable ) {
880- ADD_ITEM_TO_TRACKER (tables, tableManager.dispatchTable ->name , &primaryUsed);
899+ tracker. insert <Table>( tableManager.dispatchTable ->name , &primaryUsed);
881900 }
882901 if (tableManager.dispatchBase .global ) {
883- ADD_ITEM_TO_TRACKER (globals, tableManager.dispatchBase .global , &primaryUsed);
902+ tracker. insert <Global>( tableManager.dispatchBase .global , &primaryUsed);
884903 }
885904
886905 // If custom-descirptors is enabled, global and table initializers can trap.
@@ -891,14 +910,14 @@ void ModuleSplitter::computeUsedNames() {
891910 if (global->init &&
892911 EffectAnalyzer (config.passOptions , primary, global->init )
893912 .hasUnremovableSideEffects ()) {
894- ADD_ITEM_TO_TRACKER (globals, global->name , &primaryUsed);
913+ tracker. insert <Global>( global->name , &primaryUsed);
895914 }
896915 }
897916 for (auto & table : primary.tables ) {
898917 if (table->init &&
899918 EffectAnalyzer (config.passOptions , primary, table->init )
900919 .hasUnremovableSideEffects ()) {
901- ADD_ITEM_TO_TRACKER (tables, table->name , &primaryUsed);
920+ tracker. insert <Table>( table->name , &primaryUsed);
902921 }
903922 }
904923 }
@@ -980,8 +999,8 @@ void ModuleSplitter::computeUsedNames() {
980999 if (!owner) {
9811000 return ;
9821001 }
983- ADD_ITEM_TO_TRACKER (dataSegments, segment->name , owner);
984- ADD_ITEM_TO_TRACKER (memories, segment->memory , owner);
1002+ tracker. insert <DataSegment>( segment->name , owner);
1003+ tracker. insert <Memory>( segment->memory , owner);
9851004 if (segment->offset ) {
9861005 NameCollector (*owner, tracker).walk (segment->offset );
9871006 }
@@ -1035,8 +1054,8 @@ void ModuleSplitter::computeUsedNames() {
10351054 if (!owner) {
10361055 return ;
10371056 }
1038- ADD_ITEM_TO_TRACKER (elementSegments, segment->name , owner);
1039- ADD_ITEM_TO_TRACKER (tables, segment->table , owner);
1057+ tracker. insert <ElementSegment>( segment->name , owner);
1058+ tracker. insert <Table>( segment->table , owner);
10401059 if (segment->offset ) {
10411060 NameCollector (*owner, tracker).walk (segment->offset );
10421061 }
@@ -1072,11 +1091,10 @@ void ModuleSplitter::computeUsedNames() {
10721091 }
10731092 if (UsedNames* owner = tracker.getOwner (global->name , tracker.globals )) {
10741093 for (auto * get : FindAll<GlobalGet>(global->init ).list ) {
1075- ADD_ITEM_TO_TRACKER (globals, get->name , owner);
1094+ tracker. insert <Global>( get->name , owner);
10761095 }
10771096 }
10781097 }
1079- #undef ADD_ITEM_TO_TRACKER
10801098}
10811099
10821100void ModuleSplitter::shareImportableItems () {
0 commit comments