diff options
author | Michael Bebenita <mbebenita@gmail.com> | 2016-01-11 20:51:27 -0800 |
---|---|---|
committer | Michael Bebenita <mbebenita@gmail.com> | 2016-01-13 20:09:10 -0800 |
commit | 7e3bdd00f9b390c36461291fa5b884ace55e82d6 (patch) | |
tree | d282aedbd7d08efdb1383ae22c4b2db6937bc713 /src/pass.h | |
parent | ab3b76b29488ca8f85c39491c5ac96d6274fac7c (diff) | |
download | binaryen-7e3bdd00f9b390c36461291fa5b884ace55e82d6.tar.gz binaryen-7e3bdd00f9b390c36461291fa5b884ace55e82d6.tar.bz2 binaryen-7e3bdd00f9b390c36461291fa5b884ace55e82d6.zip |
A more generic compiler pass system.
Diffstat (limited to 'src/pass.h')
-rw-r--r-- | src/pass.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/pass.h b/src/pass.h index d3f1d9edb..691583f2b 100644 --- a/src/pass.h +++ b/src/pass.h @@ -88,14 +88,24 @@ struct PassRunner { // // Core pass class // -class Pass : public WasmWalker { +class Pass { public: // Override this to perform preparation work before the pass runs virtual void prepare(PassRunner* runner, Module* module) {} + virtual void run(PassRunner* runner, Module* module) { abort(); } + virtual ~Pass() {} +}; - void run(PassRunner* runner, Module* module) { +// +// Core pass class that uses AST walking. This class can be parameterized by +// different types of AST walkers. +// +template <class WalkerType> +class WalkerPass : public Pass, public WalkerType { + public: + void run(PassRunner* runner, Module* module) override { prepare(runner, module); - startWalk(module); + WalkerType::startWalk(module); } }; @@ -104,7 +114,7 @@ class Pass : public WasmWalker { // e.g. through PassRunner::getLast // Handles names in a module, in particular adding names without duplicates -class NameManager : public Pass { +class NameManager : public WalkerPass<WasmWalker> { public: Name getUnique(std::string prefix); // TODO: getUniqueInFunction |