feat: move allocator and slots into codegen folder

This commit is contained in:
2026-01-01 16:09:33 +01:00
parent 7995dd2bdf
commit ad17a59d65
2 changed files with 11 additions and 6 deletions

View File

@@ -1,61 +0,0 @@
#pragma once
#include "prelude/string.hpp"
#include "ir/slot.hpp"
#define AVAILABLE_REGISTERS 4
#define AVAILABLE_STACK_SIZE 4096
template<typename Slot, typename SlotAddr = const StringView&>
class Allocator
{
public:
virtual ~Allocator() {};
public:
virtual const Slot& Allocate(SlotAddr addr) = 0;
virtual const Slot& Resolve(SlotAddr addr) = 0;
};
class SlotAllocator : public Allocator<IR::IRSlot>
{
public:
SlotAllocator() = default;
~SlotAllocator() = default;
public:
const IR::IRSlot& Allocate(const StringView& addr) override
{
if (m_regs < AVAILABLE_REGISTERS)
{
m_slots.Push(IR::IRSlot(addr, m_regs++, IR::IRSlot::Type::REGISTRY));
return m_slots.data[m_slots.size - 1];
}
if (m_offset_counter + 8 <= AVAILABLE_STACK_SIZE)
{
m_offset_counter += 8;
m_slots.Push(IR::IRSlot(addr, m_offset_counter, IR::IRSlot::Type::STACK));
return m_slots.data[m_slots.size - 1];
}
// TODO: proper error handling (stack overflow etc.)
assert(0 && "failed to allocate local");
}
const IR::IRSlot& Resolve(const StringView& addr) override
{
for (size_t i = 0; i < m_slots.size; ++i)
{
if (m_slots.data[i].GetAddr() == addr)
{
return m_slots.data[i];
}
}
assert(0 && "could not resolve stack offset for specified address");
}
public:
View<IR::IRSlot> slots() const { return m_slots.view(); }
public:
unsigned int GetStackSize() const { return m_offset_counter; }
public:
int m_regs = 0;
unsigned int m_offset_counter = 0;
Builder<IR::IRSlot> m_slots;
};

View File

@@ -1,48 +0,0 @@
#pragma once
#include "prelude/string.hpp"
namespace IR
{
struct IRSlot
{
enum class Type
{
UNKNOWN = 0,
STACK,
REGISTRY,
};
public:
IRSlot(StringView addr, unsigned int slot, Type slotType) : m_addr(addr), m_slot(slot), m_slotType(slotType) {}
IRSlot() = default;
public:
Type GetType() const { return m_slotType; }
const StringView& GetAddr() const { return m_addr; }
unsigned int GetSlot() const { return m_slot; }
public:
StringView Format() const {
StringBuilder sb;
switch(GetType())
{
case Type::REGISTRY:
sb << "r" << GetSlot();
break;
case Type::STACK:
sb << "s[" << GetSlot() << "]";
break;
default:
sb << "(UNKNOWN_SLOT_TYPE)";
break;
}
return sb.view();
}
private:
StringView m_addr;
unsigned int m_slot;
Type m_slotType;
};
using IRSlotBuilder = Builder<IRSlot>;
using IRSlotView = View<IRSlot>;
} // namespace IR