diff options
author | Jérôme Vouillon <jerome.vouillon@gmail.com> | 2023-06-29 22:20:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-29 13:20:53 -0700 |
commit | 5f6594c52d1a9a285f7bfcfd31c46f5062c24b19 (patch) | |
tree | d8bdb42ea6dc47c507a58bf25e69bd1107aca96f /src | |
parent | 7b2e06aa3a0b6cef9568c3eab010a7187b9b6803 (diff) | |
download | binaryen-5f6594c52d1a9a285f7bfcfd31c46f5062c24b19.tar.gz binaryen-5f6594c52d1a9a285f7bfcfd31c46f5062c24b19.tar.bz2 binaryen-5f6594c52d1a9a285f7bfcfd31c46f5062c24b19.zip |
[wasm-metadce] Note ref.func connections + fix rooting of segment offsets (#5791)
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/wasm-metadce.cpp | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index 029d4aae8..e5e7d8706 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -195,6 +195,17 @@ struct MetaDCEGraph { void visitGlobalGet(GlobalGet* curr) { handleGlobal(curr->name); } void visitGlobalSet(GlobalSet* curr) { handleGlobal(curr->name); } + void visitRefFunc(RefFunc* curr) { + Name dceName; + if (!getModule()->getFunction(curr->func)->imported()) { + dceName = parent->functionToDCENode[curr->func]; + } else { + dceName = + parent->importIdToDCENode[parent->getFunctionImportId(curr->func)]; + } + assert(!parentDceName.isNull()); + parent->nodes[parentDceName].reaches.push_back(dceName); + } private: MetaDCEGraph* parent; @@ -209,7 +220,9 @@ struct MetaDCEGraph { // it's an import. dceName = parent->importIdToDCENode[parent->getGlobalImportId(name)]; } - if (!parentDceName.isNull()) { + if (parentDceName.isNull()) { + parent->roots.insert(dceName); + } else { parent->nodes[parentDceName].reaches.push_back(dceName); } } @@ -248,18 +261,8 @@ struct MetaDCEGraph { return std::make_unique<Scanner>(parent); } - void visitCall(Call* curr) { - if (!getModule()->getFunction(curr->target)->imported()) { - parent->nodes[parent->functionToDCENode[getFunction()->name]] - .reaches.push_back(parent->functionToDCENode[curr->target]); - } else { - assert(parent->functionToDCENode.count(getFunction()->name) > 0); - parent->nodes[parent->functionToDCENode[getFunction()->name]] - .reaches.push_back( - parent - ->importIdToDCENode[parent->getFunctionImportId(curr->target)]); - } - } + void visitCall(Call* curr) { handleFunction(curr->target); } + void visitRefFunc(RefFunc* curr) { handleFunction(curr->func); } void visitGlobalGet(GlobalGet* curr) { handleGlobal(curr->name); } void visitGlobalSet(GlobalSet* curr) { handleGlobal(curr->name); } void visitThrow(Throw* curr) { handleTag(curr->tag); } @@ -272,6 +275,18 @@ struct MetaDCEGraph { private: MetaDCEGraph* parent; + void handleFunction(Name name) { + if (!getModule()->getFunction(name)->imported()) { + parent->nodes[parent->functionToDCENode[getFunction()->name]] + .reaches.push_back(parent->functionToDCENode[name]); + } else { + assert(parent->functionToDCENode.count(getFunction()->name) > 0); + parent->nodes[parent->functionToDCENode[getFunction()->name]] + .reaches.push_back( + parent->importIdToDCENode[parent->getFunctionImportId(name)]); + } + } + void handleGlobal(Name name) { if (!getFunction()) { return; // non-function stuff (initializers) are handled separately |