diff options
author | Jukka Jylänki <jujjyl@gmail.com> | 2016-06-11 01:08:30 +0300 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-06-21 16:44:14 -0700 |
commit | 41689a5dde63c96eb1bf7daf50bc192979aa0452 (patch) | |
tree | 5d4e4ceb383b8d4db087dc78c0dc5297d6f876b0 /src/passes/pass.cpp | |
parent | cd788a1a62025fed3832672cb539dda4c4ce1329 (diff) | |
download | binaryen-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.cpp | 42 |
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"); |