summaryrefslogtreecommitdiff
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
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.
-rw-r--r--src/passes/RemoveImports.cpp13
-rw-r--r--test/passes/remove-imports.txt8
-rw-r--r--test/passes/remove-imports.wast4
3 files changed, 23 insertions, 2 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);
+ }
}
}
};
diff --git a/test/passes/remove-imports.txt b/test/passes/remove-imports.txt
index 9c7444b8d..4d85934de 100644
--- a/test/passes/remove-imports.txt
+++ b/test/passes/remove-imports.txt
@@ -2,9 +2,12 @@
(type $FUNCSIG$v (func))
(type $FUNCSIG$i (func (result i32)))
(type $FUNCSIG$d (func (result f64)))
+ (import "env" "table" (table $0 1 1 funcref))
+ (elem (i32.const 0) $waka-sneaky)
(import "env" "memBase" (global $import$global0 i32))
+ (import "somewhere" "waka-sneaky" (func $waka-sneaky))
(memory $0 1024 1024)
- (func $nada (; 0 ;) (type $FUNCSIG$v)
+ (func $nada (; 1 ;) (type $FUNCSIG$v)
(nop)
(drop
(i32.const 0)
@@ -12,5 +15,8 @@
(drop
(f64.const 0)
)
+ (call_indirect (type $FUNCSIG$v)
+ (i32.const 0)
+ )
)
)
diff --git a/test/passes/remove-imports.wast b/test/passes/remove-imports.wast
index d7c883d67..a96a438f5 100644
--- a/test/passes/remove-imports.wast
+++ b/test/passes/remove-imports.wast
@@ -6,7 +6,10 @@
(import $waka "somewhere" "waka")
(import $waka-ret "somewhere" "waka-ret" (result i32))
(import $waka-ret-d "somewhere" "waka-ret-d" (result f64))
+ (import $waka-sneaky "somewhere" "waka-sneaky")
(import "env" "memBase" (global i32))
+ (import "env" "table" (table $table 1 1 funcref))
+ (elem (i32.const 0) $waka-sneaky)
(func $nada (type $FUNCSIG$v)
(call $waka)
(drop
@@ -15,5 +18,6 @@
(drop
(call $waka-ret-d)
)
+ (call_indirect (i32.const 0))
)
)