diff options
Diffstat (limited to 'src/pass.h')
-rw-r--r-- | src/pass.h | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/src/pass.h b/src/pass.h index 35065b0a3..334f46ac8 100644 --- a/src/pass.h +++ b/src/pass.h @@ -55,6 +55,20 @@ private: std::map<std::string, PassInfo> passInfos; }; +struct PassOptions { + bool debug = false; // run passes in debug mode, doing extra validation and timing checks + bool validateGlobally = false; // when validating validate globally and not just locally + int optimizeLevel = 0; // 0, 1, 2 correspond to -O0, -O1, -O2, etc. + int shrinkLevel = 0; // 0, 1, 2 correspond to -O0, -Os, -Oz + bool ignoreImplicitTraps = false; // optimize assuming things like div by 0, bad load/store, will not trap + + void setDefaultOptimizationOptions() { + optimizeLevel = 2; + shrinkLevel = 1; + ignoreImplicitTraps = true; + } +}; + // // Runs a set of passes, in order // @@ -62,17 +76,17 @@ struct PassRunner { Module* wasm; MixedArena* allocator; std::vector<Pass*> passes; - bool debug = false; - bool validateGlobally = false; + PassOptions options; PassRunner(Module* wasm) : wasm(wasm), allocator(&wasm->allocator) {} + PassRunner(Module* wasm, PassOptions options) : wasm(wasm), allocator(&wasm->allocator), options(options) {} void setDebug(bool debug_) { - debug = debug_; - validateGlobally = debug; // validate everything by default if debugging + options.debug = debug_; + options.validateGlobally = debug_; // validate everything by default if debugging } void setValidateGlobally(bool validate) { - validateGlobally = validate; + options.validateGlobally = validate; } void add(std::string passName) { @@ -173,15 +187,28 @@ protected: // template <typename WalkerType> class WalkerPass : public Pass, public WalkerType { + PassRunner *runner; + public: void run(PassRunner* runner, Module* module) override { + setPassRunner(runner); + WalkerType::setModule(module); WalkerType::walkModule(module); } void runFunction(PassRunner* runner, Module* module, Function* func) override { + setPassRunner(runner); WalkerType::setModule(module); WalkerType::walkFunction(func); } + + PassRunner* getPassRunner() { + return runner; + } + + void setPassRunner(PassRunner* runner_) { + runner = runner_; + } }; // Standard passes. All passes in /passes/ are runnable from the shell, |