13#ifndef LLVM_CLANG_AST_INTERP_PROGRAM_H
14#define LLVM_CLANG_AST_INTERP_PROGRAM_H
22#include "llvm/ADT/DenseMap.h"
23#include "llvm/Support/Allocator.h"
45 for (Global *G : Globals)
52 for (
const auto &RecordPair : Records) {
53 if (
Record *R = RecordPair.second)
68 assert(Idx < Globals.size());
69 return Globals[Idx]->block();
86 bool IsConstexprUnknown =
false);
92 template <
typename... Ts>
96 Function(Def, std::forward<Ts>(Args)...);
97 Funcs.insert({Def,
Func});
103 AnonFuncs.emplace_back(
Func);
115 const Type *SourceTy =
nullptr,
116 bool IsConst =
false,
bool IsTemporary =
false,
117 bool IsMutable =
false,
118 bool IsVolatile =
false) {
119 return allocateDescriptor(D, SourceTy,
T, IsConst, IsTemporary, IsMutable,
125 bool IsConst =
false,
bool IsTemporary =
false,
126 bool IsMutable =
false,
bool IsVolatile =
false,
129 void *
Allocate(
size_t Size,
unsigned Align = 8)
const {
130 return Allocator.Allocate(Size, Align);
142 P.CurrentDeclaration = P.LastDeclaration;
153 if (CurrentDeclaration == NoDeclaration)
155 return CurrentDeclaration;
162 bool IsExtern,
bool IsWeak,
163 bool IsConstexprUnknown,
169 llvm::DenseMap<const FunctionDecl *, Function *> Funcs;
171 std::vector<std::unique_ptr<Function>> AnonFuncs;
174 using PoolAllocTy = llvm::BumpPtrAllocator;
182 template <
typename... Tys>
186 void *
operator new(
size_t Meta, PoolAllocTy &
Alloc,
size_t Data) {
187 return Alloc.Allocate(Meta +
Data,
alignof(
void *));
191 std::byte *data() {
return B.
data(); }
193 Block *block() {
return &B; }
194 const Block *block()
const {
return &B; }
201 mutable PoolAllocTy Allocator;
204 std::vector<Global *> Globals;
206 llvm::DenseMap<const void *, unsigned> GlobalIndices;
209 llvm::DenseMap<const RecordDecl *, Record *> Records;
212 template <
typename... Ts> Descriptor *allocateDescriptor(Ts &&...Args) {
213 return new (Allocator) Descriptor(std::forward<Ts>(Args)...);
217 static constexpr unsigned NoDeclaration = ~0u;
219 unsigned LastDeclaration = 0;
221 unsigned CurrentDeclaration = NoDeclaration;
226 void dump(llvm::raw_ostream &OS)
const;
233 size_t Alignment = 8) {
234 return C.Allocate(Bytes, Alignment);
242 size_t Alignment = 8) {
243 return C.Allocate(Bytes, Alignment);
__SIZE_TYPE__ size_t
The unsigned integer type of the result of the sizeof operator.
This represents one expression.
Represents a function declaration or definition.
A (possibly-)qualified type.
Represents a struct/union/class.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
StringLiteral - This represents a string literal expression, e.g.
The base class of the type hierarchy.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
A memory block, either on the stack or in the heap.
std::byte * data()
Returns a pointer to the stored data.
bool isInitialized() const
Returns whether the data of this block has been initialized via invoking the Ctor func.
Holds all information required to evaluate constexpr code in a module.
A pointer to a memory block, live or dead.
bool isInitialized() const
Checks if an object was initialized.
Context to manage declaration lifetimes.
The program contains and links the bytecode for all functions.
UnsignedOrNone createGlobal(const ValueDecl *VD, const Expr *Init, bool IsConstexprUnknown=false)
Creates a global and returns its index.
void * Allocate(size_t Size, unsigned Align=8) const
Function * getFunction(const FunctionDecl *F)
Returns a function.
Block * getGlobal(unsigned Idx)
Returns the value of a global.
Descriptor * createDescriptor(DeclOrExpr D, PrimType T, const Type *SourceTy=nullptr, bool IsConst=false, bool IsTemporary=false, bool IsMutable=false, bool IsVolatile=false)
Creates a descriptor for a primitive type.
const Context & getContext() const
UnsignedOrNone getOrCreateGlobal(const ValueDecl *VD, const Expr *Init=nullptr)
Returns or creates a global an creates an index to it.
Function * createFunction(const FunctionDecl *Def, Ts &&...Args)
Creates a new function from a code range.
bool isGlobalInitialized(unsigned Index) const
Pointer getPtrGlobal(unsigned Idx) const
Returns a pointer to a global.
void dump() const
Dumps the disassembled bytecode to llvm::errs().
T * Allocate(size_t Num=1) const
void Deallocate(void *Ptr) const
Function * createFunction(Ts &&...Args)
Creates an anonymous function.
UnsignedOrNone getCurrentDecl() const
Returns the current declaration ID.
Record * getOrCreateRecord(const RecordDecl *RD)
Returns a record or creates one if it does not exist.
Structure/Class descriptor.
PrimType
Enumeration of the primitive types of the VM.
bool Alloc(InterpState &S, CodePtr OpPC, const Descriptor *Desc)
bool Init(InterpState &S, CodePtr OpPC)
Top level wrappers for InstallAPI frontend operations.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
Describes a memory block created by an allocation site.