13#ifndef LLVM_CLANG_AST_INTERP_INTERPSTATE_H
14#define LLVM_CLANG_AST_INTERP_INTERPSTATE_H
84 Alloc = std::make_unique<DynamicAllocator>();
97 void *
allocate(
size_t Size,
unsigned Align = 8)
const {
100 return Allocator->Allocate(Size, Align);
106 template <
typename T>
T allocAP(
unsigned BitWidth) {
107 unsigned NumWords = APInt::getNumWords(BitWidth);
110 uint64_t *Mem = (uint64_t *)this->
allocate(NumWords *
sizeof(uint64_t));
112 return T(Mem, BitWidth);
117 return Floating(llvm::APFloatBase::SemanticsToEnum(Sem));
120 APInt::getNumWords(llvm::APFloatBase::getSizeInBits(Sem));
121 uint64_t *Mem = (uint64_t *)this->
allocate(NumWords *
sizeof(uint64_t));
123 return Floating(Mem, llvm::APFloatBase::SemanticsToEnum(Sem));
174 std::unique_ptr<DynamicAllocator> Alloc;
176 mutable std::optional<llvm::BumpPtrAllocator> Allocator;
214 std::pair<const Expr *, const LifetimeExtendedTemporaryDecl *>>
225 : Ctx(Ctx), OldCC(Ctx.ConstantContextOverride) {
229 Ctx.ConstantContextOverride =
Value;
233 Ctx.ConstantContextOverride = OldCC;
239 std::optional<bool> OldCC;
Represents a C++ struct/union/class.
This represents one expression.
A (possibly-)qualified type.
Encodes a location in the source.
A trivial tuple used to represent a source range.
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.
Base class for stack frames, shared between VM and walker.
Frame storing local variables.
Stack frame storing temporaries and parameters.
InterpStateCCOverride(InterpState &Ctx, bool Value)
SmallVectorImpl< PartialDiagnosticAt > * PrevDiags
Things needed to do speculative execution.
const Expr * getExpr(CodePtr PC) const
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()
SourceLocation getLocation(CodePtr PC) const
Context & Ctx
Interpreter Context.
void * allocate(size_t Size, unsigned Align=8) const
bool noteStep(CodePtr OpPC)
Note that a step has been executed.
Floating allocFloat(const llvm::fltSemantics &Sem)
const unsigned EvalID
ID identifying this evaluation.
SourceInfo getSource(CodePtr PC) const
Delegates source mapping to the mapper.
InterpState(const State &Parent, Program &P, InterpStack &Stk, Context &Ctx, SourceMapper *M=nullptr)
InterpState(const InterpState &)=delete
bool stepsLeft() const override
llvm::SmallVector< std::pair< const Expr *, const LifetimeExtendedTemporaryDecl * > > SeenGlobalTemporaries
InterpStack & Stk
Temporary stack.
bool maybeDiagnoseDanglingAllocations()
Diagnose any dynamic allocations that haven't been freed yet.
SourceRange getRange(CodePtr PC) const
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.
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.
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.
const Descriptor * getDeclDesc() const
Accessor for information about the declaration site.
The program contains and links the bytecode for all functions.
Describes the statement/declaration an opcode was generated from.
const Expr * asExpr() const
SourceLocation getLoc() const
SourceRange getRange() const
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
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
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