summaryrefslogtreecommitdiff
path: root/src/pass.h
diff options
context:
space:
mode:
authorMichael Bebenita <mbebenita@gmail.com>2016-01-11 20:51:27 -0800
committerMichael Bebenita <mbebenita@gmail.com>2016-01-13 20:09:10 -0800
commit7e3bdd00f9b390c36461291fa5b884ace55e82d6 (patch)
treed282aedbd7d08efdb1383ae22c4b2db6937bc713 /src/pass.h
parentab3b76b29488ca8f85c39491c5ac96d6274fac7c (diff)
downloadbinaryen-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.h18
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