;
27: Caller(nullptr), S(S), Depth(0),
Func(nullptr), RetPC(
CodePtr()),
28ArgSize(0), Args(nullptr), FrameOffset(0), IsBottom(
true) {}
32: Caller(Caller), S(S), Depth(Caller ? Caller->Depth + 1 : 0),
Func(
Func),
33RetPC(RetPC), ArgSize(ArgSize), Args(static_cast<char *>(S.Stk.top())),
34FrameOffset(S.Stk.size()), IsBottom(!Caller) {
38 unsignedFrameSize =
Func->getFrameSize();
42Locals = std::make_unique<char[]>(FrameSize);
45 new(localBlock(Local.Offset))
Block(S.Ctx.getEvalID(), Local.Desc);
63RVOPtr = stackRef<Pointer>(0);
65 if(
Func->hasThisPointer()) {
67This = stackRef<Pointer>(
sizeof(
Pointer));
69This = stackRef<Pointer>(0);
74 for(
auto&Param : Params)
107template<
typenameT>
110 V.toAPValue(ASTCtx).printPretty(OS, ASTCtx, Ty);
137 boolIsMemberCall = isa<CXXMethodDecl>(F) && !isa<CXXConstructorDecl>(F) &&
138cast<CXXMethodDecl>(F)->isImplicitObjectMemberFunction();
140 if(
const auto*MCE = dyn_cast_if_present<CXXMemberCallExpr>(
CallExpr)) {
141 const Expr*Object = MCE->getImplicitObjectArgument();
142Object->printPretty(OS,
nullptr,
145 if(Object->getType()->isPointerType())
149}
else if(
const auto*OCE =
150dyn_cast_if_present<CXXOperatorCallExpr>(
CallExpr)) {
151OCE->getArg(0)->printPretty(OS,
nullptr,
155}
else if(
const auto*M = dyn_cast<CXXMethodDecl>(F)) {
171 for(
unsignedI = 0, N = F->
getNumParams(); I < N; ++I) {
206assert(Offset < Func->getFrameSize() &&
"Invalid local offset.");
207 return Pointer(localBlock(Offset));
212 if(
autoPt = Params.find(Off); Pt != Params.end())
213 return Pointer(
reinterpret_cast<Block*
>(Pt->second.get()));
217 size_tBlockSize =
sizeof(
Block) + Desc.second->getAllocSize();
218 autoMemory = std::make_unique<char[]>(BlockSize);
223 TYPE_SWITCH(Desc.first, new (B->data())
T(stackRef<T>(Off)));
226Params.insert({Off, std::move(Memory)});
278 if(DC->isStdNamespace())
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
static void print(llvm::raw_ostream &OS, const T &V, ASTContext &ASTCtx, QualType Ty)
static bool shouldSkipInBacktrace(const Function *F)
static bool funcHasUsableBody(const Function *F)
#define TYPE_SWITCH(Expr, B)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getRecordType(const RecordDecl *Decl) const
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
const clang::PrintingPolicy & getPrintingPolicy() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
This represents one expression.
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
A (possibly-)qualified type.
Encodes a location in the source.
A trivial tuple used to represent a source range.
A memory block, either on the stack or in the heap.
void invokeCtor()
Invokes the constructor.
Pointer into the code segment.
std::optional< PrimType > classify(QualType T) const
Classifies a type.
unsigned getEvalID() const
Base class for stack frames, shared between VM and walker.
Scope & getScope(unsigned Idx)
Returns a specific scope.
bool isDestructor() const
Checks if the function is a destructor.
bool isConstructor() const
Checks if the function is a constructor.
const FunctionDecl * getDecl() const
Returns the original FunctionDecl.
bool hasThisPointer() const
bool isLambdaStaticInvoker() const
Returns whether this function is a lambda static invoker, which we generate custom byte code for.
ParamDescriptor getParamDescriptor(unsigned Offset) const
Returns a parameter descriptor.
llvm::iterator_range< llvm::SmallVector< Scope, 2 >::const_iterator > scopes() const
Range over the scope blocks.
bool hasRVO() const
Checks if the first argument is a RVO pointer.
Frame storing local variables.
InterpFrame(InterpState &S)
Bottom Frame.
const Expr * getExpr(CodePtr PC) const
InterpFrame * Caller
The frame of the previous function.
virtual SourceInfo getSource(CodePtr PC) const
Map a location to a source.
CodePtr getRetPC() const
Returns the return address of the frame.
SourceLocation getLocation(CodePtr PC) const
~InterpFrame()
Destroys the frame, killing all live pointers to stack slots.
const Function * getFunction() const
Returns the current function.
SourceRange getRange(CodePtr PC) const
Pointer getLocalPointer(unsigned Offset) const
Returns a pointer to a local variables.
Frame * getCaller() const override
Returns the parent frame object.
void destroy(unsigned Idx)
Invokes the destructors for a scope.
Pointer getParamPointer(unsigned Offset)
Returns a pointer to an argument - lazily creates a block.
const FunctionDecl * getCallee() const override
Returns the caller.
bool isStdFunction() const
void initScope(unsigned Idx)
SourceRange getCallRange() const override
Returns the location of the call to the frame.
void describe(llvm::raw_ostream &OS) const override
Describes the frame with arguments for diagnostic purposes.
Context & Ctx
Interpreter Context.
ASTContext & getASTContext() const override
SourceInfo getSource(const Function *F, CodePtr PC) const override
Delegates source mapping to the mapper.
SourceLocation EvalLocation
Source location of the evaluating expression.
void deallocate(Block *B)
Deallocates a pointer.
A pointer to a memory block, live or dead.
llvm::iterator_range< LocalVectorTy::const_iterator > locals() const
Describes the statement/declaration an opcode was generated from.
SourceLocation getLocation(const Function *F, CodePtr PC) const
Returns the location from which an opcode originates.
SourceRange getRange(const Function *F, CodePtr PC) const
const Expr * getExpr(const Function *F, CodePtr PC) const
Returns the expression if an opcode belongs to one, null otherwise.
constexpr size_t align(size_t Size)
Aligns a size to the pointer alignment.
PrimType
Enumeration of the primitive types of the VM.
size_t primSize(PrimType Type)
Returns the size of a primitive type in bytes.
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
const FunctionProtoType * T
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Inline descriptor embedded in structures and arrays.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4