13#ifndef LLVM_CLANG_AST_INTERP_INTERPSTATE_H
14#define LLVM_CLANG_AST_INTERP_INTERPSTATE_H
68 return Parent.getEvalStatus();
74 return Parent.checkingForUndefinedBehavior();
77 return Parent.keepEvaluatingAfterFailure();
80 return Parent.keepEvaluatingAfterSideEffect();
83 return Parent.checkingPotentialConstantExpression();
86 return Parent.noteUndefinedBehavior();
91 Parent.setActiveDiagnostic(Flag);
94 Parent.setFoldFailureDiagnostic(Flag);
110 assert(F &&
"Function cannot be null");
120 Alloc = std::make_unique<DynamicAllocator>();
133 void *
allocate(
size_t Size,
unsigned Align = 8)
const {
140 template <
typename T>
T allocAP(
unsigned BitWidth) {
141 unsigned NumWords = APInt::getNumWords(BitWidth);
144 uint64_t *Mem = (uint64_t *)this->
allocate(NumWords *
sizeof(uint64_t));
146 return T(Mem, BitWidth);
151 return Floating(llvm::APFloatBase::SemanticsToEnum(Sem));
154 APInt::getNumWords(llvm::APFloatBase::getSizeInBits(Sem));
155 uint64_t *Mem = (uint64_t *)this->
allocate(NumWords *
sizeof(uint64_t));
157 return Floating(Mem, llvm::APFloatBase::SemanticsToEnum(Sem));
170 std::unique_ptr<DynamicAllocator> Alloc;
193 std::pair<const Expr *, const LifetimeExtendedTemporaryDecl *>>
206 : Ctx(Ctx), OldCC(Ctx.ConstantContextOverride) {
210 Ctx.ConstantContextOverride =
Value;
220 std::optional<bool> OldCC;
Implements a partial diagnostic which may not be emitted.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
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.
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.
Defines the result of an evaluation.
If a Floating is constructed from Memory, it DOES NOT OWN THAT MEMORY.
Base class for stack frames, shared between VM and walker.
SourceInfo getSource(CodePtr PC) const
Returns the source information at a given PC.
Frame storing local variables.
unsigned getDepth() const
Stack frame storing temporaries and parameters.
InterpStateCCOverride(InterpState &Ctx, bool Value)
const Frame * getBottomFrame() const override
SmallVectorImpl< PartialDiagnosticAt > * PrevDiags
Things needed to do speculative execution.
llvm::BumpPtrAllocator Allocator
unsigned getCallStackDepth() override
Expr::EvalStatus & getEvalStatus() const override
InterpFrame BottomFrame
Bottom function frame.
Context & getContext() const
bool keepEvaluatingAfterFailure() const override
bool reportOverflow(const Expr *E, const llvm::APSInt &Value)
Reports overflow and return true if evaluation should continue.
bool noteUndefinedBehavior() override
DynamicAllocator & getAllocator()
Context & Ctx
Interpreter Context.
void * allocate(size_t Size, unsigned Align=8) const
Floating allocFloat(const llvm::fltSemantics &Sem)
llvm::SmallVector< const Block * > InitializingBlocks
List of blocks we're currently running either constructors or destructors for.
ASTContext & getASTContext() const override
SourceInfo getSource(const Function *F, CodePtr PC) const override
Delegates source mapping to the mapper.
Frame * getCurrentFrame() override
InterpState(const InterpState &)=delete
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.
SourceLocation EvalLocation
Source location of the evaluating expression.
bool keepEvaluatingAfterSideEffect() const override
bool noteSideEffect() override
const VarDecl * EvaluatingDecl
Declaration we're initializing/evaluting, if any.
InterpFrame * Current
The current frame.
bool hasActiveDiagnostic() override
std::optional< bool > ConstantContextOverride
void setActiveDiagnostic(bool Flag) override
bool checkingForUndefinedBehavior() const override
void setFoldFailureDiagnostic(bool Flag) override
InterpState & operator=(const InterpState &)=delete
T * allocate(size_t Num=1) const
void deallocate(Block *B)
Deallocates a pointer.
T allocAP(unsigned BitWidth)
void setEvalLocation(SourceLocation SL)
unsigned SpeculationDepth
bool checkingPotentialConstantExpression() const override
StdAllocatorCaller getStdAllocatorCaller(StringRef Name) const
bool inConstantContext() const
bool hasPriorDiagnostic() override
Program & P
Reference to the module containing all bytecode.
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.
virtual SourceInfo getSource(const Function *F, CodePtr PC) const =0
Returns source information for a given PC in a function.
Interface for the VM to interact with the AST walker's context.
The JSON file list parser is used to communicate input to InstallAPI.
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...