15#ifndef LLVM_CLANG_AST_INTERP_FUNCTION_H
16#define LLVM_CLANG_AST_INTERP_FUNCTION_H
23#include "llvm/ADT/PointerUnion.h"
24#include "llvm/Support/raw_ostream.h"
52 llvm::iterator_range<LocalVectorTy::const_iterator>
locals()
const {
53 return llvm::make_range(Descriptors.begin(), Descriptors.end());
56 llvm::iterator_range<LocalVectorTy::const_reverse_iterator>
58 return llvm::reverse(Descriptors);
67 llvm::PointerUnion<const FunctionDecl *, const BlockExpr *>;
130 return dyn_cast<const FunctionDecl *>(Source);
133 return dyn_cast<const BlockExpr *>(Source);
154 llvm::iterator_range<llvm::SmallVector<Scope, 2>::const_iterator>
156 return llvm::make_range(Scopes.begin(), Scopes.end());
163 return llvm::reverse(ParamDescriptors);
204 if (
const auto *MD = dyn_cast_if_present<CXXMethodDecl>(
205 dyn_cast<const FunctionDecl *>(Source)))
236 if (
const auto *MD = dyn_cast_if_present<CXXMethodDecl>(
237 dyn_cast<const FunctionDecl *>(Source)))
238 return MD->isExplicitObjectMemberFunction();
243 return ParamDescriptors[ParamIndex].Offset;
247 return ParamDescriptors[ParamIndex].T;
254 bool HasThisPointer,
bool HasRVO,
bool IsLambdaStaticInvoker);
261 this->Source = Source;
262 FrameSize = NewFrameSize;
263 Code = std::move(NewCode);
264 SrcMap = std::move(NewSrcMap);
265 Scopes = std::move(NewScopes);
266 IsValid = NewIsValid;
267 HasBody = NewHasBody;
270 void setIsFullyCompiled(
bool FC) { IsFullyCompiled = FC; }
271 void setDefined(
bool D) { Defined = D; }
285 unsigned FrameSize = 0;
297 llvm::DenseMap<unsigned, ParamDescriptor> Params;
299 LLVM_PREFERRED_TYPE(
bool)
300 unsigned IsValid : 1;
303 LLVM_PREFERRED_TYPE(
bool)
304 unsigned IsFullyCompiled : 1;
307 LLVM_PREFERRED_TYPE(
bool)
308 unsigned HasThisPointer : 1;
312 LLVM_PREFERRED_TYPE(
bool)
315 LLVM_PREFERRED_TYPE(
bool)
316 unsigned HasBody : 1;
317 LLVM_PREFERRED_TYPE(
bool)
318 unsigned Defined : 1;
319 LLVM_PREFERRED_TYPE(
bool)
320 unsigned Variadic : 1;
321 LLVM_PREFERRED_TYPE(
bool)
322 unsigned Virtual : 1;
323 LLVM_PREFERRED_TYPE(
bool)
324 unsigned Immediate : 1;
325 LLVM_PREFERRED_TYPE(
bool)
326 unsigned Constexpr : 1;
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Represents a C++ struct/union/class.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Represents a function declaration or definition.
std::string getQualifiedNameAsString() const
An emitter which links the program to bytecode for later use.
Pointer into the code segment.
Scope & getScope(unsigned Idx)
Returns a specific scope.
CodePtr getCodeBegin() const
Returns a pointer to the start of the code.
bool isDestructor() const
Checks if the function is a destructor.
CodePtr getCodeEnd() const
Returns a pointer to the end of the code.
friend class ByteCodeEmitter
std::string getName() const
Returns the name of the function decl this code was generated for.
bool isVirtual() const
Checks if the function is virtual.
unsigned getNumParams() const
bool isDefined() const
Checks if the function is defined.
bool hasNonNullAttr() const
PrimType getParamType(unsigned ParamIndex) const
const CXXRecordDecl * getParentDecl() const
Returns the parent record decl, if any.
unsigned getFrameSize() const
Returns the size of the function's local stack.
bool isLambdaCallOperator() const
Returns whether this function is the call operator of a lambda record decl.
const BlockExpr * getExpr() const
bool isFullyCompiled() const
Checks if the function is fully done compiling.
bool isConstructor() const
Checks if the function is a constructor.
unsigned getParamOffset(unsigned ParamIndex) const
const FunctionDecl * getDecl() const
Returns the original FunctionDecl.
bool hasBody() const
Checks if the function already has a body attached.
bool hasThisPointer() const
void dump(CodePtr PC={}) const
Dumps the disassembled bytecode to llvm::errs().
void dump(llvm::raw_ostream &OS, CodePtr PC={}) const
llvm::iterator_range< arg_reverse_iterator > args_reverse() const
const Scope & getScope(unsigned Idx) const
bool isThisPointerExplicit() const
unsigned getNumWrittenParams() const
Returns the number of parameter this function takes when it's called, i.e excluding the instance poin...
unsigned getWrittenArgSize() const
unsigned getArgSize() const
Returns the size of the argument stack.
bool isLambdaStaticInvoker() const
Returns whether this function is a lambda static invoker, which we generate custom byte code for.
SourceInfo getSource(CodePtr PC) const
Returns the source information at a given PC.
ParamDescriptor getParamDescriptor(unsigned Offset) const
Returns a parameter descriptor.
bool isValid() const
Checks if the function is valid to call.
bool isCopyOrMoveOperator() const
Checks if the function is copy or move operator.
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.
SmallVectorImpl< ParamDescriptor >::const_reverse_iterator arg_reverse_iterator
Range over argument types.
A pointer to a memory block, live or dead.
The program contains and links the bytecode for all functions.
llvm::SmallVector< Local, 8 > LocalVectorTy
llvm::iterator_range< LocalVectorTy::const_iterator > locals() const
Scope(LocalVectorTy &&Descriptors)
llvm::iterator_range< LocalVectorTy::const_reverse_iterator > locals_reverse() const
Describes the statement/declaration an opcode was generated from.
constexpr size_t align(size_t Size)
Aligns a size to the pointer alignment.
llvm::PointerUnion< const FunctionDecl *, const BlockExpr * > FunctionDeclTy
PrimType
Enumeration of the primitive types of the VM.
std::vector< std::pair< unsigned, SourceInfo > > SourceMap
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.
Describes a memory block created by an allocation site.
ParamDescriptor(const Descriptor *Desc, unsigned Offset, PrimType T)
Information about a local's storage.
unsigned Offset
Offset of the local in frame.
bool EnabledByDefault
If the cleanup for this local should be emitted.
Descriptor * Desc
Descriptor of the local.