aboutsummaryrefslogtreecommitdiff
path: root/backend/include/rcc/CodeGen/GlobalISel/GISelChangeObserver.h
blob: 9538f207de7d9759b6412c39817c44e605a210a0 (plain)
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef RCC_CODEGEN_GLOBALISEL_GISELCHANGEOBSERVER_H
#define RCC_CODEGEN_GLOBALISEL_GISELCHANGEOBSERVER_H

#include "rcc/CodeGen/MachineFunction.h"

#include <span>
#include <vector>

namespace rcc {

class MachineInstr;

class GISelChangeObserver {
public:
  virtual ~GISelChangeObserver() = default;

  virtual void erasingInstr(MachineInstr &Instruction) = 0;
  virtual void createdInstr(MachineInstr &Instruction) = 0;
  virtual void changingInstr(MachineInstr &Instruction) = 0;
  virtual void changedInstr(MachineInstr &Instruction) = 0;
};

class GISelObserverWrapper final : public MachineFunction::Delegate,
                                   public GISelChangeObserver {
public:
  GISelObserverWrapper() = default;
  explicit GISelObserverWrapper(GISelChangeObserver &Observer) {
    Observers.push_back(&Observer);
  }
  explicit GISelObserverWrapper(std::span<GISelChangeObserver *const> InitialObservers)
      : Observers(InitialObservers.begin(), InitialObservers.end()) {}

  void addObserver(GISelChangeObserver &Observer);
  void removeObserver(GISelChangeObserver &Observer);
  void clearObservers() noexcept;

  void erasingInstr(MachineInstr &Instruction) override;
  void createdInstr(MachineInstr &Instruction) override;
  void changingInstr(MachineInstr &Instruction) override;
  void changedInstr(MachineInstr &Instruction) override;

  void handleInsertion(MachineInstr &Instruction) override;
  void handleRemoval(MachineInstr &Instruction) override;

private:
  std::vector<GISelChangeObserver *> Observers;
};

class MachineFunctionDelegateInstaller final {
public:
  MachineFunctionDelegateInstaller(MachineFunction &Function,
                                   MachineFunction::Delegate &Delegate);
  MachineFunctionDelegateInstaller(const MachineFunctionDelegateInstaller &) = delete;
  MachineFunctionDelegateInstaller &operator=(const MachineFunctionDelegateInstaller &) = delete;
  ~MachineFunctionDelegateInstaller();

private:
  MachineFunction *Function;
  MachineFunction::Delegate *Delegate;
};

} // namespace rcc

#endif // RCC_CODEGEN_GLOBALISEL_GISELCHANGEOBSERVER_H