Support frame pointers
This commit is contained in:
parent
64514d9bf4
commit
d31758eb4a
1 changed files with 28 additions and 4 deletions
|
|
@ -15,6 +15,8 @@ namespace pslang::jit::aarch64
|
|||
|
||||
struct local_context
|
||||
{
|
||||
bool use_frame_pointer = true;
|
||||
|
||||
std::unordered_map<std::string, std::int32_t> extern_symbols;
|
||||
std::unordered_map<ir::node_ref, std::int32_t> nodes;
|
||||
|
||||
|
|
@ -632,12 +634,18 @@ namespace pslang::jit::aarch64
|
|||
else
|
||||
throw std::runtime_error("Unsupported function argument type");
|
||||
}
|
||||
builder.sub_imm(31, 31, 16);
|
||||
builder.str(30, 31, 0);
|
||||
if (!lcontext.use_frame_pointer)
|
||||
{
|
||||
builder.sub_imm(31, 31, 16);
|
||||
builder.str(30, 31, 0);
|
||||
}
|
||||
lcontext.branch_resolve.emplace_back(pcontext.code.size(), node.target);
|
||||
builder.bl(0);
|
||||
builder.ldr(30, 31, 0);
|
||||
builder.add_imm(31, 31, 16);
|
||||
if (!lcontext.use_frame_pointer)
|
||||
{
|
||||
builder.ldr(30, 31, 0);
|
||||
builder.add_imm(31, 31, 16);
|
||||
}
|
||||
|
||||
// TODO: struct/array return value?
|
||||
if (types::is_unit_type(*type))
|
||||
|
|
@ -695,6 +703,11 @@ namespace pslang::jit::aarch64
|
|||
else
|
||||
throw std::runtime_error("Unsupported return value type");
|
||||
}
|
||||
if (lcontext.use_frame_pointer)
|
||||
{
|
||||
builder.ldr(29, 31, (stack_size - 16) / 8);
|
||||
builder.ldr(30, 31, (stack_size - 8) / 8);
|
||||
}
|
||||
if (stack_size > 0)
|
||||
builder.add_imm(31, 31, stack_size);
|
||||
builder.ret();
|
||||
|
|
@ -703,6 +716,10 @@ namespace pslang::jit::aarch64
|
|||
void compile(ir::node_ref begin, ir::node_ref end)
|
||||
{
|
||||
stack_size = 0;
|
||||
|
||||
if (lcontext.use_frame_pointer)
|
||||
stack_size += 16;
|
||||
|
||||
for (auto it = begin; it != end; ++it)
|
||||
{
|
||||
if (ir::is_value_instruction(it->instruction))
|
||||
|
|
@ -711,6 +728,7 @@ namespace pslang::jit::aarch64
|
|||
stack_position[it] = stack_size;
|
||||
}
|
||||
}
|
||||
|
||||
stack_size = ((stack_size + 15) / 16) * 16;
|
||||
|
||||
if (!std::holds_alternative<ir::label>(begin->instruction))
|
||||
|
|
@ -721,6 +739,12 @@ namespace pslang::jit::aarch64
|
|||
lcontext.nodes[it] = pcontext.code.size();
|
||||
if (stack_size > 0)
|
||||
builder.sub_imm(31, 31, stack_size);
|
||||
if (lcontext.use_frame_pointer)
|
||||
{
|
||||
builder.str(29, 31, (stack_size - 16) / 8);
|
||||
builder.str(30, 31, (stack_size - 8) / 8);
|
||||
builder.add_imm(31, 29, stack_size - 16);
|
||||
}
|
||||
++it;
|
||||
|
||||
for (; it != end; ++it)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue