clang 22.0.0git
clang::interp::EvalEmitter Class Referenceabstract

An emitter which evaluates opcodes as they are emitted. More...

#include "/home/buildbot/as-worker-4/publish-doxygen-docs/llvm-project/clang/lib/AST/ByteCode/EvalEmitter.h"

Inheritance diagram for clang::interp::EvalEmitter:
[legend]

Public Types

using LabelTy = uint32_t
using AddrTy = uintptr_t
using Local = Scope::Local
using PtrCallback = llvm::function_ref<bool(const Pointer &)>

Public Member Functions

EvaluationResult interpretExpr (const Expr *E, bool ConvertResultToRValue=false, bool DestroyToplevelScope=false)
EvaluationResult interpretDecl (const VarDecl *VD, bool CheckFullyInitialized)
EvaluationResult interpretAsPointer (const Expr *E, PtrCallback PtrCB)
 Interpret the given Expr to a Pointer.
bool interpretCall (const FunctionDecl *FD, const Expr *E)
 Interpret the given expression as if it was in the body of the given function, i.e.
void cleanup ()
 Clean up all resources.
Public Member Functions inherited from clang::interp::SourceMapper
virtual ~SourceMapper ()
const ExprgetExpr (const Function *F, CodePtr PC) const
 Returns the expression if an opcode belongs to one, null otherwise.
SourceLocation getLocation (const Function *F, CodePtr PC) const
 Returns the location from which an opcode originates.
SourceRange getRange (const Function *F, CodePtr PC) const

Protected Member Functions

 EvalEmitter (Context &Ctx, Program &P, State &Parent, InterpStack &Stk)
virtual ~EvalEmitter ()
void emitLabel (LabelTy Label)
 Define a label.
LabelTy getLabel ()
 Create a label.
virtual bool visitExpr (const Expr *E, bool DestroyToplevelScope)=0
 Methods implemented by the compiler.
virtual bool visitDeclAndReturn (const VarDecl *VD, bool ConstantContext)=0
virtual bool visitFunc (const FunctionDecl *F)=0
virtual bool visit (const Expr *E)=0
virtual bool emitBool (bool V, const Expr *E)=0
bool jumpTrue (const LabelTy &Label)
 Emits jumps.
bool jumpFalse (const LabelTy &Label)
bool jump (const LabelTy &Label)
bool fallthrough (const LabelTy &Label)
bool speculate (const CallExpr *E, const LabelTy &EndLabel)
 Speculative execution.
bool isActive () const
 Since expressions can only jump forward, predicated execution is used to deal with if-else statements.
bool checkingForUndefinedBehavior () const
Local createLocal (Descriptor *D)
 Callback for registering a local.
SourceInfo getSource (const Function *F, CodePtr PC) const override
 Returns the source location of the current opcode.

Protected Attributes

llvm::DenseMap< const ParmVarDecl *, ParamOffsetParams
 Parameter indices.
llvm::DenseMap< const ValueDecl *, ParamOffsetLambdaCaptures
 Lambda captures.
ParamOffset LambdaThisCapture {0, false}
 Offset of the This parameter in a lambda record.
llvm::SmallVector< SmallVector< Local, 8 >, 2 > Descriptors
 Local descriptors.
std::optional< SourceInfoLocOverride = std::nullopt

Detailed Description

An emitter which evaluates opcodes as they are emitted.

Definition at line 30 of file EvalEmitter.h.

Member Typedef Documentation

◆ AddrTy

Definition at line 33 of file EvalEmitter.h.

◆ LabelTy

Definition at line 32 of file EvalEmitter.h.

◆ Local

Definition at line 34 of file EvalEmitter.h.

◆ PtrCallback

using clang::interp::EvalEmitter::PtrCallback = llvm::function_ref<bool(const Pointer &)>

Definition at line 35 of file EvalEmitter.h.

Constructor & Destructor Documentation

◆ EvalEmitter()

EvalEmitter::EvalEmitter ( Context & Ctx,
Program & P,
State & Parent,
InterpStack & Stk )
protected

Definition at line 18 of file EvalEmitter.cpp.

◆ ~EvalEmitter()

EvalEmitter::~EvalEmitter ( )
protectedvirtual

Member Function Documentation

◆ checkingForUndefinedBehavior()

bool clang::interp::EvalEmitter::checkingForUndefinedBehavior ( ) const
inlineprotected

Definition at line 78 of file EvalEmitter.h.

◆ cleanup()

void EvalEmitter::cleanup ( )

Clean up all resources.

Clean up all our resources.

This needs to done in failed evaluations before we call InterpStack::clear(), because there might be a Pointer on the stack pointing into a Block in the EvalEmitter.

Definition at line 33 of file EvalEmitter.cpp.

◆ createLocal()

◆ emitBool()

virtual bool clang::interp::EvalEmitter::emitBool ( bool V,
const Expr * E )
protectedpure virtual

References V.

Referenced by speculate().

◆ emitLabel()

void EvalEmitter::emitLabel ( LabelTy Label)
protected

Define a label.

Definition at line 104 of file EvalEmitter.cpp.

◆ fallthrough()

bool EvalEmitter::fallthrough ( const LabelTy & Label)
protected

Definition at line 152 of file EvalEmitter.cpp.

References isActive().

◆ getLabel()

EvalEmitter::LabelTy EvalEmitter::getLabel ( )
protected

Create a label.

Definition at line 106 of file EvalEmitter.cpp.

◆ getSource()

SourceInfo clang::interp::EvalEmitter::getSource ( const Function * F,
CodePtr PC ) const
inlineoverrideprotectedvirtual

Returns the source location of the current opcode.

Implements clang::interp::SourceMapper.

Definition at line 86 of file EvalEmitter.h.

References clang::interp::Function::getSource(), and clang::interp::Function::hasBody().

◆ interpretAsPointer()

EvaluationResult EvalEmitter::interpretAsPointer ( const Expr * E,
PtrCallback PtrCB )

Interpret the given Expr to a Pointer.

Definition at line 76 of file EvalEmitter.cpp.

References clang::Expr::getExprLoc(), and visitExpr().

◆ interpretCall()

bool EvalEmitter::interpretCall ( const FunctionDecl * FD,
const Expr * E )

Interpret the given expression as if it was in the body of the given function, i.e.

the parameters of the function are available for use.

Definition at line 94 of file EvalEmitter.cpp.

References clang::FunctionDecl::parameters(), Params, and visitExpr().

◆ interpretDecl()

EvaluationResult EvalEmitter::interpretDecl ( const VarDecl * VD,
bool CheckFullyInitialized )

◆ interpretExpr()

EvaluationResult EvalEmitter::interpretExpr ( const Expr * E,
bool ConvertResultToRValue = false,
bool DestroyToplevelScope = false )

Definition at line 35 of file EvalEmitter.cpp.

References clang::Expr::getExprLoc(), clang::isa(), and visitExpr().

◆ isActive()

bool clang::interp::EvalEmitter::isActive ( ) const
inlineprotected

Since expressions can only jump forward, predicated execution is used to deal with if-else statements.

Definition at line 77 of file EvalEmitter.h.

Referenced by fallthrough(), jump(), jumpFalse(), and jumpTrue().

◆ jump()

bool EvalEmitter::jump ( const LabelTy & Label)
protected

Definition at line 146 of file EvalEmitter.cpp.

References isActive().

◆ jumpFalse()

bool EvalEmitter::jumpFalse ( const LabelTy & Label)
protected

Definition at line 138 of file EvalEmitter.cpp.

References isActive().

◆ jumpTrue()

bool EvalEmitter::jumpTrue ( const LabelTy & Label)
protected

Emits jumps.

Definition at line 130 of file EvalEmitter.cpp.

References isActive().

◆ speculate()

bool EvalEmitter::speculate ( const CallExpr * E,
const LabelTy & EndLabel )
protected

◆ visit()

virtual bool clang::interp::EvalEmitter::visit ( const Expr * E)
protectedpure virtual

Referenced by speculate().

◆ visitDeclAndReturn()

virtual bool clang::interp::EvalEmitter::visitDeclAndReturn ( const VarDecl * VD,
bool ConstantContext )
protectedpure virtual

Referenced by interpretDecl().

◆ visitExpr()

virtual bool clang::interp::EvalEmitter::visitExpr ( const Expr * E,
bool DestroyToplevelScope )
protectedpure virtual

Methods implemented by the compiler.

Referenced by interpretAsPointer(), interpretCall(), and interpretExpr().

◆ visitFunc()

virtual bool clang::interp::EvalEmitter::visitFunc ( const FunctionDecl * F)
protectedpure virtual

Member Data Documentation

◆ Descriptors

llvm::SmallVector<SmallVector<Local, 8>, 2> clang::interp::EvalEmitter::Descriptors
protected

Local descriptors.

Definition at line 97 of file EvalEmitter.h.

◆ LambdaCaptures

llvm::DenseMap<const ValueDecl *, ParamOffset> clang::interp::EvalEmitter::LambdaCaptures
protected

Lambda captures.

Definition at line 93 of file EvalEmitter.h.

◆ LambdaThisCapture

ParamOffset clang::interp::EvalEmitter::LambdaThisCapture {0, false}
protected

Offset of the This parameter in a lambda record.

Definition at line 95 of file EvalEmitter.h.

◆ LocOverride

std::optional<SourceInfo> clang::interp::EvalEmitter::LocOverride = std::nullopt
protected

Definition at line 98 of file EvalEmitter.h.

◆ Params

llvm::DenseMap<const ParmVarDecl *, ParamOffset> clang::interp::EvalEmitter::Params
protected

Parameter indices.

Definition at line 91 of file EvalEmitter.h.

Referenced by interpretCall().


The documentation for this class was generated from the following files: