LLVM 23.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 friend class Context;
66 friend struct DenseMapInfo<CallbackID>;
67 };
68
69protected:
71 friend class Type; // For LLVMCtx.
72 friend class PointerType; // For LLVMCtx.
73 friend class IntegerType; // For LLVMCtx.
74 friend class ByteType; // For LLVMCtx.
75 friend class StructType; // For LLVMCtx.
76 friend class Region; // For LLVMCtx.
77 friend class IRSnapshotChecker; // To snapshot LLVMModuleToModuleMap.
78
80
81 /// Maps LLVM Value to the corresponding sandboxir::Value. Owns all
82 /// SandboxIR objects.
84
85 /// Maps an LLVM Module to the corresponding sandboxir::Module.
87
88 /// Type has a protected destructor to prohibit the user from managing the
89 /// lifetime of the Type objects. Context is friend of Type, and this custom
90 /// deleter can destroy Type.
91 struct TypeDeleter {
92 void operator()(Type *Ty) { delete Ty; }
93 };
94 /// Maps LLVM Type to the corresonding sandboxir::Type. Owns all Sandbox IR
95 /// Type objects.
97
98 /// Callbacks called when an IR instruction is about to get erased. Keys are
99 /// used as IDs for deregistration.
101 /// Callbacks called when an IR instruction is about to get created. Keys are
102 /// used as IDs for deregistration.
104 /// Callbacks called when an IR instruction is about to get moved. Keys are
105 /// used as IDs for deregistration.
107 /// Callbacks called when a Use gets its source set. Keys are used as IDs for
108 /// deregistration.
110
111 /// A counter used for assigning callback IDs during registration. The same
112 /// counter is used for all kinds of callbacks so we can detect mismatched
113 /// registration/deregistration.
115
116 /// Remove \p V from the maps and returns the unique_ptr.
117 std::unique_ptr<Value> detachLLVMValue(llvm::Value *V);
118 /// Remove \p SBV from all SandboxIR maps and stop owning it. This effectively
119 /// detaches \p V from the underlying IR.
120 std::unique_ptr<Value> detach(Value *V);
121 friend class Instruction; // For detach().
122 /// Take ownership of VPtr and store it in `LLVMValueToValueMap`.
123 Value *registerValue(std::unique_ptr<Value> &&VPtr);
124 friend class EraseFromParent; // For registerValue().
125 /// This is the actual function that creates sandboxir values for \p V,
126 /// and among others handles all instruction types.
128 /// Get or create a sandboxir::Argument for an existing LLVM IR \p LLVMArg.
130 /// Get or create a sandboxir::Value for an existing LLVM IR \p LLVMV.
132 return getOrCreateValueInternal(LLVMV, 0);
133 }
134 /// Get or create a sandboxir::Constant from an existing LLVM IR \p LLVMC.
135 Constant *getOrCreateConstant(llvm::Constant *LLVMC);
136 friend class ConstantDataSequential; // For getOrCreateConstant().
137 friend class Utils; // For getMemoryBase
138
141 void runMoveInstrCallbacks(Instruction *I, const BBIterator &Where);
142 void runSetUseCallbacks(const Use &U, Value *NewSrc);
143
144 friend class User; // For runSetUseCallbacks().
145 friend class Value; // For runSetUseCallbacks().
146
147 // Friends for getOrCreateConstant().
148#define DEF_CONST(ID, CLASS) friend class CLASS;
149#include "llvm/SandboxIR/Values.def"
150
151 /// Create a sandboxir::BasicBlock for an existing LLVM IR \p BB. This will
152 /// also create all contents of the block.
153 BasicBlock *createBasicBlock(llvm::BasicBlock *BB);
154 friend class BasicBlock; // For getOrCreateValue().
155
157 auto &getLLVMIRBuilder() { return LLVMIRBuilder; }
158
159 VAArgInst *createVAArgInst(llvm::VAArgInst *SI);
160 friend VAArgInst; // For createVAArgInst()
162 friend FreezeInst; // For createFreezeInst()
164 friend FenceInst; // For createFenceInst()
166 friend SelectInst; // For createSelectInst()
168 friend InsertElementInst; // For createInsertElementInst()
170 friend ExtractElementInst; // For createExtractElementInst()
172 friend ShuffleVectorInst; // For createShuffleVectorInst()
174 friend ExtractValueInst; // For createExtractValueInst()
176 friend InsertValueInst; // For createInsertValueInst()
178 friend UncondBrInst; // For createUncondBrInst()
180 friend CondBrInst; // For createCondBrInst()
182 friend LoadInst; // For createLoadInst()
184 friend StoreInst; // For createStoreInst()
186 friend ReturnInst; // For createReturnInst()
188 friend CallInst; // For createCallInst()
190 friend InvokeInst; // For createInvokeInst()
192 friend CallBrInst; // For createCallBrInst()
194 friend LandingPadInst; // For createLandingPadInst()
196 friend CatchPadInst; // For createCatchPadInst()
198 friend CleanupPadInst; // For createCleanupPadInst()
200 friend CatchReturnInst; // For createCatchReturnInst()
202 friend CleanupReturnInst; // For createCleanupReturnInst()
204 friend GetElementPtrInst; // For createGetElementPtrInst()
206 friend CatchSwitchInst; // For createCatchSwitchInst()
208 friend ResumeInst; // For createResumeInst()
210 friend SwitchInst; // For createSwitchInst()
212 friend UnaryOperator; // For createUnaryOperator()
214 friend BinaryOperator; // For createBinaryOperator()
216 friend AtomicRMWInst; // For createAtomicRMWInst()
218 friend AtomicCmpXchgInst; // For createAtomicCmpXchgInst()
220 friend AllocaInst; // For createAllocaInst()
222 friend CastInst; // For createCastInst()
224 friend PHINode; // For createPHINode()
226 friend UnreachableInst; // For createUnreachableInst()
228 friend CmpInst; // For createCmpInst()
230 friend ICmpInst; // For createICmpInst()
232 friend FCmpInst; // For createFCmpInst()
233
234public:
236 virtual ~Context();
237 /// Clears function-level state.
238 void clear();
239
241 /// Convenience function for `getTracker().save()`
242 void save() { IRTracker.save(); }
243 /// Convenience function for `getTracker().revert()`
244 void revert(bool RevertAll = false) { IRTracker.revert(RevertAll); }
245 /// Convenience function for `getTracker().accept()`
246 void accept(bool AcceptAll = false) { IRTracker.accept(AcceptAll); }
247
249 const sandboxir::Value *getValue(const llvm::Value *V) const {
250 return getValue(const_cast<llvm::Value *>(V));
251 }
252
253 Module *getModule(llvm::Module *LLVMM) const;
254
255 Module *getOrCreateModule(llvm::Module *LLVMM);
256
258 if (LLVMTy == nullptr)
259 return nullptr;
260 auto Pair = LLVMTypeToTypeMap.try_emplace(LLVMTy);
261 auto It = Pair.first;
262 if (Pair.second)
263 It->second = std::unique_ptr<Type, TypeDeleter>(new Type(LLVMTy, *this));
264 return It->second.get();
265 }
266
267 /// Create a sandboxir::Function for an existing LLVM IR \p F, including all
268 /// blocks and instructions.
269 /// This is the main API function for creating Sandbox IR.
270 /// Note: this will not fully populate its parent module. The only globals
271 /// that will be available are those used within the function.
272 Function *createFunction(llvm::Function *F);
273
274 /// Create a sandboxir::Module corresponding to \p LLVMM.
275 Module *createModule(llvm::Module *LLVMM);
276
277 /// \Returns the number of values registered with Context.
278 size_t getNumValues() const { return LLVMValueToValueMap.size(); }
279
280 /// Register a callback that gets called when a SandboxIR instruction is about
281 /// to be removed from its parent. Note that this will also be called when
282 /// reverting the creation of an instruction.
283 /// \Returns a callback ID for later deregistration.
284 CallbackID registerEraseInstrCallback(EraseInstrCallback CB);
285 void unregisterEraseInstrCallback(CallbackID ID);
286
287 /// Register a callback that gets called right after a SandboxIR instruction
288 /// is created. Note that this will also be called when reverting the removal
289 /// of an instruction.
290 /// \Returns a callback ID for later deregistration.
291 CallbackID registerCreateInstrCallback(CreateInstrCallback CB);
292 void unregisterCreateInstrCallback(CallbackID ID);
293
294 /// Register a callback that gets called when a SandboxIR instruction is about
295 /// to be moved. Note that this will also be called when reverting a move.
296 /// \Returns a callback ID for later deregistration.
297 CallbackID registerMoveInstrCallback(MoveInstrCallback CB);
298 void unregisterMoveInstrCallback(CallbackID ID);
299
300 /// Register a callback that gets called when a Use gets set.
301 /// \Returns a callback ID for later deregistration.
302 CallbackID registerSetUseCallback(SetUseCallback CB);
303 void unregisterSetUseCallback(CallbackID ID);
304};
305
306} // namespace sandboxir
307
308// DenseMap info for CallbackIDs
309template <> struct DenseMapInfo<sandboxir::Context::CallbackID> {
312
313 static unsigned getHashValue(const CallbackID &ID) {
314 return ReprInfo::getHashValue(ID.Val);
315 }
316 static bool isEqual(const CallbackID &LHS, const CallbackID &RHS) {
317 return ReprInfo::isEqual(LHS.Val, RHS.Val);
318 }
319};
320
321} // namespace llvm
322
323#endif // LLVM_SANDBOXIR_CONTEXT_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI
Definition Compiler.h:213
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:2868
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.
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
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.
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
std::function< void(Instruction *)> CreateInstrCallback
Definition Context.h:38
GetElementPtrInst * createGetElementPtrInst(llvm::GetElementPtrInst *I)
Definition Context.cpp:585
MapVector< CallbackID, CreateInstrCallback > CreateInstrCallbacks
Callbacks called when an IR instruction is about to get created.
Definition Context.h:103
friend class Type
MessagePack types as defined in the standard, with the exception of Integer being divided into a sign...
Definition Context.h:71
friend class EraseFromParent
Definition Context.h:124
CmpInst * createCmpInst(llvm::CmpInst *I)
CallBrInst * createCallBrInst(llvm::CallBrInst *I)
Definition Context.cpp:552
IRBuilder< ConstantFolder > LLVMIRBuilder
Definition Context.h:156
std::function< void(const Use &, Value *)> SetUseCallback
Definition Context.h:44
MapVector< CallbackID, EraseInstrCallback > EraseInstrCallbacks
Callbacks called when an IR instruction is about to get erased.
Definition Context.h:100
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:244
friend class IRSnapshotChecker
Definition Context.h:77
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
void accept(bool AcceptAll=false)
Convenience function for getTracker().accept()
Definition Context.h:246
AllocaInst * createAllocaInst(llvm::AllocaInst *I)
Definition Context.cpp:620
Type * getType(llvm::Type *LLVMTy)
Definition Context.h:257
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:249
DenseMap< llvm::Type *, std::unique_ptr< Type, TypeDeleter > > LLVMTypeToTypeMap
Maps LLVM Type to the corresonding sandboxir::Type.
Definition Context.h:96
FCmpInst * createFCmpInst(llvm::FCmpInst *I)
Definition Context.cpp:636
std::function< void(Instruction *)> EraseInstrCallback
Definition Context.h:36
friend class ConstantDataSequential
Definition Context.h:136
CallbackID::ValTy NextCallbackID
A counter used for assigning callback IDs during registration.
Definition Context.h:114
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:121
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:83
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:73
ICmpInst * createICmpInst(llvm::ICmpInst *I)
Definition Context.cpp:632
friend class Region
Definition Context.h:76
MapVector< CallbackID, MoveInstrCallback > MoveInstrCallbacks
Callbacks called when an IR instruction is about to get moved.
Definition Context.h:106
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:86
friend class PointerType
Definition Context.h:72
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:242
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:131
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:75
SelectInst * createSelectInst(llvm::SelectInst *SI)
Definition Context.cpp:479
friend class ByteType
Definition Context.h:74
ResumeInst * createResumeInst(llvm::ResumeInst *I)
Definition Context.cpp:594
LLVMContext & LLVMCtx
Definition Context.h:70
MapVector< CallbackID, SetUseCallback > SetUseCallbacks
Callbacks called when a Use gets its source set.
Definition Context.h:109
Tracker & getTracker()
Definition Context.h:240
friend class BasicBlock
Various leaf nodes.
Definition Context.h:154
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:278
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
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
static unsigned getHashValue(const CallbackID &ID)
Definition Context.h:313
DenseMapInfo< CallbackID::ValTy > ReprInfo
Definition Context.h:311
sandboxir::Context::CallbackID CallbackID
Definition Context.h:310
static bool isEqual(const CallbackID &LHS, const CallbackID &RHS)
Definition Context.h:316
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:91