File indexing completed on 2026-05-10 08:43:24
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_CODEGEN_GLOBALISEL_GISELCHANGEOBSERVER_H
0015 #define LLVM_CODEGEN_GLOBALISEL_GISELCHANGEOBSERVER_H
0016
0017 #include "llvm/ADT/SmallPtrSet.h"
0018 #include "llvm/CodeGen/MachineFunction.h"
0019
0020 namespace llvm {
0021 class MachineInstr;
0022 class MachineRegisterInfo;
0023
0024
0025
0026
0027
0028
0029 class GISelChangeObserver {
0030 SmallPtrSet<MachineInstr *, 4> ChangingAllUsesOfReg;
0031
0032 public:
0033 virtual ~GISelChangeObserver() = default;
0034
0035
0036 virtual void erasingInstr(MachineInstr &MI) = 0;
0037
0038
0039
0040
0041
0042
0043 virtual void createdInstr(MachineInstr &MI) = 0;
0044
0045
0046 virtual void changingInstr(MachineInstr &MI) = 0;
0047
0048
0049 virtual void changedInstr(MachineInstr &MI) = 0;
0050
0051
0052
0053
0054
0055 void changingAllUsesOfReg(const MachineRegisterInfo &MRI, Register Reg);
0056
0057
0058 void finishedChangingAllUsesOfReg();
0059
0060 };
0061
0062
0063
0064
0065
0066 class GISelObserverWrapper : public MachineFunction::Delegate,
0067 public GISelChangeObserver {
0068 SmallVector<GISelChangeObserver *, 4> Observers;
0069
0070 public:
0071 GISelObserverWrapper() = default;
0072 GISelObserverWrapper(ArrayRef<GISelChangeObserver *> Obs) : Observers(Obs) {}
0073
0074 void addObserver(GISelChangeObserver *O) { Observers.push_back(O); }
0075
0076
0077 void removeObserver(GISelChangeObserver *O) {
0078 auto It = llvm::find(Observers, O);
0079 if (It != Observers.end())
0080 Observers.erase(It);
0081 }
0082
0083 void clearObservers() { Observers.clear(); }
0084
0085
0086 void erasingInstr(MachineInstr &MI) override {
0087 for (auto &O : Observers)
0088 O->erasingInstr(MI);
0089 }
0090 void createdInstr(MachineInstr &MI) override {
0091 for (auto &O : Observers)
0092 O->createdInstr(MI);
0093 }
0094 void changingInstr(MachineInstr &MI) override {
0095 for (auto &O : Observers)
0096 O->changingInstr(MI);
0097 }
0098 void changedInstr(MachineInstr &MI) override {
0099 for (auto &O : Observers)
0100 O->changedInstr(MI);
0101 }
0102
0103 void MF_HandleInsertion(MachineInstr &MI) override { createdInstr(MI); }
0104 void MF_HandleRemoval(MachineInstr &MI) override { erasingInstr(MI); }
0105 };
0106
0107
0108
0109
0110 class RAIIDelegateInstaller {
0111 MachineFunction &MF;
0112 MachineFunction::Delegate *Delegate;
0113
0114 public:
0115 RAIIDelegateInstaller(MachineFunction &MF, MachineFunction::Delegate *Del);
0116 ~RAIIDelegateInstaller();
0117 };
0118
0119
0120
0121
0122 class RAIIMFObserverInstaller {
0123 MachineFunction &MF;
0124
0125 public:
0126 RAIIMFObserverInstaller(MachineFunction &MF, GISelChangeObserver &Observer);
0127 ~RAIIMFObserverInstaller();
0128 };
0129
0130
0131 class RAIIMFObsDelInstaller {
0132 RAIIDelegateInstaller DelI;
0133 RAIIMFObserverInstaller ObsI;
0134
0135 public:
0136 RAIIMFObsDelInstaller(MachineFunction &MF, GISelObserverWrapper &Wrapper)
0137 : DelI(MF, &Wrapper), ObsI(MF, Wrapper) {}
0138 ~RAIIMFObsDelInstaller() = default;
0139 };
0140
0141
0142
0143
0144 class RAIITemporaryObserverInstaller {
0145 public:
0146 RAIITemporaryObserverInstaller(GISelObserverWrapper &Observers,
0147 GISelChangeObserver &TemporaryObserver);
0148 ~RAIITemporaryObserverInstaller();
0149
0150 private:
0151 GISelObserverWrapper &Observers;
0152 GISelChangeObserver &TemporaryObserver;
0153 };
0154
0155 }
0156 #endif