authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-02-08 13:21:54+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-02-08 21:02:56+01:00
log8fe9d2f9867101fc8d6a91c6e10c6f3b644ce6a8
tree60fd2c37a73f090facfacb89e72e394be37d07ed
parent6b0c950cb873f5fe65c0029140b91dfd8a7b1adb
signaturelock-open Commit is signed but in an unrecognized format.

stage2 ARM: airStructFieldVal for more MCValues


2 files changed, 10 insertions(+), 5 deletions(-)

src/arch/arm/CodeGen.zig+10-1
...@@ -1703,9 +1703,18 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {...@@ -1703,9 +1703,18 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
1703 const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));1703 const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));
1704 const struct_field_ty = struct_ty.structFieldType(index);1704 const struct_field_ty = struct_ty.structFieldType(index);
1705 const struct_field_size = @intCast(u32, struct_field_ty.abiSize(self.target.*));1705 const struct_field_size = @intCast(u32, struct_field_ty.abiSize(self.target.*));
1706 const adjusted_field_offset = struct_size - struct_field_offset - struct_field_size;
1707
1706 switch (mcv) {1708 switch (mcv) {
1709 .dead, .unreach => unreachable,
1710 .stack_argument_offset => |off| {
1711 break :result MCValue{ .stack_argument_offset = off + adjusted_field_offset };
1712 },
1707 .stack_offset => |off| {1713 .stack_offset => |off| {
1708 break :result MCValue{ .stack_offset = off + struct_size - struct_field_offset - struct_field_size };1714 break :result MCValue{ .stack_offset = off + adjusted_field_offset };
1715 },
1716 .memory => |addr| {
1717 break :result MCValue{ .memory = addr + adjusted_field_offset };
1709 },1718 },
1710 else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),1719 else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),
1711 }1720 }
test/behavior/struct.zig-4
...@@ -174,16 +174,12 @@ const MemberFnTestFoo = struct {...@@ -174,16 +174,12 @@ const MemberFnTestFoo = struct {
174};174};
175175
176test "call member function directly" {176test "call member function directly" {
177 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
178
179 const instance = MemberFnTestFoo{ .x = 1234 };177 const instance = MemberFnTestFoo{ .x = 1234 };
180 const result = MemberFnTestFoo.member(instance);178 const result = MemberFnTestFoo.member(instance);
181 try expect(result == 1234);179 try expect(result == 1234);
182}180}
183181
184test "store member function in variable" {182test "store member function in variable" {
185 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
186
187 const instance = MemberFnTestFoo{ .x = 1234 };183 const instance = MemberFnTestFoo{ .x = 1234 };
188 const memberFn = MemberFnTestFoo.member;184 const memberFn = MemberFnTestFoo.member;
189 const result = memberFn(instance);185 const result = memberFn(instance);