24 if (Chunk && Chunk->Next)
25 std::free(Chunk->Next);
32 for (
PrimType Item : llvm::reverse(ItemTypes)) {
35 assert(ItemTypes.empty());
42 if (NewSize ==
size())
45 assert(NewSize <=
size());
46 for (
PrimType Item : llvm::reverse(ItemTypes)) {
49 if (
size() == NewSize)
54 assert(
size() == NewSize);
57void *InterpStack::peekData(
size_t Size)
const {
58 assert(Chunk &&
"Stack is empty!");
60 if (LLVM_LIKELY(Size <= Chunk->
size()))
61 return reinterpret_cast<void *
>(Chunk->start() + Chunk->Size - Size);
63 StackChunk *Ptr = Chunk;
64 while (Size > Ptr->size()) {
67 assert(Ptr &&
"Offset too large");
70 return reinterpret_cast<void *
>(Ptr->start() + Ptr->Size - Size);
73void InterpStack::shrink(
size_t Size) {
74 assert(Chunk &&
"Chunk is empty!");
77 if (LLVM_LIKELY(Size <= Chunk->
size())) {
83 while (Size > Chunk->size()) {
84 Size -= Chunk->size();
86 std::free(Chunk->Next);
87 Chunk->Next =
nullptr;
91 assert(Chunk &&
"Offset too large");
99 llvm::errs() <<
"Items: " << ItemTypes.size() <<
". Size: " <<
size() <<
'\n';
100 if (ItemTypes.empty())
108 for (
PrimType Item : llvm::reverse(ItemTypes)) {
111 llvm::errs() << Index <<
'/' << Offset <<
": ";
116 llvm::errs() <<
'\n';
#define TYPE_SWITCH(Expr, B)
void clearTo(size_t NewSize)
void dump() const
dump the stack contents to stderr.
void clear()
Clears the stack.
size_t size() const
Returns the size of the stack in bytes.
bool empty() const
Returns whether the stack is empty.
void discard()
Discards the top value from the stack.
~InterpStack()
Destroys the stack, freeing up storage.
T & peek() const
Returns a reference to the value on the top of the stack.
constexpr size_t align(size_t Size)
Aligns a size to the pointer alignment.
PrimType
Enumeration of the primitive types of the VM.
size_t primSize(PrimType Type)
Returns the size of a primitive type in bytes.
The JSON file list parser is used to communicate input to InstallAPI.