diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2019-06-24 17:33:35 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-24 17:33:35 -0700 |
commit | e63fe0b42d8a334a48c2988f3c05705ee04701f9 (patch) | |
tree | fdf5b9517493ed22ff6d81c2f5bf1c26be91f342 | |
parent | cbc7e868d85a81e1a2f802b633d3cf323a14338f (diff) | |
download | binaryen-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.cpp | 13 | ||||
-rw-r--r-- | test/passes/remove-imports.txt | 8 | ||||
-rw-r--r-- | test/passes/remove-imports.wast | 4 |
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)) ) ) |