Skip to content

Commit 8912e36

Browse files
committed
Use template instead of ADD_ITEM macro
1 parent f03574f commit 8912e36

1 file changed

Lines changed: 42 additions & 24 deletions

File tree

src/ir/module-splitting.cpp

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

10821100
void ModuleSplitter::shareImportableItems() {

0 commit comments

Comments
 (0)