27 : Caller(Caller), S(S), Depth(Caller ? Caller->Depth + 1 : 0),
Func(
Func),
28 RetPC(RetPC), ArgSize(ArgSize), Args(static_cast<char *>(S.Stk.top())),
29 FrameOffset(S.Stk.size()) {
33 unsigned FrameSize =
Func->getFrameSize();
37 Locals = std::make_unique<char[]>(FrameSize);
41 new (localBlock(Local.Offset))
Block(S.Ctx.getEvalID(), Local.Desc);
58 RVOPtr = stackRef<Pointer>(0);
60 if (
Func->hasThisPointer()) {
62 This = stackRef<Pointer>(
sizeof(
Pointer));
64 This = stackRef<Pointer>(0);
69 for (
auto &Param : Params)
78 Block *B = localBlock(Local.Offset);
110 auto printDesc = [&OS, &Ctx](
const Descriptor *Desc) {
111 if (
const auto *
D = Desc->asDecl()) {
113 if (
const auto *VD = dyn_cast<ValueDecl>(
D)) {
118 if (isa<RecordDecl>(
D))
122 if (
const auto *
E = Desc->asExpr()) {
126 llvm_unreachable(
"Invalid descriptor type");
132 for (
Pointer F =
P; !F.isRoot(); ) {
134 F = F.isArrayElement() ? F.getArray().expand() : F.getBase();
139 Levels.erase(Levels.begin());
141 printDesc(
P.getDeclDesc());
142 for (
const auto &It : Levels) {
144 OS <<
"[" << It.expand().getIndex() <<
"]";
147 if (
auto Index = It.getIndex()) {
148 OS <<
" + " << Index;
152 printDesc(It.getFieldDesc());
163 F && (F->isBuiltin() || F->isLambdaStaticInvoker()))
167 if (
const auto *M = dyn_cast<CXXMethodDecl>(F);
168 M && M->isInstance() && !isa<CXXConstructorDecl>(F)) {
181 for (
unsigned I = 0, N = F->
getNumParams(); I < N; ++I) {
216 assert(Offset < Func->getFrameSize() &&
"Invalid local offset.");
217 return Pointer(localBlock(Offset));
222 if (
auto Pt = Params.find(Off); Pt != Params.end())
223 return Pointer(
reinterpret_cast<Block *
>(Pt->second.get()));
227 size_t BlockSize =
sizeof(
Block) + Desc.second->getAllocSize();
228 auto Memory = std::make_unique<char[]>(BlockSize);
233 TYPE_SWITCH(Desc.first, new (B->data())
T(stackRef<T>(Off)));
236 Params.insert({Off, std::move(Memory)});
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
static void print(llvm::raw_ostream &OS, const T &V, ASTContext &, QualType)
#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
const clang::PrintingPolicy & getPrintingPolicy() const
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
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.
A (possibly-)qualified type.
Encodes a location in the source.
A trivial tuple used to represent a source range.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
bool isReferenceType() const
A memory block, either on the stack or in the heap.
void invokeDtor()
Invokes the Destructor.
void invokeCtor()
Invokes the constructor.
bool isInitialized() const
Returns whether the data of this block has been initialized via invoking the Ctor func.
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.
const FunctionDecl * getDecl() const
Returns the original FunctionDecl.
bool hasBody() const
Checks if the function already has a body attached.
bool hasThisPointer() const
llvm::iterator_range< arg_reverse_iterator > args_reverse() const
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.
void popArgs()
Pops the arguments off the stack.
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.
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.
InterpFrame(InterpState &S, const Function *Func, InterpFrame *Caller, CodePtr RetPC, unsigned ArgSize)
Creates a new frame for a method call.
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.
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.
void discard()
Discards the top value from the stack.
Context & Ctx
Interpreter Context.
SourceInfo getSource(const Function *F, CodePtr PC) const override
Delegates source mapping to the mapper.
InterpStack & Stk
Temporary stack.
SourceLocation EvalLocation
Source location of the evaluating expression.
void deallocate(Block *B)
Deallocates a pointer.
ASTContext & getCtx() const override
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.
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...
Describes a memory block created by an allocation site.
Inline descriptor embedded in structures and arrays.