diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/Directize.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/passes/Directize.cpp b/src/passes/Directize.cpp index d9400cce7..b2d132c5e 100644 --- a/src/passes/Directize.cpp +++ b/src/passes/Directize.cpp @@ -72,18 +72,18 @@ struct FunctionDirectizer : public WalkerPass<PostWalker<FunctionDirectizer>> { // reorder/replace traps when optimizing (but never to // remove them, at least not by default). if (index >= flatTable->names.size()) { - replaceWithUnreachable(); + replaceWithUnreachable(curr); return; } auto name = flatTable->names[index]; if (!name.is()) { - replaceWithUnreachable(); + replaceWithUnreachable(curr); return; } auto* func = getModule()->getFunction(name); if (getSig(getModule()->getFunctionType(curr->fullType)) != getSig(func)) { - replaceWithUnreachable(); + replaceWithUnreachable(curr); return; } // Everything looks good! @@ -98,8 +98,17 @@ struct FunctionDirectizer : public WalkerPass<PostWalker<FunctionDirectizer>> { private: FlatTable* flatTable; - void replaceWithUnreachable() { - replaceCurrent(Builder(*getModule()).makeUnreachable()); + void replaceWithUnreachable(CallIndirect* call) { + Builder builder(*getModule()); + for (auto*& operand : call->operands) { + operand = builder.makeDrop(operand); + } + replaceCurrent( + builder.makeSequence( + builder.makeBlock(call->operands), + builder.makeUnreachable() + ) + ); } }; |