diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-05-30 12:08:17 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-06-02 16:06:56 -0700 |
commit | c8a57dee5e9c99c51433f3d08da3edc2aadb0140 (patch) | |
tree | 14d4626467f0abb1952b64d3b92229a5090c607e /src/pass.h | |
parent | b37bd96ea3345cf7015e9e925e0d33524cd1c3db (diff) | |
download | binaryen-c8a57dee5e9c99c51433f3d08da3edc2aadb0140.tar.gz binaryen-c8a57dee5e9c99c51433f3d08da3edc2aadb0140.tar.bz2 binaryen-c8a57dee5e9c99c51433f3d08da3edc2aadb0140.zip |
add an option to run passes on individual functions, and to get default optimization passes suitable for that, or not. refactor visitFunction/Module for this.
Diffstat (limited to 'src/pass.h')
-rw-r--r-- | src/pass.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/pass.h b/src/pass.h index e25809faa..fff2b04eb 100644 --- a/src/pass.h +++ b/src/pass.h @@ -97,8 +97,20 @@ struct PassRunner { // what -O does. void addDefaultOptimizationPasses(); + // Adds the default optimization passes that work on + // individual functions. + void addDefaultFunctionOptimizationPasses(); + + // Adds the default optimization passes that work on + // entire modules as a whole. + void addDefaultGlobalOptimizationPasses(); + + // Run the passes on the module void run(); + // Run the passes on a specific function + void runFunction(Function* func); + // Get the last pass that was already executed of a certain type. template<class P> P* getLast(); @@ -112,12 +124,18 @@ struct PassRunner { class Pass { public: virtual ~Pass() {}; + // Override this to perform preparation work before the pass runs. virtual void prepare(PassRunner* runner, Module* module) {} virtual void run(PassRunner* runner, Module* module) = 0; // Override this to perform finalization work after the pass runs. virtual void finalize(PassRunner* runner, Module* module) {} + // Run on a single function. This has no prepare/finalize calls. + virtual void runFunction(PassRunner* runner, Module* module, Function* function) { + WASM_UNREACHABLE(); // by default, passes cannot be run this way + } + std::string name; protected: @@ -138,6 +156,11 @@ public: WalkerType::walkModule(module); finalize(runner, module); } + + void runFunction(PassRunner* runner, Module* module, Function* func) override { + WalkerType::setModule(module); + WalkerType::walkFunction(func); + } }; // Standard passes. All passes in /passes/ are runnable from the shell, |