9#ifndef LLVM_SANDBOXIR_CONTEXT_H
10#define LLVM_SANDBOXIR_CONTEXT_H
42 std::function<void(
Instruction *,
const BBIterator &)>;
59 explicit CallbackID(
ValTy Val) : Val{Val} {
149#define DEF_CONST(ID, CLASS) friend class CLASS;
150#include "llvm/SandboxIR/Values.def"
259 if (LLVMTy ==
nullptr)
262 auto It = Pair.first;
264 It->second = std::unique_ptr<Type, TypeDeleter>(
new Type(LLVMTy, *
this));
265 return It->second.get();
285 [[maybe_unused]]
static constexpr int MaxRegisteredCallbacks = 16;
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();
294 BeforeIt =
find_if(CBVec, [BeforeID](
const auto &Pair) {
295 return Pair.first == *BeforeID;
297 assert(BeforeIt != CBVec.end() &&
"Not found!");
299 CallbackID ID{NextCallbackID++};
300 CBVec.insert(BeforeIt, {
ID, std::move(CB)});
312 registerEraseInstrCallback(EraseInstrCallback CB,
313 std::optional<CallbackID> BeforeID = std::nullopt);
314 void unregisterEraseInstrCallback(CallbackID ID);
322 CallbackID registerCreateInstrCallback(
323 CreateInstrCallback CB,
324 std::optional<CallbackID> BeforeID = std::nullopt);
325 void unregisterCreateInstrCallback(CallbackID ID);
333 registerMoveInstrCallback(MoveInstrCallback CB,
334 std::optional<CallbackID> BeforeID = std::nullopt);
335 void unregisterMoveInstrCallback(CallbackID ID);
342 registerSetUseCallback(SetUseCallback CB,
343 std::optional<CallbackID> BeforeID = std::nullopt);
344 void unregisterSetUseCallback(CallbackID ID);
355 return ReprInfo::getHashValue(ID.Val);
358 return ReprInfo::isEqual(
LHS.Val,
RHS.Val);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the DenseMap class.
static constexpr Value * getValue(Ty &ValueOrUse)
This file implements a map that provides insertion order iteration.
This file defines the SmallVector class.
an instruction to allocate memory on the stack
This class represents an incoming formal argument to a Function.
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.
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.
This class is the base class for the comparison instructions.
Conditional Branch instruction.
This is an important base class in LLVM.
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...
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.
This is an important class for using LLVM in a threaded context.
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.
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.
The instances of the Type class are immutable: once they are created, they are never changed.
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.
Argument of a sandboxir::Function.
An ID for a registered callback.
static constexpr ValTy InvalidVal
bool operator==(const CallbackID &Other) const
std::function< void(Instruction *)> CreateInstrCallback
GetElementPtrInst * createGetElementPtrInst(llvm::GetElementPtrInst *I)
friend class Type
MessagePack types as defined in the standard, with the exception of Integer being divided into a sign...
friend class EraseFromParent
CmpInst * createCmpInst(llvm::CmpInst *I)
CallBrInst * createCallBrInst(llvm::CallBrInst *I)
SmallVector< std::pair< CallbackID, EraseInstrCallback > > EraseInstrCallbacks
Callbacks called when an IR instruction is about to get erased.
IRBuilder< ConstantFolder > LLVMIRBuilder
std::function< void(const Use &, Value *)> SetUseCallback
Argument * getOrCreateArgument(llvm::Argument *LLVMArg)
Get or create a sandboxir::Argument for an existing LLVM IR LLVMArg.
void revert(bool RevertAll=false)
Convenience function for getTracker().revert()
friend class IRSnapshotChecker
SmallVector< std::pair< CallbackID, SetUseCallback > > SetUseCallbacks
Callbacks called when a Use gets its source set.
ReturnInst * createReturnInst(llvm::ReturnInst *I)
UncondBrInst * createUncondBrInst(llvm::UncondBrInst *UBI)
void runEraseInstrCallbacks(Instruction *I)
friend ExtractElementInst
auto & getLLVMIRBuilder()
CleanupReturnInst * createCleanupReturnInst(llvm::CleanupReturnInst *I)
SmallVector< std::pair< CallbackID, CreateInstrCallback > > CreateInstrCallbacks
Callbacks called when an IR instruction is about to get created.
void accept(bool AcceptAll=false)
Convenience function for getTracker().accept()
AllocaInst * createAllocaInst(llvm::AllocaInst *I)
SmallVector< std::pair< CallbackID, MoveInstrCallback > > MoveInstrCallbacks
Callbacks called when an IR instruction is about to get moved.
Type * getType(llvm::Type *LLVMTy)
void runCreateInstrCallbacks(Instruction *I)
AtomicRMWInst * createAtomicRMWInst(llvm::AtomicRMWInst *I)
InsertValueInst * createInsertValueInst(llvm::InsertValueInst *IVI)
const sandboxir::Value * getValue(const llvm::Value *V) const
DenseMap< llvm::Type *, std::unique_ptr< Type, TypeDeleter > > LLVMTypeToTypeMap
Maps LLVM Type to the corresonding sandboxir::Type.
FCmpInst * createFCmpInst(llvm::FCmpInst *I)
std::function< void(Instruction *)> EraseInstrCallback
friend class ConstantDataSequential
CallbackID::ValTy NextCallbackID
A counter used for assigning callback IDs during registration.
ExtractElementInst * createExtractElementInst(llvm::ExtractElementInst *EEI)
ShuffleVectorInst * createShuffleVectorInst(llvm::ShuffleVectorInst *SVI)
BinaryOperator * createBinaryOperator(llvm::BinaryOperator *I)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LoadInst * createLoadInst(llvm::LoadInst *LI)
DenseMap< llvm::Value *, std::unique_ptr< Value > > LLVMValueToValueMap
Maps LLVM Value to the corresponding sandboxir::Value.
FreezeInst * createFreezeInst(llvm::FreezeInst *SI)
PHINode * createPHINode(llvm::PHINode *I)
Context(LLVMContext &LLVMCtx)
CatchPadInst * createCatchPadInst(llvm::CatchPadInst *I)
void clear()
Clears function-level state.
CondBrInst * createCondBrInst(llvm::CondBrInst *CBI)
ICmpInst * createICmpInst(llvm::ICmpInst *I)
std::unique_ptr< Value > detach(Value *V)
Remove SBV from all SandboxIR maps and stop owning it.
ExtractValueInst * createExtractValueInst(llvm::ExtractValueInst *IVI)
CastInst * createCastInst(llvm::CastInst *I)
DenseMap< llvm::Module *, std::unique_ptr< Module > > LLVMModuleToModuleMap
Maps an LLVM Module to the corresponding sandboxir::Module.
StoreInst * createStoreInst(llvm::StoreInst *SI)
CatchReturnInst * createCatchReturnInst(llvm::CatchReturnInst *I)
CatchSwitchInst * createCatchSwitchInst(llvm::CatchSwitchInst *I)
std::function< void(Instruction *, const BBIterator &)> MoveInstrCallback
void save()
Convenience function for getTracker().save()
CleanupPadInst * createCleanupPadInst(llvm::CleanupPadInst *I)
Value * getOrCreateValue(llvm::Value *LLVMV)
Get or create a sandboxir::Value for an existing LLVM IR LLVMV.
FenceInst * createFenceInst(llvm::FenceInst *SI)
CallInst * createCallInst(llvm::CallInst *I)
SwitchInst * createSwitchInst(llvm::SwitchInst *I)
void runMoveInstrCallbacks(Instruction *I, const BBIterator &Where)
UnaryOperator * createUnaryOperator(llvm::UnaryOperator *I)
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...
InvokeInst * createInvokeInst(llvm::InvokeInst *I)
Value * registerValue(std::unique_ptr< Value > &&VPtr)
Take ownership of VPtr and store it in LLVMValueToValueMap.
LandingPadInst * createLandingPadInst(llvm::LandingPadInst *I)
InsertElementInst * createInsertElementInst(llvm::InsertElementInst *IEI)
SelectInst * createSelectInst(llvm::SelectInst *SI)
ResumeInst * createResumeInst(llvm::ResumeInst *I)
friend class BasicBlock
Various leaf nodes.
UnreachableInst * createUnreachableInst(llvm::UnreachableInst *UI)
AtomicCmpXchgInst * createAtomicCmpXchgInst(llvm::AtomicCmpXchgInst *I)
void runSetUseCallbacks(const Use &U, Value *NewSrc)
size_t getNumValues() const
\Returns the number of values registered with Context.
std::unique_ptr< Value > detachLLVMValue(llvm::Value *V)
Remove V from the maps and returns the unique_ptr.
In SandboxIR the Module is mainly used to access the list of global objects.
The tracker collects all the change objects and implements the main API for saving / reverting / acce...
Represents a Def-use/Use-def edge in SandboxIR.
A SandboxIR Value has users. This is the base class.
This is an optimization pass for GlobalISel generic memory operations.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
static unsigned getHashValue(const CallbackID &ID)
DenseMapInfo< CallbackID::ValTy > ReprInfo
sandboxir::Context::CallbackID CallbackID
static bool isEqual(const CallbackID &LHS, const CallbackID &RHS)
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.
void operator()(Type *Ty)