summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/asm2wasm.h1
-rw-r--r--src/pass.h16
-rw-r--r--src/passes/CoalesceLocals.cpp8
-rw-r--r--src/passes/DeadCodeElimination.cpp4
-rw-r--r--src/passes/DropReturnValues.cpp4
-rw-r--r--src/passes/DuplicateFunctionElimination.cpp4
-rw-r--r--src/passes/LowerIfElse.cpp4
-rw-r--r--src/passes/LowerInt64.cpp4
-rw-r--r--src/passes/MergeBlocks.cpp4
-rw-r--r--src/passes/Metrics.cpp5
-rw-r--r--src/passes/NameList.cpp4
-rw-r--r--src/passes/NameManager.cpp4
-rw-r--r--src/passes/OptimizeInstructions.cpp4
-rw-r--r--src/passes/PostEmscripten.cpp4
-rw-r--r--src/passes/Precompute.cpp4
-rw-r--r--src/passes/Print.cpp12
-rw-r--r--src/passes/RemoveImports.cpp4
-rw-r--r--src/passes/RemoveMemory.cpp4
-rw-r--r--src/passes/RemoveUnusedBrs.cpp4
-rw-r--r--src/passes/RemoveUnusedFunctions.cpp4
-rw-r--r--src/passes/RemoveUnusedNames.cpp4
-rw-r--r--src/passes/ReorderFunctions.cpp4
-rw-r--r--src/passes/ReorderLocals.cpp4
-rw-r--r--src/passes/SimplifyLocals.cpp4
-rw-r--r--src/passes/Vacuum.cpp4
-rw-r--r--src/passes/pass.cpp42
-rw-r--r--src/passes/passes.h54
27 files changed, 175 insertions, 43 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index fa83a9cd2..c4cc766aa 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -27,6 +27,7 @@
#include "mixed_arena.h"
#include "asmjs/shared-constants.h"
#include "asm_v_wasm.h"
+#include "passes/passes.h"
#include "pass.h"
#include "ast_utils.h"
#include "wasm-builder.h"
diff --git a/src/pass.h b/src/pass.h
index 4a5fe609d..0ad8d8c1d 100644
--- a/src/pass.h
+++ b/src/pass.h
@@ -32,6 +32,8 @@ class Pass;
// Global registry of all passes in /passes/
//
struct PassRegistry {
+ PassRegistry();
+
static PassRegistry* get();
typedef std::function<Pass* ()> Creator;
@@ -42,6 +44,8 @@ struct PassRegistry {
std::string getPassDescription(std::string name);
private:
+ void registerPasses();
+
struct PassInfo {
std::string description;
Creator create;
@@ -52,18 +56,6 @@ private:
};
//
-// Utility class to register a pass. See pass files for usage.
-//
-template<class P>
-struct RegisterPass {
- RegisterPass(const char* name, const char *description) {
- PassRegistry::get()->registerPass(name, description, []() {
- return new P();
- });
- }
-};
-
-//
// Runs a set of passes, in order
//
struct PassRunner {
diff --git a/src/passes/CoalesceLocals.cpp b/src/passes/CoalesceLocals.cpp
index e2d11d697..a5edcd99d 100644
--- a/src/passes/CoalesceLocals.cpp
+++ b/src/passes/CoalesceLocals.cpp
@@ -595,8 +595,12 @@ void CoalesceLocalsWithLearning::pickIndices(std::vector<Index>& indices) {
// declare passes
-static RegisterPass<CoalesceLocals> registerPass1("coalesce-locals", "reduce # of locals by coalescing");
+Pass *createCoalesceLocalsPass() {
+ return new CoalesceLocals();
+}
-static RegisterPass<CoalesceLocalsWithLearning> registerPass2("coalesce-locals-learning", "reduce # of locals by coalescing and learning");
+Pass *createCoalesceLocalsWithLearningPass() {
+ return new CoalesceLocalsWithLearning();
+}
} // namespace wasm
diff --git a/src/passes/DeadCodeElimination.cpp b/src/passes/DeadCodeElimination.cpp
index 79a004eb2..9562b2973 100644
--- a/src/passes/DeadCodeElimination.cpp
+++ b/src/passes/DeadCodeElimination.cpp
@@ -346,7 +346,9 @@ struct DeadCodeElimination : public WalkerPass<PostWalker<DeadCodeElimination, V
}
};
-static RegisterPass<DeadCodeElimination> registerPass("dce", "removes unreachable code");
+Pass *createDeadCodeEliminationPass() {
+ return new DeadCodeElimination();
+}
} // namespace wasm
diff --git a/src/passes/DropReturnValues.cpp b/src/passes/DropReturnValues.cpp
index a146b8a45..8715f3f61 100644
--- a/src/passes/DropReturnValues.cpp
+++ b/src/passes/DropReturnValues.cpp
@@ -75,7 +75,9 @@ struct DropReturnValues : public WalkerPass<PostWalker<DropReturnValues, Visitor
}
};
-static RegisterPass<DropReturnValues> registerPass("drop-return-values", "stops relying on return values from set_local and store");
+Pass *createDropReturnValuesPass() {
+ return new DropReturnValues();
+}
} // namespace wasm
diff --git a/src/passes/DuplicateFunctionElimination.cpp b/src/passes/DuplicateFunctionElimination.cpp
index 715df0815..961d26ba5 100644
--- a/src/passes/DuplicateFunctionElimination.cpp
+++ b/src/passes/DuplicateFunctionElimination.cpp
@@ -164,7 +164,9 @@ private:
}
};
-static RegisterPass<DuplicateFunctionElimination> registerPass("duplicate-function-elimination", "removes duplicate functions");
+Pass *createDuplicateFunctionEliminationPass() {
+ return new DuplicateFunctionElimination();
+}
} // namespace wasm
diff --git a/src/passes/LowerIfElse.cpp b/src/passes/LowerIfElse.cpp
index c0df094fc..7bdb2f419 100644
--- a/src/passes/LowerIfElse.cpp
+++ b/src/passes/LowerIfElse.cpp
@@ -60,6 +60,8 @@ struct LowerIfElse : public WalkerPass<PostWalker<LowerIfElse, Visitor<LowerIfEl
}
};
-static RegisterPass<LowerIfElse> registerPass("lower-if-else", "lowers if-elses into ifs, blocks and branches");
+Pass *createLowerIfElsePass() {
+ return new LowerIfElse();
+}
} // namespace wasm
diff --git a/src/passes/LowerInt64.cpp b/src/passes/LowerInt64.cpp
index 7af7443e5..b59b1d5fc 100644
--- a/src/passes/LowerInt64.cpp
+++ b/src/passes/LowerInt64.cpp
@@ -189,6 +189,8 @@ struct LowerInt64 : public Pass {
}
};
-static RegisterPass<LowerInt64> registerPass("lower-i64", "lowers i64 into pairs of i32s");
+Pass *createLowerInt64Pass() {
+ return new LowerInt64();
+}
} // namespace wasm
diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp
index 39d2b85c9..686bb5d75 100644
--- a/src/passes/MergeBlocks.cpp
+++ b/src/passes/MergeBlocks.cpp
@@ -178,7 +178,9 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks, Visitor<MergeBloc
}
};
-static RegisterPass<MergeBlocks> registerPass("merge-blocks", "merges blocks to their parents");
+Pass *createMergeBlocksPass() {
+ return new MergeBlocks();
+}
} // namespace wasm
diff --git a/src/passes/Metrics.cpp b/src/passes/Metrics.cpp
index a01ead073..c5309850e 100644
--- a/src/passes/Metrics.cpp
+++ b/src/passes/Metrics.cpp
@@ -87,7 +87,10 @@ struct Metrics : public WalkerPass<PostWalker<Metrics, UnifiedExpressionVisitor<
}
};
+Pass *createMetricsPass() {
+ return new Metrics();
+}
+
Metrics *Metrics::lastMetricsPass;
-static RegisterPass<Metrics> registerPass("metrics", "reports metrics");
} // namespace wasm
diff --git a/src/passes/NameList.cpp b/src/passes/NameList.cpp
index ed0d1835a..85bac62e9 100644
--- a/src/passes/NameList.cpp
+++ b/src/passes/NameList.cpp
@@ -32,7 +32,9 @@ struct NameList : public Pass {
}
};
-static RegisterPass<NameList> registerPass("nm", "name list");
+Pass *createNameListPass() {
+ return new NameList();
+}
} // namespace wasm
diff --git a/src/passes/NameManager.cpp b/src/passes/NameManager.cpp
index 2f20979b8..df8b34557 100644
--- a/src/passes/NameManager.cpp
+++ b/src/passes/NameManager.cpp
@@ -74,6 +74,8 @@ void NameManager::visitExport(Export* curr) {
names.insert(curr->name);
}
-static RegisterPass<NameManager> registerPass("name-manager", "utility pass to manage names in modules");
+Pass *createNameManagerPass() {
+ return new NameManager();
+}
} // namespace wasm
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index b140c5539..efa9409a7 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -86,6 +86,8 @@ struct OptimizeInstructions : public WalkerPass<PostWalker<OptimizeInstructions,
}
};
-static RegisterPass<OptimizeInstructions> registerPass("optimize-instructions", "optimizes instruction combinations");
+Pass *createOptimizeInstructionsPass() {
+ return new OptimizeInstructions();
+}
} // namespace wasm
diff --git a/src/passes/PostEmscripten.cpp b/src/passes/PostEmscripten.cpp
index 527e32132..e46270c50 100644
--- a/src/passes/PostEmscripten.cpp
+++ b/src/passes/PostEmscripten.cpp
@@ -77,6 +77,8 @@ struct PostEmscripten : public WalkerPass<PostWalker<PostEmscripten, Visitor<Pos
}
};
-static RegisterPass<PostEmscripten> registerPass("post-emscripten", "miscellaneous optimizations for Emscripten-generated code");
+Pass *createPostEmscriptenPass() {
+ return new PostEmscripten();
+}
} // namespace wasm
diff --git a/src/passes/Precompute.cpp b/src/passes/Precompute.cpp
index db6999cbd..36f33d514 100644
--- a/src/passes/Precompute.cpp
+++ b/src/passes/Precompute.cpp
@@ -97,7 +97,9 @@ struct Precompute : public WalkerPass<PostWalker<Precompute, UnifiedExpressionVi
}
};
-static RegisterPass<Precompute> registerPass("precompute", "computes compile-time evaluatable expressions");
+Pass *createPrecomputePass() {
+ return new Precompute();
+}
} // namespace wasm
diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp
index 23d03ec40..2408ed1b7 100644
--- a/src/passes/Print.cpp
+++ b/src/passes/Print.cpp
@@ -623,7 +623,9 @@ void Printer::run(PassRunner* runner, Module* module) {
print.visitModule(module);
}
-static RegisterPass<Printer> registerPass("print", "print in s-expression format");
+Pass *createPrinterPass() {
+ return new Printer();
+}
// Prints out a minified module
@@ -639,7 +641,9 @@ public:
}
};
-static RegisterPass<MinifiedPrinter> registerMinifyPass("print-minified", "print in minified s-expression format");
+Pass *createMinifiedPrinterPass() {
+ return new MinifiedPrinter();
+}
// Prints out a module withough elision, i.e., the full ast
@@ -655,7 +659,9 @@ public:
}
};
-static RegisterPass<FullPrinter> registerFullASTPass("print-full", "print in full s-expression format");
+Pass *createFullPrinterPass() {
+ return new FullPrinter();
+}
// Print individual expressions
diff --git a/src/passes/RemoveImports.cpp b/src/passes/RemoveImports.cpp
index 1ef28292f..0b3f50049 100644
--- a/src/passes/RemoveImports.cpp
+++ b/src/passes/RemoveImports.cpp
@@ -58,6 +58,8 @@ struct RemoveImports : public WalkerPass<PostWalker<RemoveImports, Visitor<Remov
}
};
-static RegisterPass<RemoveImports> registerPass("remove-imports", "removes imports and replaces them with nops");
+Pass *createRemoveImportsPass() {
+ return new RemoveImports();
+}
} // namespace wasm
diff --git a/src/passes/RemoveMemory.cpp b/src/passes/RemoveMemory.cpp
index 8135d93bd..33d9e6da5 100644
--- a/src/passes/RemoveMemory.cpp
+++ b/src/passes/RemoveMemory.cpp
@@ -29,6 +29,8 @@ struct RemoveMemory : public Pass {
}
};
-static RegisterPass<RemoveMemory> registerPass("remove-memory", "removes memory segments");
+Pass *createRemoveMemoryPass() {
+ return new RemoveMemory();
+}
} // namespace wasm
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index 3f909c32e..263cea655 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -232,6 +232,8 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<R
}
};
-static RegisterPass<RemoveUnusedBrs> registerPass("remove-unused-brs", "removes breaks from locations that are not needed");
+Pass *createRemoveUnusedBrsPass() {
+ return new RemoveUnusedBrs();
+}
} // namespace wasm
diff --git a/src/passes/RemoveUnusedFunctions.cpp b/src/passes/RemoveUnusedFunctions.cpp
index 25de7f18e..a2941aff6 100644
--- a/src/passes/RemoveUnusedFunctions.cpp
+++ b/src/passes/RemoveUnusedFunctions.cpp
@@ -54,6 +54,8 @@ struct RemoveUnusedFunctions : public Pass {
}
};
-static RegisterPass<RemoveUnusedFunctions> registerPass("remove-unused-functions", "removes unused functions");
+Pass *createRemoveUnusedFunctionsPass() {
+ return new RemoveUnusedFunctions();
+}
} // namespace wasm
diff --git a/src/passes/RemoveUnusedNames.cpp b/src/passes/RemoveUnusedNames.cpp
index 705ec2724..1cd2a483f 100644
--- a/src/passes/RemoveUnusedNames.cpp
+++ b/src/passes/RemoveUnusedNames.cpp
@@ -54,6 +54,8 @@ struct RemoveUnusedNames : public WalkerPass<PostWalker<RemoveUnusedNames, Visit
}
};
-static RegisterPass<RemoveUnusedNames> registerPass("remove-unused-names", "removes names from locations that are never branched to");
+Pass *createRemoveUnusedNamesPass() {
+ return new RemoveUnusedNames();
+}
} // namespace wasm
diff --git a/src/passes/ReorderFunctions.cpp b/src/passes/ReorderFunctions.cpp
index 6360f6302..38ef98afb 100644
--- a/src/passes/ReorderFunctions.cpp
+++ b/src/passes/ReorderFunctions.cpp
@@ -57,6 +57,8 @@ struct ReorderFunctions : public WalkerPass<PostWalker<ReorderFunctions, Visitor
}
};
-static RegisterPass<ReorderFunctions> registerPass("reorder-functions", "sorts functions by access frequency");
+Pass *createReorderFunctionsPass() {
+ return new ReorderFunctions();
+}
} // namespace wasm
diff --git a/src/passes/ReorderLocals.cpp b/src/passes/ReorderLocals.cpp
index 60d892b87..8cc8fa4f1 100644
--- a/src/passes/ReorderLocals.cpp
+++ b/src/passes/ReorderLocals.cpp
@@ -134,6 +134,8 @@ struct ReorderLocals : public WalkerPass<PostWalker<ReorderLocals, Visitor<Reord
}
};
-static RegisterPass<ReorderLocals> registerPass("reorder-locals", "sorts locals by access frequency");
+Pass *createReorderLocalsPass() {
+ return new ReorderLocals();
+}
} // namespace wasm
diff --git a/src/passes/SimplifyLocals.cpp b/src/passes/SimplifyLocals.cpp
index b79b55eea..d9786e62c 100644
--- a/src/passes/SimplifyLocals.cpp
+++ b/src/passes/SimplifyLocals.cpp
@@ -434,6 +434,8 @@ struct SimplifyLocals : public WalkerPass<LinearExecutionWalker<SimplifyLocals,
}
};
-static RegisterPass<SimplifyLocals> registerPass("simplify-locals", "miscellaneous locals-related optimizations");
+Pass *createSimplifyLocalsPass() {
+ return new SimplifyLocals();
+}
} // namespace wasm
diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp
index 5e1558285..0195427d7 100644
--- a/src/passes/Vacuum.cpp
+++ b/src/passes/Vacuum.cpp
@@ -228,7 +228,9 @@ struct Vacuum : public WalkerPass<PostWalker<Vacuum, Visitor<Vacuum>>> {
}
};
-static RegisterPass<Vacuum> registerPass("vacuum", "removes obviously unneeded code");
+Pass *createVacuumPass() {
+ return new Vacuum();
+}
} // namespace wasm
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index 1c66147ef..0e6f9f314 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -16,18 +16,21 @@
#include <chrono>
+#include <passes/passes.h>
#include <pass.h>
namespace wasm {
// PassRegistry
+PassRegistry::PassRegistry() {
+ registerPasses();
+}
+
+static PassRegistry singleton;
+
PassRegistry* PassRegistry::get() {
- static PassRegistry* manager = nullptr;
- if (!manager) {
- manager = new PassRegistry();
- }
- return manager;
+ return &singleton;
}
void PassRegistry::registerPass(const char* name, const char *description, Creator create) {
@@ -57,6 +60,35 @@ std::string PassRegistry::getPassDescription(std::string name) {
// PassRunner
+void PassRegistry::registerPasses() {
+ registerPass("coalesce-locals", "reduce # of locals by coalescing", createCoalesceLocalsPass);
+ registerPass("coalesce-locals-learning", "reduce # of locals by coalescing and learning", createCoalesceLocalsWithLearningPass);
+ registerPass("dce", "removes unreachable code", createDeadCodeEliminationPass);
+ registerPass("drop-return-values", "stops relying on return values from set_local and store", createDropReturnValuesPass);
+ registerPass("duplicate-function-elimination", "removes duplicate functions", createDuplicateFunctionEliminationPass);
+ registerPass("lower-if-else", "lowers if-elses into ifs, blocks and branches", createLowerIfElsePass);
+ registerPass("merge-blocks", "merges blocks to their parents", createMergeBlocksPass);
+ registerPass("metrics", "reports metrics", createMetricsPass);
+ registerPass("nm", "name list", createNameListPass);
+ registerPass("name-manager", "utility pass to manage names in modules", createNameManagerPass);
+ registerPass("optimize-instructions", "optimizes instruction combinations", createOptimizeInstructionsPass);
+ registerPass("post-emscripten", "miscellaneous optimizations for Emscripten-generated code", createPostEmscriptenPass);
+ registerPass("print", "print in s-expression format", createPrinterPass);
+ registerPass("print-minified", "print in minified s-expression format", createMinifiedPrinterPass);
+ registerPass("print-full", "print in full s-expression format", createFullPrinterPass);
+ registerPass("remove-imports", "removes imports and replaces them with nops", createRemoveImportsPass);
+ registerPass("remove-memory", "removes memory segments", createRemoveMemoryPass);
+ registerPass("remove-unused-brs", "removes breaks from locations that are not needed", createRemoveUnusedBrsPass);
+ registerPass("remove-unused-functions", "removes unused functions", createRemoveUnusedFunctionsPass);
+ registerPass("remove-unused-names", "removes names from locations that are never branched to", createRemoveUnusedNamesPass);
+ registerPass("reorder-functions", "sorts functions by access frequency", createReorderFunctionsPass);
+ registerPass("reorder-locals", "sorts locals by access frequency", createReorderLocalsPass);
+ registerPass("simplify-locals", "miscellaneous locals-related optimizations", createSimplifyLocalsPass);
+ registerPass("vacuum", "removes obviously unneeded code", createVacuumPass);
+ registerPass("precompute", "computes compile-time evaluatable expressions", createPrecomputePass);
+// registerPass("lower-i64", "lowers i64 into pairs of i32s", createLowerInt64Pass);
+}
+
void PassRunner::addDefaultOptimizationPasses() {
add("duplicate-function-elimination");
add("dce");
diff --git a/src/passes/passes.h b/src/passes/passes.h
new file mode 100644
index 000000000..731536d7d
--- /dev/null
+++ b/src/passes/passes.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef wasm_passes_h
+#define wasm_passes_h
+
+namespace wasm {
+
+class Pass;
+
+// All passes:
+Pass *createCoalesceLocalsPass();
+Pass *createCoalesceLocalsWithLearningPass();
+Pass *createDeadCodeEliminationPass();
+Pass *createDropReturnValuesPass();
+Pass *createDuplicateFunctionEliminationPass();
+Pass *createLowerIfElsePass();
+Pass *createMergeBlocksPass();
+Pass *createMetricsPass();
+Pass *createNameListPass();
+Pass *createNameManagerPass();
+Pass *createOptimizeInstructionsPass();
+Pass *createPostEmscriptenPass();
+Pass *createPrinterPass();
+Pass *createMinifiedPrinterPass();
+Pass *createFullPrinterPass();
+Pass *createRemoveImportsPass();
+Pass *createRemoveMemoryPass();
+Pass *createRemoveUnusedBrsPass();
+Pass *createRemoveUnusedFunctionsPass();
+Pass *createRemoveUnusedNamesPass();
+Pass *createReorderFunctionsPass();
+Pass *createReorderLocalsPass();
+Pass *createSimplifyLocalsPass();
+Pass *createVacuumPass();
+Pass *createPrecomputePass();
+//Pass *createLowerInt64Pass();
+
+}
+
+#endif