//===- Tracker.h ------------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is the component of SandboxIR that tracks all changes made to its // state, such that we can revert the state when needed. // // Tracking changes // ---------------- // The user needs to call `Tracker::save()` to enable tracking changes // made to SandboxIR. From that point on, any change made to SandboxIR, will // automatically create a change tracking object and register it with the // tracker. IR-change objects are subclasses of `IRChangeBase` and get // registered with the `Tracker::track()` function. The change objects // are saved in the order they are registered with the tracker and are stored in // the `Tracker::Changes` vector. All of this is done transparently to // the user. // // Reverting changes // ----------------- // Calling `Tracker::revert()` will restore the state saved when // `Tracker::save()` was called. Internally this goes through the // change objects in `Tracker::Changes` in reverse order, calling their // `IRChangeBase::revert()` function one by one. // // Accepting changes // ----------------- // The user needs to either revert or accept changes before the tracker object // is destroyed. This is enforced in the tracker's destructor. // This is the job of `Tracker::accept()`. Internally this will go // through the change objects in `Tracker::Changes` in order, calling // `IRChangeBase::accept()`. // //===----------------------------------------------------------------------===// #ifndef LLVM_SANDBOXIR_TRACKER_H #define LLVM_SANDBOXIR_TRACKER_H #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/SmallVector.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/Instruction.h" #include "llvm/IR/Module.h" #include "llvm/SandboxIR/Use.h" #include "llvm/Support/Debug.h" #include <memory> #include <regex> namespace llvm::sandboxir { class BasicBlock; class CallBrInst; class LoadInst; class StoreInst; class Instruction; class Tracker; class AllocaInst; class CatchSwitchInst; class SwitchInst; class ConstantInt; class ShuffleVectorInst; class CmpInst; /// The base class for IR Change classes. class IRChangeBase { … }; /// Tracks the change of the source Value of a sandboxir::Use. class UseSet : public IRChangeBase { … }; class PHIRemoveIncoming : public IRChangeBase { … }; class PHIAddIncoming : public IRChangeBase { … }; class CmpSwapOperands : public IRChangeBase { … }; /// Tracks swapping a Use with another Use. class UseSwap : public IRChangeBase { … }; class EraseFromParent : public IRChangeBase { … }; class RemoveFromParent : public IRChangeBase { … }; /// This class can be used for tracking most instruction setters. /// The two template arguments are: /// - GetterFn: The getter member function pointer (e.g., `&Foo::get`) /// - SetterFn: The setter member function pointer (e.g., `&Foo::set`) /// Upon construction, it saves a copy of the original value by calling the /// getter function. Revert sets the value back to the one saved, using the /// setter function provided. /// /// Example: /// Tracker.track(std::make_unique< /// GenericSetter<&FooInst::get, &FooInst::set>>(I, Tracker)); /// template <auto GetterFn, auto SetterFn> class GenericSetter final : public IRChangeBase { … }; /// Similar to GenericSetter but the setters/getters have an index as their /// first argument. This is commont in cases like: getOperand(unsigned Idx) template <auto GetterFn, auto SetterFn> class GenericSetterWithIdx final : public IRChangeBase { … }; class CatchSwitchAddHandler : public IRChangeBase { … }; class SwitchAddCase : public IRChangeBase { … }; class SwitchRemoveCase : public IRChangeBase { … }; class MoveInstr : public IRChangeBase { … }; class InsertIntoBB final : public IRChangeBase { … }; class CreateAndInsertInst final : public IRChangeBase { … }; class ShuffleVectorSetMask final : public IRChangeBase { … }; /// The tracker collects all the change objects and implements the main API for /// saving / reverting / accepting. class Tracker { … }; } // namespace llvm::sandboxir #endif // LLVM_SANDBOXIR_TRACKER_H