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/ADT/PointerUnion.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/Support/Allocator.h"
54 for (
auto RecordPair :
Records) {
55 if (
Record *R = RecordPair.second)
74 assert(Idx < Globals.size());
75 return Globals[Idx]->block();
96 template <
typename... Ts>
99 auto *
Func =
new Function(*
this, Def, std::forward<Ts>(Args)...);
100 Funcs.insert({Def, std::unique_ptr<Function>(
Func)});
104 template <
typename... Ts>
106 auto *
Func =
new Function(*
this, std::forward<Ts>(Args)...);
107 AnonFuncs.emplace_back(
Func);
120 bool IsConst =
false,
bool IsTemporary =
false,
121 bool IsMutable =
false) {
122 return allocateDescriptor(
D,
Type, MDSize, IsConst, IsTemporary, IsMutable);
128 bool IsConst =
false,
bool IsTemporary =
false,
129 bool IsMutable =
false,
136 P.startDeclaration(VD);
146 if (CurrentDeclaration == NoDeclaration)
147 return std::optional<unsigned>{};
148 return LastDeclaration;
161 llvm::DenseMap<const FunctionDecl *, std::unique_ptr<Function>> Funcs;
163 std::vector<std::unique_ptr<Function>> AnonFuncs;
166 llvm::DenseMap<const FunctionDecl *, std::vector<unsigned>> Relocs;
169 std::vector<const void *> NativePointers;
171 llvm::DenseMap<const void *, unsigned> NativePointerIndices;
174 using PoolAllocTy = llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator>;
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; }
202 PoolAllocTy Allocator;
205 std::vector<Global *> Globals;
207 llvm::DenseMap<const void *, unsigned> GlobalIndices;
210 llvm::DenseMap<const RecordDecl *, Record *>
Records;
213 llvm::DenseMap<const ValueDecl *, unsigned> DummyVariables;
216 template <
typename... Ts>
217 Descriptor *allocateDescriptor(Ts &&... Args) {
218 return new (Allocator) Descriptor(std::forward<Ts>(Args)...);
222 static constexpr unsigned NoDeclaration = (
unsigned)-1;
224 unsigned LastDeclaration = 0;
226 unsigned CurrentDeclaration = NoDeclaration;
229 void startDeclaration(
const ValueDecl *Decl) {
230 LastDeclaration += 1;
231 CurrentDeclaration = LastDeclaration;
235 void endDeclaration() {
236 CurrentDeclaration = NoDeclaration;
242 void dump(llvm::raw_ostream &OS)
const;
llvm::MachO::Records Records
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 ...
A memory block, either on the stack or in the heap.
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.
Context to manage declaration lifetimes.
DeclScope(Program &P, const ValueDecl *VD)
The program contains and links the bytecode for all functions.
std::optional< unsigned > getOrCreateGlobal(const ValueDecl *VD, const Expr *Init=nullptr)
Returns or creates a global an creates an index to it.
Function * getFunction(const FunctionDecl *F)
Returns a function.
Block * getGlobal(unsigned Idx)
Returns the value of a global.
Function * createFunction(Ts &&... Args)
Creates an anonymous function.
std::optional< unsigned > createGlobal(const ValueDecl *VD, const Expr *Init)
Creates a global and returns its index.
const void * getNativePointer(unsigned Idx)
Returns the value of a marshalled native pointer.
Descriptor * createDescriptor(const DeclTy &D, PrimType Type, Descriptor::MetadataSize MDSize=std::nullopt, bool IsConst=false, bool IsTemporary=false, bool IsMutable=false)
Creates a descriptor for a primitive type.
unsigned getOrCreateNativePointer(const void *Ptr)
Marshals a native pointer to an ID for embedding in bytecode.
unsigned createGlobalString(const StringLiteral *S)
Emits a string literal among global data.
Function * createFunction(const FunctionDecl *Def, Ts &&... Args)
Creates a new function from a code range.
Pointer getPtrGlobal(unsigned Idx) const
Returns a pointer to a global.
void dump() const
Dumps the disassembled bytecode to llvm::errs().
std::optional< unsigned > getCurrentDecl() const
Returns the current declaration ID.
std::optional< unsigned > getOrCreateDummy(const ValueDecl *VD)
Returns or creates a dummy value for unknown declarations.
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)
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
The JSON file list parser is used to communicate input to InstallAPI.
Describes a memory block created by an allocation site.
std::optional< unsigned > MetadataSize