13#ifndef LLVM_CLANG_AST_INTERP_INTERPSTATE_H
14#define LLVM_CLANG_AST_INTERP_INTERPSTATE_H
90 Alloc = std::make_unique<DynamicAllocator>(*Allocator);
103 void *
allocate(
size_t Size,
unsigned Align = 8)
const {
106 return Allocator->Allocate(Size, Align);
112 template <
typename T>
T allocAP(
unsigned BitWidth) {
113 unsigned NumWords = APInt::getNumWords(BitWidth);
116 uint64_t *Mem = (uint64_t *)this->
allocate(NumWords *
sizeof(uint64_t));
118 return T(Mem, BitWidth);
123 return Floating(llvm::APFloatBase::SemanticsToEnum(Sem));
126 APInt::getNumWords(llvm::APFloatBase::getSizeInBits(Sem));
127 uint64_t *Mem = (uint64_t *)this->
allocate(NumWords *
sizeof(uint64_t));
129 return Floating(Mem, llvm::APFloatBase::SemanticsToEnum(Sem));
153 PP[NewLength - 1] = NewEntry;
167 return diagnoseStepLimitExceeded(OpPC);
205 template <
typename... Ts>
208 assert(FrameSize < std::numeric_limits<unsigned>::max());
209 InterpFrame *NewFrame =
new (FrameAlloc.reserve(FrameSize))
222 FrameAlloc.pop(CurrentSize);
234 mutable std::optional<llvm::BumpPtrAllocator> Allocator;
236 std::unique_ptr<DynamicAllocator> Alloc;
238 bool diagnoseStepLimitExceeded(
CodePtr OpPC);
280 std::pair<const Expr *, const LifetimeExtendedTemporaryDecl *>>
291 : Ctx(Ctx), OldCC(Ctx.ConstantContextOverride) {
295 Ctx.ConstantContextOverride =
Value;
299 Ctx.ConstantContextOverride = OldCC;
305 std::optional<bool> OldCC;
Represents a C++ struct/union/class.
This represents one expression.
A (possibly-)qualified type.
Encodes a location in the source.
Represents a variable declaration or definition.
A memory block, either on the stack or in the heap.
const Descriptor * getDescriptor() const
Returns the block's descriptor.
unsigned getEvalID() const
The Evaluation ID this block was created in.
Pointer into the code segment.
Holds all information required to evaluate constexpr code in a module.
Descriptor for a dead block.
Manages dynamic memory allocations done during bytecode interpretation.
If a Floating is constructed from Memory, it DOES NOT OWN THAT MEMORY.
Allocator for function frames.
Base class for stack frames, shared between VM and walker.
Frame storing local variables.
static size_t allocSize(const Function *F)
Returns the number of bytes needed to allocate an InterpFrame for the given function.
Stack frame storing temporaries and parameters.
InterpStateCCOverride(InterpState &Ctx, bool Value)
SmallVectorImpl< PartialDiagnosticAt > * PrevDiags
Things needed to do speculative execution.
bool lifetimeStartedInEvaluation(const Block *B) const
unsigned getCallStackDepth() override
InterpFrame BottomFrame
Bottom function frame.
Context & getContext() const
bool initializingBlock(const Block *B) const
DynamicAllocator & getAllocator()
void resetCurrentFrame()
Free resources associated with the current frame and set the caller to be the new current frame.
Context & Ctx
Interpreter Context.
InterpState(const EvalSettings &Settings, Program &P, InterpStack &Stk, FrameAllocator &FrameAlloc, Context &Ctx, SourceMapper *M=nullptr)
void * allocate(size_t Size, unsigned Align=8) const
Floating allocFloat(const llvm::fltSemantics &Sem)
const unsigned EvalID
ID identifying this evaluation.
bool noteStep(CodePtr OpPC)
Note that a step has been executed.
SourceInfo getSource(CodePtr PC) const
Delegates source mapping to the mapper.
InterpState(const InterpState &)=delete
bool stepsLeft() const override
llvm::SmallVector< std::pair< const Expr *, const LifetimeExtendedTemporaryDecl * > > SeenGlobalTemporaries
InterpFrame * allocFrame(const Function *F, Ts &&...Args)
Allocate memory and create a new InterpFrame for the given function.
InterpStack & Stk
Temporary stack.
bool maybeDiagnoseDanglingAllocations()
Diagnose any dynamic allocations that haven't been freed yet.
SourceLocation EvalLocation
Source location of the evaluating expression.
bool checkingConstantDestruction() const
Return if we're checking if a global variable has a constant destructor.
unsigned StepsLeft
Steps left during evaluation.
const VarDecl * EvaluatingDecl
Declaration we're initializing/evaluting, if any.
bool checkingConstantDestruction(const Pointer &Ptr) const
Return if we're checking if a global variable has a constant destructor and the given pointer is poin...
InterpFrame * Current
The current frame.
PointerPathEntry * allocPointerPath(unsigned Length, const PointerPathEntry *OldPP)
const CXXRecordDecl ** allocMemberPointerPath(unsigned Length)
const Frame * getCurrentFrame() override
std::optional< bool > ConstantContextOverride
const bool InfiniteSteps
Whether infinite evaluation steps have been requested.
InterpState & operator=(const InterpState &)=delete
friend class InterpStateCCOverride
T * allocate(size_t Num=1) const
void deallocate(Block *B)
Deallocates a pointer.
PointerPathEntry * extendPointerPath(unsigned NewLength, const PointerPathEntry *OldPP, PointerPathEntry NewEntry)
Allocate a new pointer path of Length NewLength.
llvm::SmallVector< PtrView > InitializingPtrs
List of blocks we're currently running either constructors or destructors for.
T allocAP(unsigned BitWidth)
void setEvalLocation(SourceLocation SL)
unsigned SpeculationDepth
friend class EvaluationResult
StdAllocatorCaller getStdAllocatorCaller(StringRef Name) const
bool checkingConstantDestruction(const VarDecl *VD) const
bool inConstantContext() const
Program & P
Reference to the module containing all bytecode.
A pointer to a memory block, live or dead.
The program contains and links the bytecode for all functions.
Describes the statement/declaration an opcode was generated from.
Interface for classes which map locations to sources.
Expr::EvalStatus & getEvalStatus() const
State(ASTContext &ASTCtx, Expr::EvalStatus &EvalStatus)
Top level wrappers for InstallAPI frontend operations.
const FunctionProtoType * T
EvalStatus is a struct with detailed info about an evaluation in progress.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
const VarDecl * asVarDecl() const