llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
pass_registry.h
1 // This file if part of the llir-opt project.
2 // Licensing information can be found in the LICENSE file.
3 // (C) 2018 Nandor Licker. All rights reserved.
4 
5 #pragma once
6 
7 #include <memory>
8 #include <string>
9 #include <unordered_map>
10 #include <llvm/Support/ErrorHandling.h>
11 #include "core/pass.h"
12 #include "core/pass_manager.h"
13 
14 class PassManager;
15 
16 
17 
21 class PassRegistry {
22 public:
23  ~PassRegistry();
24 
26  template <typename T>
27  void Register()
28  {
29  auto it = registry_.emplace(T::kPassID, nullptr);
30  if (!it.second) {
31  llvm::report_fatal_error("Pass already registered");
32  }
33  it.first->second = std::make_unique<Registrar<T>>();
34  }
35 
37  void Add(PassManager &mngr, const std::string &name) {
38  auto it = registry_.find(name);
39  if (it == registry_.end()) {
40  llvm::report_fatal_error("Pass not found: '" + name + "'");
41  }
42  it->second->Add(mngr);
43  }
44 
45 private:
46  struct RegistrarBase {
47  virtual ~RegistrarBase();
48 
49  virtual void Add(PassManager &mngr) = 0;
50  };
51 
52  template <typename T>
53  struct Registrar : public RegistrarBase {
54  void Add(PassManager &mngr) override {
55  mngr.Add<T>();
56  }
57  };
58 
60  std::unordered_map<std::string, std::unique_ptr<RegistrarBase>> registry_;
61 };
PassManager
Definition: pass_manager.h:74
PassManager::Add
void Add(const Args &... args)
Add an analysis into the pipeline.
Definition: pass_manager.h:87
PassRegistry::Add
void Add(PassManager &mngr, const std::string &name)
Add a pass to the manager.
Definition: pass_registry.h:37
PassRegistry
Definition: pass_registry.h:21
PassRegistry::Register
void Register()
Register a pass with the registry.
Definition: pass_registry.h:27