summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/passes/Directize.cpp30
-rw-r--r--src/passes/pass.cpp4
2 files changed, 18 insertions, 16 deletions
diff --git a/src/passes/Directize.cpp b/src/passes/Directize.cpp
index fe6d73b0d..d9400cce7 100644
--- a/src/passes/Directize.cpp
+++ b/src/passes/Directize.cpp
@@ -26,8 +26,6 @@
#include "pass.h"
#include "wasm-builder.h"
#include "wasm-traversal.h"
-#include "find_all.h"
-#include "ir/module-utils.h"
#include "asm_v_wasm.h"
namespace wasm {
@@ -41,8 +39,9 @@ struct FlatTable {
FlatTable(Table& table) {
valid = true;
for (auto& segment : table.segments) {
- auto offset = segment->offset;
+ auto offset = segment.offset;
if (!offset->is<Const>()) {
+ // TODO: handle some non-constant segments
valid = false;
return;
}
@@ -58,12 +57,12 @@ struct FlatTable {
}
};
-struct FunctionDirectizer : public WalkerPass<FunctionDirectizer> {
+struct FunctionDirectizer : public WalkerPass<PostWalker<FunctionDirectizer>> {
bool isFunctionParallel() override { return true; }
- Pass* create() override { return new Scanner(flatTable); }
+ Pass* create() override { return new FunctionDirectizer(flatTable); }
- Scanner(FlatTable* flatTable) : flatTable(flatTable) {}
+ FunctionDirectizer(FlatTable* flatTable) : flatTable(flatTable) {}
void visitCallIndirect(CallIndirect* curr) {
if (auto* c = curr->target->dynCast<Const>()) {
@@ -72,11 +71,15 @@ struct FunctionDirectizer : public WalkerPass<FunctionDirectizer> {
// emit an unreachable here, since in Binaryen it is ok to
// reorder/replace traps when optimizing (but never to
// remove them, at least not by default).
- if (index >= flatTable.names.size()) {
+ if (index >= flatTable->names.size()) {
+ replaceWithUnreachable();
+ return;
+ }
+ auto name = flatTable->names[index];
+ if (!name.is()) {
replaceWithUnreachable();
return;
}
- auto name = flatTable.names[index];
auto* func = getModule()->getFunction(name);
if (getSig(getModule()->getFunctionType(curr->fullType)) !=
getSig(func)) {
@@ -96,16 +99,16 @@ private:
FlatTable* flatTable;
void replaceWithUnreachable() {
- return replaceCurrent(Builder(*getModule()).makeUnreachable));
+ replaceCurrent(Builder(*getModule()).makeUnreachable());
}
};
-struct Directize : public WalkerPass<Directize> {
+struct Directize : public Pass {
void run(PassRunner* runner, Module* module) override {
- if (!module->table.exists()) return;
+ if (!module->table.exists) return;
if (module->table.imported()) return;
- for (auto& export : module->exports) {
- if (export->kind == ExternalKind::Table) return;
+ for (auto& ex : module->exports) {
+ if (ex->kind == ExternalKind::Table) return;
}
FlatTable flatTable(module->table);
if (!flatTable.valid) return;
@@ -119,7 +122,6 @@ struct Directize : public WalkerPass<Directize> {
}
};
-
} // anonymous namespace
Pass *createDirectizePass() {
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index a5cfc2116..f20cc19fd 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -75,7 +75,7 @@ void PassRegistry::registerPasses() {
registerPass("code-folding", "fold code, merging duplicates", createCodeFoldingPass);
registerPass("const-hoisting", "hoist repeated constants to a local", createConstHoistingPass);
registerPass("dce", "removes unreachable code", createDeadCodeEliminationPass);
- registerPass("directize", "turns indirect calls into direct ones", createDirectize);
+ registerPass("directize", "turns indirect calls into direct ones", createDirectizePass);
registerPass("dfo", "optimizes using the DataFlow SSA IR", createDataFlowOptsPass);
registerPass("duplicate-function-elimination", "removes duplicate functions", createDuplicateFunctionEliminationPass);
registerPass("extract-function", "leaves just one function (useful for debugging)", createExtractFunctionPass);
@@ -229,8 +229,8 @@ void PassRunner::addDefaultGlobalOptimizationPrePasses() {
}
void PassRunner::addDefaultGlobalOptimizationPostPasses() {
- add("directize");
if (options.optimizeLevel >= 2 || options.shrinkLevel >= 1) {
+ add("directize");
add("dae-optimizing");
}
if (options.optimizeLevel >= 2 || options.shrinkLevel >= 2) {