13#ifndef LLVM_CLANG_AST_INTERP_PROGRAM_H
14#define LLVM_CLANG_AST_INTERP_PROGRAM_H
23#include "llvm/ADT/DenseMap.h"
24#include "llvm/Support/Allocator.h"
46 for (Global *G : Globals)
53 for (
const auto &RecordPair : Records) {
54 if (
Record *R = RecordPair.second)
69 assert(Idx < Globals.size());
70 return Globals[Idx]->block();
87 bool IsConstexprUnknown =
false);
93 template <
typename... Ts>
97 Function(Def, std::forward<Ts>(Args)...);
98 Funcs.insert({Def,
Func});
104 AnonFuncs.emplace_back(
Func);
116 const Type *SourceTy =
nullptr,
117 bool IsConst =
false,
bool IsTemporary =
false,
118 bool IsMutable =
false,
119 bool IsVolatile =
false) {
120 return allocateDescriptor(D, SourceTy,
T, IsConst, IsTemporary, IsMutable,
126 bool IsConst =
false,
bool IsTemporary =
false,
127 bool IsMutable =
false,
bool IsVolatile =
false,
130 void *
Allocate(
size_t Size,
unsigned Align = 8)
const {
131 return Allocator.Allocate(Size, Align);
143 P.CurrentDeclaration = P.LastDeclaration;
154 if (CurrentDeclaration == NoDeclaration)
156 return CurrentDeclaration;
163 bool IsExtern,
bool IsWeak,
164 bool IsConstexprUnknown,
170 llvm::DenseMap<const FunctionDecl *, Function *> Funcs;
172 std::vector<std::unique_ptr<Function>> AnonFuncs;
175 using PoolAllocTy = llvm::BumpPtrAllocator;
183 template <
typename... Tys>
187 void *
operator new(
size_t Meta, PoolAllocTy &
Alloc,
size_t Data) {
188 return Alloc.Allocate(Meta +
Data,
alignof(
void *));
192 std::byte *data() {
return B.
data(); }
194 Block *block() {
return &B; }
195 const Block *block()
const {
return &B; }
202 mutable PoolAllocTy Allocator;
205 std::vector<Global *> Globals;
207 llvm::DenseMap<const void *, unsigned> GlobalIndices;
210 llvm::DenseMap<const RecordDecl *, Record *> Records;
213 template <
typename... Ts> Descriptor *allocateDescriptor(Ts &&...Args) {
214 return new (Allocator) Descriptor(std::forward<Ts>(Args)...);
218 static constexpr unsigned NoDeclaration = ~0u;
220 unsigned LastDeclaration = 0;
222 unsigned CurrentDeclaration = NoDeclaration;
227 void dump(llvm::raw_ostream &OS)
const;
234 size_t Alignment = 8) {
235 return C.Allocate(Bytes, Alignment);
243 size_t Alignment = 8) {
244 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.