clang 20.0.0git
|
Manages dynamic memory allocations done during bytecode interpretation. More...
Public Types | |
enum class | Form : uint8_t { NonArray , Array , Operator } |
using | const_virtual_iter = llvm::DenseMap< const Expr *, AllocationSite >::const_iterator |
Allocation site iterator. | |
Public Member Functions | |
DynamicAllocator ()=default | |
~DynamicAllocator () | |
void | cleanup () |
unsigned | getNumAllocations () const |
Block * | allocate (const Descriptor *D, unsigned EvalID, Form AllocForm) |
Allocate ONE element of the given descriptor. | |
Block * | allocate (const Expr *Source, PrimType T, size_t NumElements, unsigned EvalID, Form AllocForm) |
Allocate NumElements primitive elements of the given type. | |
Block * | allocate (const Descriptor *D, size_t NumElements, unsigned EvalID, Form AllocForm) |
Allocate NumElements elements of the given descriptor. | |
bool | deallocate (const Expr *Source, const Block *BlockToDelete, InterpState &S) |
Deallocate the given source+block combination. | |
std::optional< Form > | getAllocationForm (const Expr *Source) const |
Checks whether the allocation done at the given source is an array allocation. | |
llvm::iterator_range< const_virtual_iter > | allocation_sites () const |
Manages dynamic memory allocations done during bytecode interpretation.
We manage allocations as a map from their new-expression to a list of allocations. This is called an AllocationSite. For each site, we record whether it was allocated using new or new[], the IsArrayAllocation flag.
For all array allocations, we need to allocate new Descriptor instances, so the DynamicAllocator has a llvm::BumpPtrAllocator similar to Program.
Definition at line 33 of file DynamicAllocator.h.
using clang::interp::DynamicAllocator::const_virtual_iter = llvm::DenseMap<const Expr *, AllocationSite>::const_iterator |
Allocation site iterator.
Definition at line 91 of file DynamicAllocator.h.
|
strong |
Enumerator | |
---|---|
NonArray | |
Array | |
Operator |
Definition at line 35 of file DynamicAllocator.h.
|
default |
DynamicAllocator::~DynamicAllocator | ( | ) |
Definition at line 16 of file DynamicAllocator.cpp.
References cleanup().
Block * DynamicAllocator::allocate | ( | const Descriptor * | D, |
size_t | NumElements, | ||
unsigned | EvalID, | ||
Form | AllocForm | ||
) |
Allocate NumElements
elements of the given descriptor.
Definition at line 54 of file DynamicAllocator.cpp.
References allocate(), clang::interp::Descriptor::asExpr(), D, and clang::interp::Descriptor::InlineDescMD.
Block * DynamicAllocator::allocate | ( | const Descriptor * | D, |
unsigned | EvalID, | ||
Form | AllocForm | ||
) |
Allocate ONE element of the given descriptor.
Definition at line 65 of file DynamicAllocator.cpp.
References D, and clang::interp::Block::invokeCtor().
Referenced by allocate().
Block * DynamicAllocator::allocate | ( | const Expr * | Source, |
PrimType | T, | ||
size_t | NumElements, | ||
unsigned | EvalID, | ||
Form | AllocForm | ||
) |
Allocate NumElements
primitive elements of the given type.
Definition at line 42 of file DynamicAllocator.cpp.
References allocate(), D, clang::interp::Descriptor::InlineDescMD, and clang::T.
|
inline |
Definition at line 93 of file DynamicAllocator.h.
Referenced by clang::interp::InterpState::maybeDiagnoseDanglingAllocations().
void DynamicAllocator::cleanup | ( | ) |
Definition at line 18 of file DynamicAllocator.cpp.
References clang::interp::Alloc(), clang::interp::Pointer::BS, clang::interp::Block::hasPointers(), clang::interp::Block::invokeDtor(), Iter, and clang::interp::BlockPointer::Pointee.
Referenced by clang::interp::InterpState::cleanup(), and ~DynamicAllocator().
bool DynamicAllocator::deallocate | ( | const Expr * | Source, |
const Block * | BlockToDelete, | ||
InterpState & | S | ||
) |
Deallocate the given source+block combination.
Returns true
if anything has been deallocatd, false
otherwise.
Definition at line 94 of file DynamicAllocator.cpp.
References clang::interp::Block::invokeDtor().
|
inline |
Checks whether the allocation done at the given source is an array allocation.
Definition at line 84 of file DynamicAllocator.h.
|
inline |
Definition at line 66 of file DynamicAllocator.h.
Referenced by clang::interp::InterpState::maybeDiagnoseDanglingAllocations().