authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2021-01-17 23:09:08+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2021-01-17 23:12:04+01:00
log458011f21fda961055a0fd7d280e33824c63c446
tree932d29b8279ac27fea3b961817d7e10358bf6a86
parentea6f3e3fd1ea47f7e5234852dccd7e988ba42b6d
signaturelock-open Commit is signed but in an unrecognized format.

stage2 AArch64: update function prologue and epilogue to include stack

offsets

1 files changed, 16 insertions(+), 1 deletions(-)

src/codegen.zig+16-1
......@@ -641,20 +641,33 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
641641 const cc = self.fn_type.fnCallingConvention();
642642 if (cc != .Naked) {
643643 // TODO Finish function prologue and epilogue for aarch64.
644 // Reserve the stack for local variables, etc.
645644
646645 // stp fp, lr, [sp, #-16]!
646 // mov fp, sp
647 // sub sp, sp, #reloc
647648 writeInt(u32, try self.code.addManyAsArray(4), Instruction.stp(
648649 .x29,
649650 .x30,
650651 Register.sp,
651652 Instruction.LoadStorePairOffset.pre_index(-16),
652653 ).toU32());
654 writeInt(u32, try self.code.addManyAsArray(4), Instruction.add(.x29, .xzr, 0, false).toU32());
655 const backpatch_reloc = self.code.items.len;
656 try self.code.resize(backpatch_reloc + 4);
653657
654658 try self.dbgSetPrologueEnd();
655659
656660 try self.genBody(self.mod_fn.body);
657661
662 // Backpatch stack offset
663 const stack_end = self.max_end_stack;
664 const aligned_stack_end = mem.alignForward(stack_end, self.stack_align);
665 if (math.cast(u12, aligned_stack_end)) |size| {
666 writeInt(u32, self.code.items[backpatch_reloc..][0..4], Instruction.sub(.xzr, .xzr, size, false).toU32());
667 } else |_| {
668 return self.failSymbol("TODO AArch64: allow larger stacks", .{});
669 }
670
658671 try self.dbgSetEpilogueBegin();
659672
660673 // exitlude jumps
......@@ -690,6 +703,8 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
690703 Register.sp,
691704 Instruction.LoadStorePairOffset.post_index(16),
692705 ).toU32());
706 // add sp, sp, #stack_size
707 writeInt(u32, try self.code.addManyAsArray(4), Instruction.add(.xzr, .xzr, @intCast(u12, aligned_stack_end), false).toU32());
693708 // ret lr
694709 writeInt(u32, try self.code.addManyAsArray(4), Instruction.ret(null).toU32());
695710 } else {