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)
75 assert(Idx < Globals.size());
76 return Globals[Idx]->block();
96 bool IsConstexprUnknown =
false);
102 template <
typename... Ts>
105 auto *
Func =
new Function(*
this, Def, std::forward<Ts>(Args)...);
106 Funcs.insert({Def, std::unique_ptr<Function>(
Func)});
111 auto *
Func =
new Function(*
this, std::forward<Ts>(Args)...);
112 AnonFuncs.emplace_back(
Func);
124 const Type *SourceTy =
nullptr,
126 bool IsConst =
false,
bool IsTemporary =
false,
127 bool IsMutable =
false,
128 bool IsVolatile =
false) {
129 return allocateDescriptor(D, SourceTy,
T, MDSize, IsConst, IsTemporary,
130 IsMutable, IsVolatile);
136 bool IsConst =
false,
bool IsTemporary =
false,
137 bool IsMutable =
false,
bool IsVolatile =
false,
140 void *
Allocate(
size_t Size,
unsigned Align = 8)
const {
141 return Allocator.Allocate(Size, Align);
153 P.CurrentDeclaration = P.LastDeclaration;
164 if (CurrentDeclaration == NoDeclaration)
166 return CurrentDeclaration;
173 bool IsExtern,
bool IsWeak,
174 bool IsConstexprUnknown,
180 llvm::DenseMap<const FunctionDecl *, std::unique_ptr<Function>> Funcs;
182 std::vector<std::unique_ptr<Function>> AnonFuncs;
185 std::vector<const void *> NativePointers;
187 llvm::DenseMap<const void *, unsigned> NativePointerIndices;
190 using PoolAllocTy = llvm::BumpPtrAllocator;
198 template <
typename... Tys>
202 void *
operator new(
size_t Meta, PoolAllocTy &
Alloc,
size_t Data) {
203 return Alloc.Allocate(Meta +
Data,
alignof(
void *));
207 std::byte *data() {
return B.
data(); }
209 Block *block() {
return &B; }
210 const Block *block()
const {
return &B; }
217 mutable PoolAllocTy Allocator;
220 std::vector<Global *> Globals;
222 llvm::DenseMap<const void *, unsigned> GlobalIndices;
225 llvm::DenseMap<const RecordDecl *, Record *> Records;
228 llvm::DenseMap<const void *, unsigned> DummyVariables;
231 template <
typename... Ts> Descriptor *allocateDescriptor(Ts &&...Args) {
232 return new (Allocator) Descriptor(std::forward<Ts>(Args)...);
236 static constexpr unsigned NoDeclaration = ~0u;
238 unsigned LastDeclaration = 0;
240 unsigned CurrentDeclaration = NoDeclaration;
245 void dump(llvm::raw_ostream &OS)
const;
252 size_t Alignment = 8) {
253 return C.Allocate(Bytes, Alignment);
261 size_t Alignment = 8) {
262 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.
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
A (possibly-)qualified type.
Represents a struct/union/class.
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.
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.
unsigned getOrCreateNativePointer(const void *Ptr)
Marshals a native pointer to an ID for embedding in bytecode.
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().
const void * getNativePointer(unsigned Idx) const
Returns the value of a marshalled native pointer.
T * Allocate(size_t Num=1) const
void Deallocate(void *Ptr) const
unsigned createGlobalString(const StringLiteral *S, const Expr *Base=nullptr)
Emits a string literal among global data.
Function * createFunction(Ts &&...Args)
Creates an anonymous function.
Descriptor * createDescriptor(DeclOrExpr D, PrimType T, const Type *SourceTy=nullptr, Descriptor::MetadataSize MDSize=std::nullopt, bool IsConst=false, bool IsTemporary=false, bool IsMutable=false, bool IsVolatile=false)
Creates a descriptor for a primitive type.
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.
std::optional< unsigned > MetadataSize