aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-01-15 15:38:21 +0100
committerAndrew Kelley <andrew@ziglang.org>2022-01-15 12:49:36 -0500
commite23f7c01ee91321bd7845397d45f189a3e161806 (patch)
treefe5ab6cea0683874bdc46c735e03101dfb9c44ca /src
parenta5c7742ba6fc793608b8bb7ba058e33eccd9cfec (diff)
downloadzig-e23f7c01ee91321bd7845397d45f189a3e161806.tar.gz
zig-e23f7c01ee91321bd7845397d45f189a3e161806.zip
stage2 ARM: store all function parameters to stack for unspecified cc
Diffstat (limited to 'src')
-rw-r--r--src/arch/arm/CodeGen.zig17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig
index 45739dca55..315c6d75c9 100644
--- a/src/arch/arm/CodeGen.zig
+++ b/src/arch/arm/CodeGen.zig
@@ -2524,6 +2524,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
},
.stack_offset,
.memory,
+ .stack_argument_offset,
=> blk: {
try self.spillCompareFlagsIfOccupied();
@@ -2953,7 +2954,7 @@ fn br(self: *Self, block: Air.Inst.Index, operand: Air.Inst.Ref) !void {
block_data.mcv = switch (operand_mcv) {
.none, .dead, .unreach => unreachable,
.register, .stack_offset, .memory => operand_mcv,
- .immediate => blk: {
+ .immediate, .stack_argument_offset => blk: {
const new_mcv = try self.allocRegOrMem(block, true);
try self.setRegOrMem(self.air.typeOfIndex(block), new_mcv, operand_mcv);
break :blk new_mcv;
@@ -3911,7 +3912,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
result.stack_align = 1;
return result;
},
- .Unspecified, .C => {
+ .C => {
// ARM Procedure Call Standard, Chapter 6.5
var ncrn: usize = 0; // Next Core Register Number
var nsaa: u32 = 0; // Next stacked argument address
@@ -3943,6 +3944,18 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
result.stack_byte_count = nsaa;
result.stack_align = 8;
},
+ .Unspecified => {
+ var stack_offset: u32 = 0;
+
+ for (param_types) |ty, i| {
+ stack_offset = std.mem.alignForwardGeneric(u32, stack_offset, ty.abiAlignment(self.target.*));
+ result.args[i] = .{ .stack_argument_offset = stack_offset };
+ stack_offset += @intCast(u32, ty.abiSize(self.target.*));
+ }
+
+ result.stack_byte_count = stack_offset;
+ result.stack_align = 8;
+ },
else => return self.fail("TODO implement function parameters for {} on arm", .{cc}),
}