clang 20.0.0git
Namespaces | Typedefs | Enumerations | Functions
Interp.h File Reference
#include "../ExprConstShared.h"
#include "BitcastBuffer.h"
#include "Boolean.h"
#include "DynamicAllocator.h"
#include "FixedPoint.h"
#include "Floating.h"
#include "Function.h"
#include "FunctionPointer.h"
#include "InterpBuiltinBitCast.h"
#include "InterpFrame.h"
#include "InterpStack.h"
#include "InterpState.h"
#include "MemberPointer.h"
#include "Opcode.h"
#include "PrimType.h"
#include "Program.h"
#include "State.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Expr.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APSInt.h"
#include <type_traits>

Go to the source code of this file.

Namespaces

namespace  clang
 The JSON file list parser is used to communicate input to InstallAPI.
 
namespace  clang::interp
 

Typedefs

using clang::interp::FixedPointSemantics = llvm::FixedPointSemantics
 
using clang::interp::CompareFn = llvm::function_ref< bool(ComparisonCategoryResult)>
 

Enumerations

enum class  clang::interp::ShiftDir { clang::interp::Left , clang::interp::Right }
 
enum class  clang::interp::ArithOp { clang::interp::Add , clang::interp::Sub }
 
enum class  clang::interp::PushVal : bool { clang::interp::No , clang::interp::Yes }
 
enum class  clang::interp::IncDecOp { clang::interp::Inc , clang::interp::Dec }
 

Functions

bool clang::interp::CheckExtern (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Checks if the variable has externally defined storage.
 
bool clang::interp::CheckArray (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Checks if the array is offsetable.
 
bool clang::interp::CheckLive (InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK)
 Checks if a pointer is live and accessible.
 
bool clang::interp::CheckDummy (InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK)
 Checks if a pointer is a dummy pointer.
 
bool clang::interp::CheckNull (InterpState &S, CodePtr OpPC, const Pointer &Ptr, CheckSubobjectKind CSK)
 Checks if a pointer is null.
 
bool clang::interp::CheckRange (InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK)
 Checks if a pointer is in range.
 
bool clang::interp::CheckRange (InterpState &S, CodePtr OpPC, const Pointer &Ptr, CheckSubobjectKind CSK)
 Checks if a field from which a pointer is going to be derived is valid.
 
bool clang::interp::CheckSubobject (InterpState &S, CodePtr OpPC, const Pointer &Ptr, CheckSubobjectKind CSK)
 Checks if Ptr is a one-past-the-end pointer.
 
bool clang::interp::CheckDowncast (InterpState &S, CodePtr OpPC, const Pointer &Ptr, uint32_t Offset)
 Checks if the dowcast using the given offset is possible with the given pointer.
 
bool clang::interp::CheckConst (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Checks if a pointer points to const storage.
 
bool clang::interp::CheckConstant (InterpState &S, CodePtr OpPC, const Descriptor *Desc)
 Checks if the Descriptor is of a constexpr or const global variable.
 
bool clang::interp::CheckMutable (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Checks if a pointer points to a mutable field.
 
bool clang::interp::CheckLoad (InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK=AK_Read)
 Checks if a value can be loaded from a block.
 
bool clang::interp::CheckFinalLoad (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 This is not used by any of the opcodes directly.
 
bool clang::interp::CheckInitialized (InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK)
 
bool clang::interp::CheckGlobalInitialized (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Check if a global variable is initialized.
 
bool clang::interp::CheckStore (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Checks if a value can be stored in a block.
 
bool clang::interp::CheckInvoke (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Checks if a method can be invoked on an object.
 
bool clang::interp::CheckInit (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 Checks if a value can be initialized.
 
bool clang::interp::CheckCallable (InterpState &S, CodePtr OpPC, const Function *F)
 Checks if a method can be called.
 
bool clang::interp::CheckCallDepth (InterpState &S, CodePtr OpPC)
 Checks if calling the currently active function would exceed the allowed call depth.
 
bool clang::interp::CheckThis (InterpState &S, CodePtr OpPC, const Pointer &This)
 Checks the 'this' pointer.
 
bool clang::interp::CheckPure (InterpState &S, CodePtr OpPC, const CXXMethodDecl *MD)
 Checks if a method is pure virtual.
 
bool clang::interp::CheckNonNullArgs (InterpState &S, CodePtr OpPC, const Function *F, const CallExpr *CE, unsigned ArgSize)
 Checks if all the arguments annotated as 'nonnull' are in fact not null.
 
bool clang::interp::CheckDynamicMemoryAllocation (InterpState &S, CodePtr OpPC)
 Checks if dynamic memory allocation is available in the current language mode.
 
bool clang::interp::CheckNewDeleteForms (InterpState &S, CodePtr OpPC, DynamicAllocator::Form AllocForm, DynamicAllocator::Form DeleteForm, const Descriptor *D, const Expr *NewExpr)
 Diagnose mismatched new[]/delete or new/delete[] pairs.
 
bool clang::interp::CheckDeleteSource (InterpState &S, CodePtr OpPC, const Expr *Source, const Pointer &Ptr)
 Check the source of the pointer passed to delete/delete[] has actually been heap allocated by us.
 
bool clang::interp::SetThreeWayComparisonField (InterpState &S, CodePtr OpPC, const Pointer &Ptr, const APSInt &IntValue)
 Sets the given integral value to the pointer, which is of a std::{weak,partial,strong}_ordering type.
 
bool clang::interp::DoMemcpy (InterpState &S, CodePtr OpPC, const Pointer &Src, Pointer &Dest)
 Copy the contents of Src into Dest.
 
bool clang::interp::CallVar (InterpState &S, CodePtr OpPC, const Function *Func, uint32_t VarArgSize)
 
bool clang::interp::Call (InterpState &S, CodePtr OpPC, const Function *Func, uint32_t VarArgSize)
 
bool clang::interp::CallVirt (InterpState &S, CodePtr OpPC, const Function *Func, uint32_t VarArgSize)
 
bool clang::interp::CallBI (InterpState &S, CodePtr OpPC, const Function *Func, const CallExpr *CE, uint32_t BuiltinID)
 
bool clang::interp::CallPtr (InterpState &S, CodePtr OpPC, uint32_t ArgSize, const CallExpr *CE)
 
bool clang::interp::CheckLiteralType (InterpState &S, CodePtr OpPC, const Type *T)
 
bool clang::interp::InvalidShuffleVectorIndex (InterpState &S, CodePtr OpPC, uint32_t Index)
 
bool clang::interp::CheckBitCast (InterpState &S, CodePtr OpPC, bool HasIndeterminateBits, bool TargetIsUCharOrByte)
 
template<typename T >
static bool clang::interp::handleOverflow (InterpState &S, CodePtr OpPC, const T &SrcValue)
 
bool clang::interp::handleFixedPointOverflow (InterpState &S, CodePtr OpPC, const FixedPoint &FP)
 
template<ShiftDir Dir, typename LT , typename RT >
bool clang::interp::CheckShift (InterpState &S, CodePtr OpPC, const LT &LHS, const RT &RHS, unsigned Bits)
 Checks if the shift operation is legal.
 
template<typename T >
bool clang::interp::CheckDivRem (InterpState &S, CodePtr OpPC, const T &LHS, const T &RHS)
 Checks if Div/Rem operation on LHS and RHS is valid.
 
template<typename SizeT >
bool clang::interp::CheckArraySize (InterpState &S, CodePtr OpPC, SizeT *NumElements, unsigned ElemSize, bool IsNoThrow)
 
bool clang::interp::CheckFloatResult (InterpState &S, CodePtr OpPC, const Floating &Result, APFloat::opStatus Status, FPOptions FPO)
 Checks if the result of a floating-point operation is valid in the current context.
 
bool clang::interp::CheckDeclRef (InterpState &S, CodePtr OpPC, const DeclRefExpr *DR)
 We aleady know the given DeclRefExpr is invalid for some reason, now figure out why and print appropriate diagnostics.
 
bool clang::interp::Interpret (InterpState &S)
 Interpreter entry point.
 
bool clang::interp::InterpretBuiltin (InterpState &S, CodePtr OpPC, const Function *F, const CallExpr *Call, uint32_t BuiltinID)
 Interpret a builtin function.
 
bool clang::interp::InterpretOffsetOf (InterpState &S, CodePtr OpPC, const OffsetOfExpr *E, llvm::ArrayRef< int64_t > ArrayIndices, int64_t &Result)
 Interpret an offsetof operation.
 
bool clang::interp::Invalid (InterpState &S, CodePtr OpPC)
 Just emit a diagnostic.
 
void clang::interp::cleanupAfterFunctionCall (InterpState &S, CodePtr OpPC, const Function *Func)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Ret (InterpState &S, CodePtr &PC)
 
bool clang::interp::RetVoid (InterpState &S, CodePtr &PC)
 
template<typename T , bool(*)(T, T, unsigned, T *) OpFW, template< typename U > class OpAP>
bool clang::interp::AddSubMulHelper (InterpState &S, CodePtr OpPC, unsigned Bits, const T &LHS, const T &RHS)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Add (InterpState &S, CodePtr OpPC)
 
static llvm::RoundingMode clang::interp::getRoundingMode (FPOptions FPO)
 
bool clang::interp::Addf (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Sub (InterpState &S, CodePtr OpPC)
 
bool clang::interp::Subf (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Mul (InterpState &S, CodePtr OpPC)
 
bool clang::interp::Mulf (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Mulc (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Divc (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::BitAnd (InterpState &S, CodePtr OpPC)
 1) Pops the RHS from the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::BitOr (InterpState &S, CodePtr OpPC)
 1) Pops the RHS from the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::BitXor (InterpState &S, CodePtr OpPC)
 1) Pops the RHS from the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Rem (InterpState &S, CodePtr OpPC)
 1) Pops the RHS from the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Div (InterpState &S, CodePtr OpPC)
 1) Pops the RHS from the stack.
 
bool clang::interp::Divf (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
bool clang::interp::Inv (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Neg (InterpState &S, CodePtr OpPC)
 
template<typename T , IncDecOp Op, PushVal DoPush>
bool clang::interp::IncDecHelper (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Inc (InterpState &S, CodePtr OpPC)
 1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by one back to the pointer 4) Pushes the original (pre-inc) value on the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::IncPop (InterpState &S, CodePtr OpPC)
 1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by one back to the pointer
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Dec (InterpState &S, CodePtr OpPC)
 1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value decreased by one back to the pointer 4) Pushes the original (pre-dec) value on the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::DecPop (InterpState &S, CodePtr OpPC)
 1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value decreased by one back to the pointer
 
template<IncDecOp Op, PushVal DoPush>
bool clang::interp::IncDecFloatHelper (InterpState &S, CodePtr OpPC, const Pointer &Ptr, uint32_t FPOI)
 
bool clang::interp::Incf (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
bool clang::interp::IncfPop (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
bool clang::interp::Decf (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
bool clang::interp::DecfPop (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Comp (InterpState &S, CodePtr OpPC)
 1) Pops the value from the stack.
 
template<typename T >
bool clang::interp::CmpHelper (InterpState &S, CodePtr OpPC, CompareFn Fn)
 
template<typename T >
bool clang::interp::CmpHelperEQ (InterpState &S, CodePtr OpPC, CompareFn Fn)
 
template<>
bool clang::interp::CmpHelper< FunctionPointer > (InterpState &S, CodePtr OpPC, CompareFn Fn)
 Function pointers cannot be compared in an ordered way.
 
template<>
bool clang::interp::CmpHelperEQ< FunctionPointer > (InterpState &S, CodePtr OpPC, CompareFn Fn)
 
template<>
bool clang::interp::CmpHelper< Pointer > (InterpState &S, CodePtr OpPC, CompareFn Fn)
 
template<>
bool clang::interp::CmpHelperEQ< Pointer > (InterpState &S, CodePtr OpPC, CompareFn Fn)
 
template<>
bool clang::interp::CmpHelperEQ< MemberPointer > (InterpState &S, CodePtr OpPC, CompareFn Fn)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::EQ (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CMP3 (InterpState &S, CodePtr OpPC, const ComparisonCategoryInfo *CmpInfo)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::NE (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::LT (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::LE (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GT (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GE (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InRange (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Dup (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Pop (InterpState &S, CodePtr OpPC)
 
template<PrimType TopName, PrimType BottomName>
bool clang::interp::Flip (InterpState &S, CodePtr OpPC)
 [Value1, Value2] -> [Value2, Value1]
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Const (InterpState &S, CodePtr OpPC, const T &Arg)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetLocal (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::SetLocal (InterpState &S, CodePtr OpPC, uint32_t I)
 1) Pops the value from the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetParam (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::SetParam (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetField (InterpState &S, CodePtr OpPC, uint32_t I)
 1) Peeks a pointer on the stack 2) Pushes the value of the pointer's field on the stack
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::SetField (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetFieldPop (InterpState &S, CodePtr OpPC, uint32_t I)
 1) Pops a pointer from the stack 2) Pushes the value of the pointer's field on the stack
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetThisField (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::SetThisField (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetGlobal (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetGlobalUnchecked (InterpState &S, CodePtr OpPC, uint32_t I)
 Same as GetGlobal, but without the checks.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::SetGlobal (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitGlobal (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitGlobalTemp (InterpState &S, CodePtr OpPC, uint32_t I, const LifetimeExtendedTemporaryDecl *Temp)
 1) Converts the value on top of the stack to an APValue 2) Sets that APValue on \Temp 3) Initializes global with index \I with that
 
bool clang::interp::InitGlobalTempComp (InterpState &S, CodePtr OpPC, const LifetimeExtendedTemporaryDecl *Temp)
 1) Converts the value on top of the stack to an APValue 2) Sets that APValue on \Temp 3) Initialized global with index \I with that
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitThisField (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitThisBitField (InterpState &S, CodePtr OpPC, const Record::Field *F, uint32_t FieldOffset)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitField (InterpState &S, CodePtr OpPC, uint32_t I)
 1) Pops the value from the stack 2) Peeks a pointer from the stack 3) Pushes the value to field I of the pointer on the stack
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitBitField (InterpState &S, CodePtr OpPC, const Record::Field *F)
 
bool clang::interp::GetPtrLocal (InterpState &S, CodePtr OpPC, uint32_t I)
 
bool clang::interp::GetPtrParam (InterpState &S, CodePtr OpPC, uint32_t I)
 
bool clang::interp::GetPtrGlobal (InterpState &S, CodePtr OpPC, uint32_t I)
 
bool clang::interp::GetPtrField (InterpState &S, CodePtr OpPC, uint32_t Off)
 1) Peeks a Pointer 2) Pushes Pointer.atField(Off) on the stack
 
bool clang::interp::GetPtrFieldPop (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::GetPtrThisField (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::GetPtrActiveField (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::GetPtrActiveThisField (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::GetPtrDerivedPop (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::GetPtrBase (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::GetPtrBasePop (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::GetMemberPtrBasePop (InterpState &S, CodePtr OpPC, int32_t Off)
 
bool clang::interp::GetPtrThisBase (InterpState &S, CodePtr OpPC, uint32_t Off)
 
bool clang::interp::FinishInitPop (InterpState &S, CodePtr OpPC)
 
bool clang::interp::FinishInit (InterpState &S, CodePtr OpPC)
 
bool clang::interp::Dump (InterpState &S, CodePtr OpPC)
 
bool clang::interp::VirtBaseHelper (InterpState &S, CodePtr OpPC, const RecordDecl *Decl, const Pointer &Ptr)
 
bool clang::interp::GetPtrVirtBasePop (InterpState &S, CodePtr OpPC, const RecordDecl *D)
 
bool clang::interp::GetPtrThisVirtBase (InterpState &S, CodePtr OpPC, const RecordDecl *D)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Load (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::LoadPop (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Store (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::StorePop (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::StoreBitField (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::StoreBitFieldPop (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Init (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitPop (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitElem (InterpState &S, CodePtr OpPC, uint32_t Idx)
 1) Pops the value from the stack 2) Peeks a pointer and gets its index \Idx 3) Sets the value on the pointer, leaving the pointer on the stack.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::InitElemPop (InterpState &S, CodePtr OpPC, uint32_t Idx)
 The same as InitElem, but pops the pointer as well.
 
bool clang::interp::Memcpy (InterpState &S, CodePtr OpPC)
 
bool clang::interp::ToMemberPtr (InterpState &S, CodePtr OpPC)
 
bool clang::interp::CastMemberPtrPtr (InterpState &S, CodePtr OpPC)
 
template<class T , ArithOp Op>
bool clang::interp::OffsetHelper (InterpState &S, CodePtr OpPC, const T &Offset, const Pointer &Ptr, bool IsPointerArith=false)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::AddOffset (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::SubOffset (InterpState &S, CodePtr OpPC)
 
template<ArithOp Op>
static bool clang::interp::IncDecPtrHelper (InterpState &S, CodePtr OpPC, const Pointer &Ptr)
 
static bool clang::interp::IncPtr (InterpState &S, CodePtr OpPC)
 
static bool clang::interp::DecPtr (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::SubPtr (InterpState &S, CodePtr OpPC)
 1) Pops a Pointer from the stack.
 
bool clang::interp::Destroy (InterpState &S, CodePtr OpPC, uint32_t I)
 
bool clang::interp::InitScope (InterpState &S, CodePtr OpPC, uint32_t I)
 
template<PrimType TIn, PrimType TOut>
bool clang::interp::Cast (InterpState &S, CodePtr OpPC)
 
bool clang::interp::CastFP (InterpState &S, CodePtr OpPC, const llvm::fltSemantics *Sem, llvm::RoundingMode RM)
 1) Pops a Floating from the stack.
 
bool clang::interp::CastFixedPoint (InterpState &S, CodePtr OpPC, uint32_t FPS)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CastAP (InterpState &S, CodePtr OpPC, uint32_t BitWidth)
 Like Cast(), but we cast to an arbitrary-bitwidth integral, so we need to know what bitwidth the result should be.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CastAPS (InterpState &S, CodePtr OpPC, uint32_t BitWidth)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CastIntegralFloating (InterpState &S, CodePtr OpPC, const llvm::fltSemantics *Sem, uint32_t FPOI)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CastFloatingIntegral (InterpState &S, CodePtr OpPC, uint32_t FPOI)
 
static bool clang::interp::CastFloatingIntegralAP (InterpState &S, CodePtr OpPC, uint32_t BitWidth, uint32_t FPOI)
 
static bool clang::interp::CastFloatingIntegralAPS (InterpState &S, CodePtr OpPC, uint32_t BitWidth, uint32_t FPOI)
 
bool clang::interp::CheckPointerToIntegralCast (InterpState &S, CodePtr OpPC, const Pointer &Ptr, unsigned BitWidth)
 
bool clang::interp::CastPointerIntegralAP (InterpState &S, CodePtr OpPC, uint32_t BitWidth)
 
bool clang::interp::CastPointerIntegralAPS (InterpState &S, CodePtr OpPC, uint32_t BitWidth)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CastPointerIntegral (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
static bool clang::interp::CastIntegralFixedPoint (InterpState &S, CodePtr OpPC, uint32_t FPS)
 
static bool clang::interp::CastFloatingFixedPoint (InterpState &S, CodePtr OpPC, uint32_t FPS)
 
static bool clang::interp::CastFixedPointFloating (InterpState &S, CodePtr OpPC, const llvm::fltSemantics *Sem)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
static bool clang::interp::CastFixedPointIntegral (InterpState &S, CodePtr OpPC)
 
static bool clang::interp::PtrPtrCast (InterpState &S, CodePtr OpPC, bool SrcIsVoidPtr)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Zero (InterpState &S, CodePtr OpPC)
 
static bool clang::interp::ZeroIntAP (InterpState &S, CodePtr OpPC, uint32_t BitWidth)
 
static bool clang::interp::ZeroIntAPS (InterpState &S, CodePtr OpPC, uint32_t BitWidth)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::Null (InterpState &S, CodePtr OpPC, uint64_t Value, const Descriptor *Desc)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::IsNonNull (InterpState &S, CodePtr OpPC)
 
bool clang::interp::This (InterpState &S, CodePtr OpPC)
 
bool clang::interp::RVOPtr (InterpState &S, CodePtr OpPC)
 
template<class LT , class RT , ShiftDir Dir>
bool clang::interp::DoShift (InterpState &S, CodePtr OpPC, LT &LHS, RT &RHS)
 
template<PrimType NameL, PrimType NameR>
bool clang::interp::Shr (InterpState &S, CodePtr OpPC)
 
template<PrimType NameL, PrimType NameR>
bool clang::interp::Shl (InterpState &S, CodePtr OpPC)
 
static bool clang::interp::ShiftFixedPoint (InterpState &S, CodePtr OpPC, bool Left)
 
bool clang::interp::NoRet (InterpState &S, CodePtr OpPC)
 
bool clang::interp::NarrowPtr (InterpState &S, CodePtr OpPC)
 
bool clang::interp::ExpandPtr (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::ArrayElemPtr (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::ArrayElemPtrPop (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::ArrayElem (InterpState &S, CodePtr OpPC, uint32_t Index)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::ArrayElemPop (InterpState &S, CodePtr OpPC, uint32_t Index)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CopyArray (InterpState &S, CodePtr OpPC, uint32_t SrcIndex, uint32_t DestIndex, uint32_t Size)
 
bool clang::interp::ArrayDecay (InterpState &S, CodePtr OpPC)
 Just takes a pointer and checks if it's an incomplete array type.
 
bool clang::interp::GetFnPtr (InterpState &S, CodePtr OpPC, const Function *Func)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::GetIntPtr (InterpState &S, CodePtr OpPC, const Descriptor *Desc)
 
bool clang::interp::GetMemberPtr (InterpState &S, CodePtr OpPC, const ValueDecl *D)
 
bool clang::interp::GetMemberPtrBase (InterpState &S, CodePtr OpPC)
 
bool clang::interp::GetMemberPtrDecl (InterpState &S, CodePtr OpPC)
 
bool clang::interp::Unsupported (InterpState &S, CodePtr OpPC)
 
bool clang::interp::Error (InterpState &S, CodePtr OpPC)
 Do nothing and just abort execution.
 
bool clang::interp::SideEffect (InterpState &S, CodePtr OpPC)
 
bool clang::interp::InvalidCast (InterpState &S, CodePtr OpPC, CastKind Kind, bool Fatal)
 Same here, but only for casts.
 
bool clang::interp::InvalidDeclRef (InterpState &S, CodePtr OpPC, const DeclRefExpr *DR, bool InitializerFailed)
 
bool clang::interp::SizelessVectorElementSize (InterpState &S, CodePtr OpPC)
 
bool clang::interp::Assume (InterpState &S, CodePtr OpPC)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::OffsetOf (InterpState &S, CodePtr OpPC, const OffsetOfExpr *E)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CheckNonNullArg (InterpState &S, CodePtr OpPC)
 
void clang::interp::diagnoseEnumValue (InterpState &S, CodePtr OpPC, const EnumDecl *ED, const APSInt &Value)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CheckEnumValue (InterpState &S, CodePtr OpPC, const EnumDecl *ED)
 
template<PrimType TIn, PrimType TOut>
bool clang::interp::DecayPtr (InterpState &S, CodePtr OpPC)
 OldPtr -> Integer -> NewPtr.
 
bool clang::interp::CheckDecl (InterpState &S, CodePtr OpPC, const VarDecl *VD)
 
bool clang::interp::Alloc (InterpState &S, CodePtr OpPC, const Descriptor *Desc)
 
template<PrimType Name, class SizeT = typename PrimConv<Name>::T>
bool clang::interp::AllocN (InterpState &S, CodePtr OpPC, PrimType T, const Expr *Source, bool IsNoThrow)
 
template<PrimType Name, class SizeT = typename PrimConv<Name>::T>
bool clang::interp::AllocCN (InterpState &S, CodePtr OpPC, const Descriptor *ElementDesc, bool IsNoThrow)
 
bool clang::interp::Free (InterpState &S, CodePtr OpPC, bool DeleteIsArrayForm, bool IsGlobalDelete)
 
static bool clang::interp::IsConstantContext (InterpState &S, CodePtr OpPC)
 
static bool clang::interp::CheckAllocations (InterpState &S, CodePtr OpPC)
 
bool clang::interp::CheckNewTypeMismatch (InterpState &S, CodePtr OpPC, const Expr *E, std::optional< uint64_t > ArraySize=std::nullopt)
 Check if the initializer and storage types of a placement-new expression match.
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::CheckNewTypeMismatchArray (InterpState &S, CodePtr OpPC, const Expr *E)
 
bool clang::interp::InvalidNewDeleteExpr (InterpState &S, CodePtr OpPC, const Expr *E)
 
template<PrimType Name, class T = typename PrimConv<Name>::T>
bool clang::interp::BitCastPrim (InterpState &S, CodePtr OpPC, bool TargetIsUCharOrByte, uint32_t ResultBitWidth, const llvm::fltSemantics *Sem)
 
bool clang::interp::BitCast (InterpState &S, CodePtr OpPC)
 
template<typename T >
clang::interp::ReadArg (InterpState &S, CodePtr &OpPC)
 
template<>
Floating clang::interp::ReadArg< Floating > (InterpState &S, CodePtr &OpPC)
 
template<>
IntegralAP< falseclang::interp::ReadArg< IntegralAP< false > > (InterpState &S, CodePtr &OpPC)
 
template<>
IntegralAP< trueclang::interp::ReadArg< IntegralAP< true > > (InterpState &S, CodePtr &OpPC)