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();
89 bool IsConstexprUnknown =
false);
95 template <
typename... Ts>
99 Function(Def, std::forward<Ts>(Args)...);
100 Funcs.insert({Def,
Func});
106 AnonFuncs.emplace_back(
Func);
118 const Type *SourceTy =
nullptr,
119 bool IsConst =
false,
bool IsTemporary =
false,
120 bool IsMutable =
false,
121 bool IsVolatile =
false) {
122 return allocateDescriptor(D, SourceTy,
T, IsConst, IsTemporary, IsMutable,
128 bool IsConst =
false,
bool IsTemporary =
false,
129 bool IsMutable =
false,
bool IsVolatile =
false,
132 void *
Allocate(
size_t Size,
unsigned Align = 8)
const {
133 return Allocator.Allocate(Size, Align);
145 P.CurrentDeclaration = P.LastDeclaration;
156 if (CurrentDeclaration == NoDeclaration)
158 return CurrentDeclaration;
165 bool IsExtern,
bool IsWeak,
166 bool IsConstexprUnknown,
172 llvm::DenseMap<const FunctionDecl *, Function *> Funcs;
174 std::vector<std::unique_ptr<Function>> AnonFuncs;
177 using PoolAllocTy = llvm::BumpPtrAllocator;
185 template <
typename... Tys>
189 void *
operator new(
size_t Meta, PoolAllocTy &
Alloc,
size_t Data) {
190 return Alloc.Allocate(Meta +
Data,
alignof(
void *));
194 std::byte *data() {
return B.
data(); }
196 Block *block() {
return &B; }
197 const Block *block()
const {
return &B; }
204 mutable PoolAllocTy Allocator;
207 std::vector<Global *> Globals;
209 llvm::DenseMap<const void *, unsigned> GlobalIndices;
212 llvm::DenseMap<const RecordDecl *, Record *> Records;
215 llvm::DenseMap<const void *, unsigned> DummyVariables;
218 template <
typename... Ts> Descriptor *allocateDescriptor(Ts &&...Args) {
219 return new (Allocator) Descriptor(std::forward<Ts>(Args)...);
223 static constexpr unsigned NoDeclaration = ~0u;
225 unsigned LastDeclaration = 0;
227 unsigned CurrentDeclaration = NoDeclaration;
232 void dump(llvm::raw_ostream &OS)
const;
239 size_t Alignment = 8) {
240 return C.Allocate(Bytes, Alignment);
248 size_t Alignment = 8) {
249 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.
unsigned getOrCreateDummy(DeclOrExpr D, bool IsConstexprUnknown=false)
Returns or creates a dummy value for unknown declarations.
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.