LLVM 24.0.0git
Context.h
Go to the documentation of this file.
1//===- Context.h ------------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_SANDBOXIR_CONTEXT_H
10#define LLVM_SANDBOXIR_CONTEXT_H
11
12#include "llvm/ADT/DenseMap.h"
13#include "llvm/ADT/MapVector.h"
15#include "llvm/IR/LLVMContext.h"
17#include "llvm/SandboxIR/Type.h"
19
20#include <cstdint>
21
22namespace llvm {
23namespace sandboxir {
24
25class Argument;
26class BBIterator;
27class Constant;
28class Module;
29class Region;
30class Value;
31class Use;
32
34public:
35 // A EraseInstrCallback receives the instruction about to be erased.
36 using EraseInstrCallback = std::function<void(Instruction *)>;
37 // A CreateInstrCallback receives the instruction about to be created.
38 using CreateInstrCallback = std::function<void(Instruction *)>;
39 // A MoveInstrCallback receives the instruction about to be moved, the
40 // destination BB and an iterator pointing to the insertion position.
42 std::function<void(Instruction *, const BBIterator &)>;
43 // A SetUseCallback receives the Use that is about to get its source set.
44 using SetUseCallback = std::function<void(const Use &, Value *)>;
45
46 /// An ID for a registered callback. Used for deregistration. A dedicated type
47 /// is employed so as to keep IDs opaque to the end user; only Context should
48 /// deal with its underlying representation.
49 class CallbackID {
50 public:
51 // Uses a 64-bit integer so we don't have to worry about the unlikely case
52 // of overflowing a 32-bit counter.
53 using ValTy = uint64_t;
54 static constexpr ValTy InvalidVal = 0;
55
56 private:
57 // Default initialization results in an invalid ID.
58 ValTy Val = InvalidVal;
59 explicit CallbackID(ValTy Val) : Val{Val} {
60 assert(Val != InvalidVal && "newly-created ID is invalid!");
61 }
62
63 public:
64 CallbackID() = default;
65 bool operator==(const CallbackID &Other) const { return Val == Other.Val; }
66 friend class Context;
67 friend struct DenseMapInfo<CallbackID>;
68 };
69
70protected:
72 friend class Type; // For LLVMCtx.
73 friend class PointerType; // For LLVMCtx.
74 friend class IntegerType; // For LLVMCtx.
75 friend class ByteType; // For LLVMCtx.
76 friend class StructType; // For LLVMCtx.
77 friend class Region; // For LLVMCtx.
78 friend class IRSnapshotChecker; // To snapshot LLVMModuleToModuleMap.
79
81
82 /// Maps LLVM Value to the corresponding sandboxir::Value. Owns all
83 /// SandboxIR objects.
85
86 /// Maps an LLVM Module to the corresponding sandboxir::Module.
88
89 /// Type has a protected destructor to prohibit the user from managing the
90 /// lifetime of the Type objects. Context is friend of Type, and this custom
91 /// deleter can destroy Type.
92 struct TypeDeleter {
93 void operator()(Type *Ty) { delete Ty; }
94 };
95 /// Maps LLVM Type to the corresonding sandboxir::Type. Owns all Sandbox IR
96 /// Type objects.
98
99 /// Callbacks called when an IR instruction is about to get erased. CallbackID
100 /// is used as an identifier for deregistration.
102 /// Callbacks called when an IR instruction is about to get created.
103 /// CallbackID is used as an identifier for deregistration.
105 /// Callbacks called when an IR instruction is about to get moved. CallbackID
106 /// is used as an identifier for deregistration.
108 /// Callbacks called when a Use gets its source set. CallbackID is used as an
109 /// identifier for deregistration.
111
112 /// A counter used for assigning callback IDs during registration. The same
113 /// counter is used for all kinds of callbacks so we can detect mismatched
114 /// registration/deregistration.
116
117 /// Remove \p V from the maps and returns the unique_ptr.
118 std::unique_ptr<Value> detachLLVMValue(llvm::Value *V);
119 /// Remove \p SBV from all SandboxIR maps and stop owning it. This effectively
120 /// detaches \p V from the underlying IR.
121 std::unique_ptr<Value> detach(Value *V);
122 friend class Instruction; // For detach().
123 /// Take ownership of VPtr and store it in `LLVMValueToValueMap`.
124 Value *registerValue(std::unique_ptr<Value> &&VPtr);
125 friend class EraseFromParent; // For registerValue().
126 /// This is the actual function that creates sandboxir values for \p V,
127 /// and among others handles all instruction types.
129 /// Get or create a sandboxir::Argument for an existing LLVM IR \p LLVMArg.
131 /// Get or create a sandboxir::Value for an existing LLVM IR \p LLVMV.
133 return getOrCreateValueInternal(LLVMV, 0);
134 }
135 /// Get or create a sandboxir::Constant from an existing LLVM IR \p LLVMC.
136 Constant *getOrCreateConstant(llvm::Constant *LLVMC);
137 friend class ConstantDataSequential; // For getOrCreateConstant().
138 friend class Utils; // For getMemoryBase
139
142 void runMoveInstrCallbacks(Instruction *I, const BBIterator &Where);
143 void runSetUseCallbacks(const Use &U, Value *NewSrc);
144
145 friend class User; // For runSetUseCallbacks().
146 friend class Value; // For runSetUseCallbacks().
147
148 // Friends for getOrCreateConstant().
149#define DEF_CONST(ID, CLASS) friend class CLASS;
150#include "llvm/SandboxIR/Values.def"
151
152 /// Create a sandboxir::BasicBlock for an existing LLVM IR \p BB. This will
153 /// also create all contents of the block.
154 BasicBlock *createBasicBlock(llvm::BasicBlock *BB);
155 friend class BasicBlock; // For getOrCreateValue().
156
158 auto &getLLVMIRBuilder() { return LLVMIRBuilder; }
159
160 VAArgInst *createVAArgInst(llvm::VAArgInst *SI);
161 friend VAArgInst; // For createVAArgInst()
163 friend FreezeInst; // For createFreezeInst()
165 friend FenceInst; // For createFenceInst()
167 friend SelectInst; // For createSelectInst()
169 friend InsertElementInst; // For createInsertElementInst()
171 friend ExtractElementInst; // For createExtractElementInst()
173 friend ShuffleVectorInst; // For createShuffleVectorInst()
175 friend ExtractValueInst; // For createExtractValueInst()
177 friend InsertValueInst; // For createInsertValueInst()
179 friend UncondBrInst; // For createUncondBrInst()
181 friend CondBrInst; // For createCondBrInst()
183 friend LoadInst; // For createLoadInst()
185 friend StoreInst; // For createStoreInst()
187 friend ReturnInst; // For createReturnInst()
189 friend CallInst; // For createCallInst()
191 friend InvokeInst; // For createInvokeInst()
193 friend CallBrInst; // For createCallBrInst()
195 friend LandingPadInst; // For createLandingPadInst()
197 friend CatchPadInst; // For createCatchPadInst()
199 friend CleanupPadInst; // For createCleanupPadInst()
201 friend CatchReturnInst; // For createCatchReturnInst()
203 friend CleanupReturnInst; // For createCleanupReturnInst()
205 friend GetElementPtrInst; // For createGetElementPtrInst()
207 friend CatchSwitchInst; // For createCatchSwitchInst()
209 friend ResumeInst; // For createResumeInst()
211 friend SwitchInst; // For createSwitchInst()
213 friend UnaryOperator; // For createUnaryOperator()
215 friend BinaryOperator; // For createBinaryOperator()
217 friend AtomicRMWInst; // For createAtomicRMWInst()
219 friend AtomicCmpXchgInst; // For createAtomicCmpXchgInst()
221 friend AllocaInst; // For createAllocaInst()
223 friend CastInst; // For createCastInst()
225 friend PHINode; // For createPHINode()
227 friend UnreachableInst; // For createUnreachableInst()
229 friend CmpInst; // For createCmpInst()
231 friend ICmpInst; // For createICmpInst()
233 friend FCmpInst; // For createFCmpInst()
234
235public:
237 virtual ~Context();
238 /// Clears function-level state.
239 void clear();
240
242 /// Convenience function for `getTracker().save()`
243 void save() { IRTracker.save(); }
244 /// Convenience function for `getTracker().revert()`
245 void revert(bool RevertAll = false) { IRTracker.revert(RevertAll); }
246 /// Convenience function for `getTracker().accept()`
247 void accept(bool AcceptAll = false) { IRTracker.accept(AcceptAll); }
248
250 const sandboxir::Value *getValue(const llvm::Value *V) const {
251 return getValue(const_cast<llvm::Value *>(V));
252 }
253
254 Module *getModule(llvm::Module *LLVMM) const;
255
256 Module *getOrCreateModule(llvm::Module *LLVMM);
257
259 if (LLVMTy == nullptr)
260 return nullptr;
261 auto Pair = LLVMTypeToTypeMap.try_emplace(LLVMTy);
262 auto It = Pair.first;
263 if (Pair.second)
264 It->second = std::unique_ptr<Type, TypeDeleter>(new Type(LLVMTy, *this));
265 return It->second.get();
266 }
267
268 /// Create a sandboxir::Function for an existing LLVM IR \p F, including all
269 /// blocks and instructions.
270 /// This is the main API function for creating Sandbox IR.
271 /// Note: this will not fully populate its parent module. The only globals
272 /// that will be available are those used within the function.
273 Function *createFunction(llvm::Function *F);
274
275 /// Create a sandboxir::Module corresponding to \p LLVMM.
276 Module *createModule(llvm::Module *LLVMM);
277
278 /// \Returns the number of values registered with Context.
279 size_t getNumValues() const { return LLVMValueToValueMap.size(); }
280
281private:
282 // An arbitrary limit, to check for accidental misuse. We expect a small
283 // number of callbacks to be registered at a time, but we can increase this
284 // number if we discover we needed more.
285 [[maybe_unused]] static constexpr int MaxRegisteredCallbacks = 16;
286
287 template <typename CBT, typename CBVecT>
288 CallbackID registerCallbackCommon(CBT CB, CBVecT &CBVec,
289 std::optional<CallbackID> BeforeID) {
290 assert(CBVec.size() <= MaxRegisteredCallbacks &&
291 "EraseInstrCallbacks size limit exceeded");
292 auto BeforeIt = CBVec.end();
293 if (BeforeID) {
294 BeforeIt = find_if(CBVec, [BeforeID](const auto &Pair) {
295 return Pair.first == *BeforeID;
296 });
297 assert(BeforeIt != CBVec.end() && "Not found!");
298 }
299 CallbackID ID{NextCallbackID++};
300 CBVec.insert(BeforeIt, {ID, std::move(CB)});
301 return ID;
302 }
303
304public:
305 /// Register a callback that gets called when a SandboxIR instruction is about
306 /// to be removed from its parent. Note that this will also be called when
307 /// reverting the creation of an instruction.
308 /// If \p BeforeID is specified, CB will be ordered just before \p BeforeID,
309 /// so it will be called first once the callbacks get executed.
310 /// \Returns a callback ID for later deregistration.
311 CallbackID
312 registerEraseInstrCallback(EraseInstrCallback CB,
313 std::optional<CallbackID> BeforeID = std::nullopt);
314 void unregisterEraseInstrCallback(CallbackID ID);
315
316 /// Register a callback that gets called right after a SandboxIR instruction
317 /// is created. Note that this will also be called when reverting the removal
318 /// of an instruction.
319 /// If \p BeforeID is specified, CB will be ordered just before \p BeforeID,
320 /// so it will be called first once the callbacks get executed.
321 /// \Returns a callback ID for later deregistration.
322 CallbackID registerCreateInstrCallback(
323 CreateInstrCallback CB,
324 std::optional<CallbackID> BeforeID = std::nullopt);
325 void unregisterCreateInstrCallback(CallbackID ID);
326
327 /// Register a callback that gets called when a SandboxIR instruction is about
328 /// to be moved. Note that this will also be called when reverting a move.
329 /// If \p BeforeID is specified, CB will be ordered just before \p BeforeID,
330 /// so it will be called first once the callbacks get executed.
331 /// \Returns a callback ID for later deregistration.
332 CallbackID
333 registerMoveInstrCallback(MoveInstrCallback CB,
334 std::optional<CallbackID> BeforeID = std::nullopt);
335 void unregisterMoveInstrCallback(CallbackID ID);
336
337 /// Register a callback that gets called when a Use gets set.
338 /// If \p BeforeID is specified, CB will be ordered just before \p BeforeID,
339 /// so it will be called first once the callbacks get executed.
340 /// \Returns a callback ID for later deregistration.
341 CallbackID
342 registerSetUseCallback(SetUseCallback CB,
343 std::optional<CallbackID> BeforeID = std::nullopt);
344 void unregisterSetUseCallback(CallbackID ID);
345};
346
347} // namespace sandboxir
348
349// DenseMap info for CallbackIDs
350template <> struct DenseMapInfo<sandboxir::Context::CallbackID> {
353
354 static unsigned getHashValue(const CallbackID &ID) {
355 return ReprInfo::getHashValue(ID.Val);
356 }
357 static bool isEqual(const CallbackID &LHS, const CallbackID &RHS) {
358 return ReprInfo::isEqual(LHS.Val, RHS.Val);
359 }
360};
361
362} // namespace llvm
363
364#endif // LLVM_SANDBOXIR_CONTEXT_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
#define LLVM_ABI
Definition Compiler.h:215
This file defines the DenseMap class.
static constexpr Value * getValue(Ty &ValueOrUse)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file implements a map that provides insertion order iteration.
This file defines the SmallVector class.
Value * RHS
Value * LHS
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
LLVM Basic Block Representation.
Definition BasicBlock.h:62
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
Conditional Branch instruction.
This is an important base class in LLVM.
Definition Constant.h:43
This instruction extracts a single (scalar) element from a VectorType value.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
An instruction for ordering other memory operations.
This class represents a freeze function that returns random concrete value if an operand is either a ...
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2910
This instruction inserts a single (scalar) element into a VectorType value.
This instruction inserts a struct field of array element value into an aggregate value.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Resume the propagation of an exception.
Return a value (possibly void), from a function.
This class represents the LLVM 'select' instruction.
This instruction constructs a fixed permutation of two input vectors.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Multiway switch.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
Unconditional Branch instruction.
This function has undefined behavior.
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM Value Representation.
Definition Value.h:75
Argument of a sandboxir::Function.
Definition Argument.h:18
An ID for a registered callback.
Definition Context.h:49
static constexpr ValTy InvalidVal
Definition Context.h:54
bool operator==(const CallbackID &Other) const
Definition Context.h:65
std::function< void(Instruction *)> CreateInstrCallback
Definition Context.h:38
GetElementPtrInst * createGetElementPtrInst(llvm::GetElementPtrInst *I)
Definition Context.cpp:585
friend class Type
MessagePack types as defined in the standard, with the exception of Integer being divided into a sign...
Definition Context.h:72
friend class EraseFromParent
Definition Context.h:125
CmpInst * createCmpInst(llvm::CmpInst *I)
CallBrInst * createCallBrInst(llvm::CallBrInst *I)
Definition Context.cpp:552
SmallVector< std::pair< CallbackID, EraseInstrCallback > > EraseInstrCallbacks
Callbacks called when an IR instruction is about to get erased.
Definition Context.h:101
IRBuilder< ConstantFolder > LLVMIRBuilder
Definition Context.h:157
std::function< void(const Use &, Value *)> SetUseCallback
Definition Context.h:44
Argument * getOrCreateArgument(llvm::Argument *LLVMArg)
Get or create a sandboxir::Argument for an existing LLVM IR LLVMArg.
Definition Context.cpp:441
void revert(bool RevertAll=false)
Convenience function for getTracker().revert()
Definition Context.h:245
friend class IRSnapshotChecker
Definition Context.h:78
SmallVector< std::pair< CallbackID, SetUseCallback > > SetUseCallbacks
Callbacks called when a Use gets its source set.
Definition Context.h:110
ReturnInst * createReturnInst(llvm::ReturnInst *I)
Definition Context.cpp:537
UncondBrInst * createUncondBrInst(llvm::UncondBrInst *UBI)
Definition Context.cpp:517
void runEraseInstrCallbacks(Instruction *I)
Definition Context.cpp:714
CleanupReturnInst * createCleanupReturnInst(llvm::CleanupReturnInst *I)
Definition Context.cpp:579
SmallVector< std::pair< CallbackID, CreateInstrCallback > > CreateInstrCallbacks
Callbacks called when an IR instruction is about to get created.
Definition Context.h:104
void accept(bool AcceptAll=false)
Convenience function for getTracker().accept()
Definition Context.h:247
AllocaInst * createAllocaInst(llvm::AllocaInst *I)
Definition Context.cpp:620
SmallVector< std::pair< CallbackID, MoveInstrCallback > > MoveInstrCallbacks
Callbacks called when an IR instruction is about to get moved.
Definition Context.h:107
Type * getType(llvm::Type *LLVMTy)
Definition Context.h:258
void runCreateInstrCallbacks(Instruction *I)
Definition Context.cpp:719
AtomicRMWInst * createAtomicRMWInst(llvm::AtomicRMWInst *I)
Definition Context.cpp:610
InsertValueInst * createInsertValueInst(llvm::InsertValueInst *IVI)
Definition Context.cpp:511
const sandboxir::Value * getValue(const llvm::Value *V) const
Definition Context.h:250
DenseMap< llvm::Type *, std::unique_ptr< Type, TypeDeleter > > LLVMTypeToTypeMap
Maps LLVM Type to the corresonding sandboxir::Type.
Definition Context.h:97
FCmpInst * createFCmpInst(llvm::FCmpInst *I)
Definition Context.cpp:636
std::function< void(Instruction *)> EraseInstrCallback
Definition Context.h:36
friend class ConstantDataSequential
Definition Context.h:137
CallbackID::ValTy NextCallbackID
A counter used for assigning callback IDs during registration.
Definition Context.h:115
ExtractElementInst * createExtractElementInst(llvm::ExtractElementInst *EEI)
Definition Context.cpp:485
ShuffleVectorInst * createShuffleVectorInst(llvm::ShuffleVectorInst *SVI)
Definition Context.cpp:499
BinaryOperator * createBinaryOperator(llvm::BinaryOperator *I)
Definition Context.cpp:606
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition Context.h:122
LoadInst * createLoadInst(llvm::LoadInst *LI)
Definition Context.cpp:527
DenseMap< llvm::Value *, std::unique_ptr< Value > > LLVMValueToValueMap
Maps LLVM Value to the corresponding sandboxir::Value.
Definition Context.h:84
FreezeInst * createFreezeInst(llvm::FreezeInst *SI)
Definition Context.cpp:469
PHINode * createPHINode(llvm::PHINode *I)
Definition Context.cpp:628
Context(LLVMContext &LLVMCtx)
Definition Context.cpp:647
CatchPadInst * createCatchPadInst(llvm::CatchPadInst *I)
Definition Context.cpp:566
void clear()
Clears function-level state.
Definition Context.cpp:653
CondBrInst * createCondBrInst(llvm::CondBrInst *CBI)
Definition Context.cpp:522
friend class IntegerType
Definition Context.h:74
ICmpInst * createICmpInst(llvm::ICmpInst *I)
Definition Context.cpp:632
friend class Region
Definition Context.h:77
std::unique_ptr< Value > detach(Value *V)
Remove SBV from all SandboxIR maps and stop owning it.
Definition Context.cpp:28
ExtractValueInst * createExtractValueInst(llvm::ExtractValueInst *IVI)
Definition Context.cpp:505
CastInst * createCastInst(llvm::CastInst *I)
Definition Context.cpp:624
DenseMap< llvm::Module *, std::unique_ptr< Module > > LLVMModuleToModuleMap
Maps an LLVM Module to the corresponding sandboxir::Module.
Definition Context.h:87
friend class PointerType
Definition Context.h:73
StoreInst * createStoreInst(llvm::StoreInst *SI)
Definition Context.cpp:532
CatchReturnInst * createCatchReturnInst(llvm::CatchReturnInst *I)
Definition Context.cpp:574
CatchSwitchInst * createCatchSwitchInst(llvm::CatchSwitchInst *I)
Definition Context.cpp:590
std::function< void(Instruction *, const BBIterator &)> MoveInstrCallback
Definition Context.h:41
void save()
Convenience function for getTracker().save()
Definition Context.h:243
CleanupPadInst * createCleanupPadInst(llvm::CleanupPadInst *I)
Definition Context.cpp:570
Value * getOrCreateValue(llvm::Value *LLVMV)
Get or create a sandboxir::Value for an existing LLVM IR LLVMV.
Definition Context.h:132
FenceInst * createFenceInst(llvm::FenceInst *SI)
Definition Context.cpp:474
CallInst * createCallInst(llvm::CallInst *I)
Definition Context.cpp:542
SwitchInst * createSwitchInst(llvm::SwitchInst *I)
Definition Context.cpp:598
void runMoveInstrCallbacks(Instruction *I, const BBIterator &Where)
Definition Context.cpp:724
UnaryOperator * createUnaryOperator(llvm::UnaryOperator *I)
Definition Context.cpp:602
Value * getOrCreateValueInternal(llvm::Value *V, llvm::User *U=nullptr)
This is the actual function that creates sandboxir values for V, and among others handles all instruc...
Definition Context.cpp:56
InvokeInst * createInvokeInst(llvm::InvokeInst *I)
Definition Context.cpp:547
Value * registerValue(std::unique_ptr< Value > &&VPtr)
Take ownership of VPtr and store it in LLVMValueToValueMap.
Definition Context.cpp:35
LandingPadInst * createLandingPadInst(llvm::LandingPadInst *I)
Definition Context.cpp:562
InsertElementInst * createInsertElementInst(llvm::InsertElementInst *IEI)
Definition Context.cpp:492
friend class StructType
Definition Context.h:76
SelectInst * createSelectInst(llvm::SelectInst *SI)
Definition Context.cpp:479
friend class ByteType
Definition Context.h:75
ResumeInst * createResumeInst(llvm::ResumeInst *I)
Definition Context.cpp:594
LLVMContext & LLVMCtx
Definition Context.h:71
Tracker & getTracker()
Definition Context.h:241
friend class BasicBlock
Various leaf nodes.
Definition Context.h:155
UnreachableInst * createUnreachableInst(llvm::UnreachableInst *UI)
Definition Context.cpp:557
AtomicCmpXchgInst * createAtomicCmpXchgInst(llvm::AtomicCmpXchgInst *I)
Definition Context.cpp:615
void runSetUseCallbacks(const Use &U, Value *NewSrc)
Definition Context.cpp:729
size_t getNumValues() const
\Returns the number of values registered with Context.
Definition Context.h:279
std::unique_ptr< Value > detachLLVMValue(llvm::Value *V)
Remove V from the maps and returns the unique_ptr.
Definition Context.cpp:17
In SandboxIR the Module is mainly used to access the list of global objects.
Definition Module.h:32
The tracker collects all the change objects and implements the main API for saving / reverting / acce...
Definition Tracker.h:450
Represents a Def-use/Use-def edge in SandboxIR.
Definition Use.h:43
A SandboxIR Value has users. This is the base class.
Definition Value.h:72
This is an optimization pass for GlobalISel generic memory operations.
@ Other
Any other memory.
Definition ModRef.h:68
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1772
static unsigned getHashValue(const CallbackID &ID)
Definition Context.h:354
DenseMapInfo< CallbackID::ValTy > ReprInfo
Definition Context.h:352
sandboxir::Context::CallbackID CallbackID
Definition Context.h:351
static bool isEqual(const CallbackID &LHS, const CallbackID &RHS)
Definition Context.h:357
An information struct used to provide DenseMap with the various necessary components for a given valu...
Type has a protected destructor to prohibit the user from managing the lifetime of the Type objects.
Definition Context.h:92