summaryrefslogtreecommitdiff
path: root/src/passes/RemoveImports.cpp
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2019-06-24 17:33:35 -0700
committerGitHub <noreply@github.com>2019-06-24 17:33:35 -0700
commite63fe0b42d8a334a48c2988f3c05705ee04701f9 (patch)
treefdf5b9517493ed22ff6d81c2f5bf1c26be91f342 /src/passes/RemoveImports.cpp
parentcbc7e868d85a81e1a2f802b633d3cf323a14338f (diff)
downloadbinaryen-e63fe0b42d8a334a48c2988f3c05705ee04701f9.tar.gz
binaryen-e63fe0b42d8a334a48c2988f3c05705ee04701f9.tar.bz2
binaryen-e63fe0b42d8a334a48c2988f3c05705ee04701f9.zip
Skip imports in table during RemoveImports (#2181)
This prevents RemoveImports from producing an invalid module that references functions that no longer exist.
Diffstat (limited to 'src/passes/RemoveImports.cpp')
-rw-r--r--src/passes/RemoveImports.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/passes/RemoveImports.cpp b/src/passes/RemoveImports.cpp
index a3ca45b16..50f7cfa3d 100644
--- a/src/passes/RemoveImports.cpp
+++ b/src/passes/RemoveImports.cpp
@@ -48,8 +48,19 @@ struct RemoveImports : public WalkerPass<PostWalker<RemoveImports>> {
std::vector<Name> names;
ModuleUtils::iterImportedFunctions(
*curr, [&](Function* func) { names.push_back(func->name); });
+ // Do not remove names referenced in a table
+ std::set<Name> indirectNames;
+ if (curr->table.exists) {
+ for (auto& segment : curr->table.segments) {
+ for (auto& name : segment.data) {
+ indirectNames.insert(name);
+ }
+ }
+ }
for (auto& name : names) {
- curr->removeFunction(name);
+ if (indirectNames.find(name) == indirectNames.end()) {
+ curr->removeFunction(name);
+ }
}
}
};