summaryrefslogtreecommitdiff
path: root/src/passes/pass.cpp
diff options
context:
space:
mode:
authorJukka Jylänki <jujjyl@gmail.com>2016-06-11 01:08:30 +0300
committerAlon Zakai <alonzakai@gmail.com>2016-06-21 16:44:14 -0700
commit41689a5dde63c96eb1bf7daf50bc192979aa0452 (patch)
tree5d4e4ceb383b8d4db087dc78c0dc5297d6f876b0 /src/passes/pass.cpp
parentcd788a1a62025fed3832672cb539dda4c4ce1329 (diff)
downloadbinaryen-41689a5dde63c96eb1bf7daf50bc192979aa0452.tar.gz
binaryen-41689a5dde63c96eb1bf7daf50bc192979aa0452.tar.bz2
binaryen-41689a5dde63c96eb1bf7daf50bc192979aa0452.zip
Add initialization functions for passes to avoid missing pass registration due to linker dead code elimination. Fixes #577.
Diffstat (limited to 'src/passes/pass.cpp')
-rw-r--r--src/passes/pass.cpp42
1 files changed, 37 insertions, 5 deletions
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");