13#ifndef LLVM_CLANG_AST_INTERP_PROGRAM_H
14#define LLVM_CLANG_AST_INTERP_PROGRAM_H
21#include "llvm/ADT/DenseMap.h"
22#include "llvm/Support/Allocator.h"
44 for (Global *G : Globals)
51 for (
auto RecordPair : Records) {
52 if (
Record *R = RecordPair.second)
74 assert(Idx < Globals.size());
75 return Globals[Idx]->block();
95 bool IsConstexprUnknown =
false);
101 template <
typename... Ts>
104 auto *
Func =
new Function(*
this, Def, std::forward<Ts>(Args)...);
105 Funcs.insert({Def, std::unique_ptr<Function>(
Func)});
110 auto *
Func =
new Function(*
this, std::forward<Ts>(Args)...);
111 AnonFuncs.emplace_back(
Func);
123 const Type *SourceTy =
nullptr,
125 bool IsConst =
false,
bool IsTemporary =
false,
126 bool IsMutable =
false,
127 bool IsVolatile =
false) {
128 return allocateDescriptor(D, SourceTy, T, MDSize, IsConst, IsTemporary,
129 IsMutable, IsVolatile);
135 bool IsConst =
false,
bool IsTemporary =
false,
136 bool IsMutable =
false,
bool IsVolatile =
false,
139 void *
Allocate(
size_t Size,
unsigned Align = 8)
const {
140 return Allocator.Allocate(Size, Align);
143 return static_cast<T *
>(
Allocate(
Num *
sizeof(T),
alignof(T)));
152 P.CurrentDeclaration = P.LastDeclaration;
163 if (CurrentDeclaration == NoDeclaration)
165 return CurrentDeclaration;
172 bool IsExtern,
bool IsWeak,
173 bool IsConstexprUnknown,
179 llvm::DenseMap<const FunctionDecl *, std::unique_ptr<Function>> Funcs;
181 std::vector<std::unique_ptr<Function>> AnonFuncs;
184 std::vector<const void *> NativePointers;
186 llvm::DenseMap<const void *, unsigned> NativePointerIndices;
189 using PoolAllocTy = llvm::BumpPtrAllocator;
197 template <
typename... Tys>
201 void *
operator new(
size_t Meta, PoolAllocTy &
Alloc,
size_t Data) {
202 return Alloc.Allocate(Meta +
Data,
alignof(
void *));
206 std::byte *data() {
return B.
data(); }
208 Block *block() {
return &B; }
209 const Block *block()
const {
return &B; }
216 mutable PoolAllocTy Allocator;
219 std::vector<Global *> Globals;
221 llvm::DenseMap<const void *, unsigned> GlobalIndices;
224 llvm::DenseMap<const RecordDecl *, Record *> Records;
227 llvm::DenseMap<const void *, unsigned> DummyVariables;
230 template <
typename... Ts> Descriptor *allocateDescriptor(Ts &&...Args) {
231 return new (Allocator) Descriptor(std::forward<Ts>(Args)...);
235 static constexpr unsigned NoDeclaration = ~0u;
237 unsigned LastDeclaration = 0;
239 unsigned CurrentDeclaration = NoDeclaration;
244 void dump(llvm::raw_ostream &OS)
const;
251 size_t Alignment = 8) {
252 return C.Allocate(Bytes, Alignment);
260 size_t Alignment = 8) {
261 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
unsigned getOrCreateDummy(const DeclTy &D, bool IsConstexprUnknown=false)
Returns or creates a dummy value for unknown declarations.
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 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
Descriptor * createDescriptor(const DeclTy &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.
unsigned createGlobalString(const StringLiteral *S, const Expr *Base=nullptr)
Emits a string literal among global data.
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.
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
PrimType
Enumeration of the primitive types of the VM.
bool Alloc(InterpState &S, CodePtr OpPC, const Descriptor *Desc)
bool Init(InterpState &S, CodePtr OpPC)
The JSON file list parser is used to communicate input to InstallAPI.
OptionalUnsigned< unsigned > UnsignedOrNone
Describes a memory block created by an allocation site.
std::optional< unsigned > MetadataSize