From e63fe0b42d8a334a48c2988f3c05705ee04701f9 Mon Sep 17 00:00:00 2001 From: Thomas Lively <7121787+tlively@users.noreply.github.com> Date: Mon, 24 Jun 2019 17:33:35 -0700 Subject: Skip imports in table during RemoveImports (#2181) This prevents RemoveImports from producing an invalid module that references functions that no longer exist. --- src/passes/RemoveImports.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') 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> { std::vector names; ModuleUtils::iterImportedFunctions( *curr, [&](Function* func) { names.push_back(func->name); }); + // Do not remove names referenced in a table + std::set 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); + } } } }; -- cgit v1.2.3