diff options
Diffstat (limited to 'src/tools/wasm-metadce.cpp')
-rw-r--r-- | src/tools/wasm-metadce.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index c04286f59..96b368bc4 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -55,10 +55,12 @@ struct MetaDCEGraph { std::unordered_map<Name, Name> exportToDCENode; std::unordered_map<Name, Name> functionToDCENode; // function name => DCE name std::unordered_map<Name, Name> globalToDCENode; // global name => DCE name + std::unordered_map<Name, Name> eventToDCENode; // event name => DCE name std::unordered_map<Name, Name> DCENodeToExport; // reverse maps std::unordered_map<Name, Name> DCENodeToFunction; std::unordered_map<Name, Name> DCENodeToGlobal; + std::unordered_map<Name, Name> DCENodeToEvent; // imports are not mapped 1:1 to DCE nodes in the wasm, since env.X might // be imported twice, for example. So we don't map a DCE node to an Import, @@ -80,6 +82,11 @@ struct MetaDCEGraph { return getImportId(imp->module, imp->base); } + ImportId getEventImportId(Name name) { + auto* imp = wasm.getEvent(name); + return getImportId(imp->module, imp->base); + } + // import module.base => DCE name std::unordered_map<Name, Name> importIdToDCENode; @@ -106,8 +113,14 @@ struct MetaDCEGraph { globalToDCENode[global->name] = dceName; nodes[dceName] = DCENode(dceName); }); - // only process function and global imports - the table and memory are - // always there + ModuleUtils::iterDefinedEvents(wasm, [&](Event* event) { + auto dceName = getName("event", event->name.str); + DCENodeToEvent[dceName] = event->name; + eventToDCENode[event->name] = dceName; + nodes[dceName] = DCENode(dceName); + }); + // only process function, global, and event imports - the table and memory + // are always there ModuleUtils::iterImportedFunctions(wasm, [&](Function* import) { auto id = getImportId(import->module, import->base); if (importIdToDCENode.find(id) == importIdToDCENode.end()) { @@ -122,6 +135,13 @@ struct MetaDCEGraph { importIdToDCENode[id] = dceName; } }); + ModuleUtils::iterImportedEvents(wasm, [&](Event* import) { + auto id = getImportId(import->module, import->base); + if (importIdToDCENode.find(id) == importIdToDCENode.end()) { + auto dceName = getName("importId", import->name.str); + importIdToDCENode[id] = dceName; + } + }); for (auto& exp : wasm.exports) { if (exportToDCENode.find(exp->name) == exportToDCENode.end()) { auto dceName = getName("export", exp->name.str); @@ -145,6 +165,13 @@ struct MetaDCEGraph { node.reaches.push_back( importIdToDCENode[getGlobalImportId(exp->value)]); } + } else if (exp->kind == ExternalKind::Event) { + if (!wasm.getEvent(exp->value)->imported()) { + node.reaches.push_back(eventToDCENode[exp->value]); + } else { + node.reaches.push_back( + importIdToDCENode[getEventImportId(exp->value)]); + } } } // Add initializer dependencies @@ -355,6 +382,9 @@ public: if (DCENodeToGlobal.find(name) != DCENodeToGlobal.end()) { std::cout << " is global " << DCENodeToGlobal[name] << '\n'; } + if (DCENodeToEvent.find(name) != DCENodeToEvent.end()) { + std::cout << " is event " << DCENodeToEvent[name] << '\n'; + } for (auto target : node.reaches) { std::cout << " reaches: " << target.str << '\n'; } |