PassManager.hpp 635 Bytes
Newer Older
刘睿博's avatar
刘睿博 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#pragma once

#include "Module.hpp"

#include <memory>
#include <vector>

class Pass {
  public:
    Pass(Module *m) : m_(m) {}
    virtual ~Pass() = default;
    virtual void run() = 0;

  protected:
    Module *m_;
};

class PassManager {
  public:
    PassManager(Module *m) : m_(m) {}

    template <typename PassType, typename... Args>
    void add_pass(Args &&...args) {
        passes_.emplace_back(new PassType(m_, std::forward<Args>(args)...));
    }

    void run() {
        for (auto &pass : passes_) {
            pass->run();
        }
    }

  private:
    std::vector<std::unique_ptr<Pass>> passes_;
    Module *m_;
};