aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-02-08 13:21:54 +0100
committerjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-02-08 21:02:56 +0100
commit8fe9d2f9867101fc8d6a91c6e10c6f3b644ce6a8 (patch)
tree60fd2c37a73f090facfacb89e72e394be37d07ed
parent6b0c950cb873f5fe65c0029140b91dfd8a7b1adb (diff)
downloadzig-8fe9d2f9867101fc8d6a91c6e10c6f3b644ce6a8.tar.gz
zig-8fe9d2f9867101fc8d6a91c6e10c6f3b644ce6a8.zip
stage2 ARM: airStructFieldVal for more MCValues
-rw-r--r--src/arch/arm/CodeGen.zig11
-rw-r--r--test/behavior/struct.zig4
2 files changed, 10 insertions, 5 deletions
diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig
index 9e1e3d7f43..2116717cd1 100644
--- a/src/arch/arm/CodeGen.zig
+++ b/src/arch/arm/CodeGen.zig
@@ -1703,9 +1703,18 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));
const struct_field_ty = struct_ty.structFieldType(index);
const struct_field_size = @intCast(u32, struct_field_ty.abiSize(self.target.*));
+ const adjusted_field_offset = struct_size - struct_field_offset - struct_field_size;
+
switch (mcv) {
+ .dead, .unreach => unreachable,
+ .stack_argument_offset => |off| {
+ break :result MCValue{ .stack_argument_offset = off + adjusted_field_offset };
+ },
.stack_offset => |off| {
- break :result MCValue{ .stack_offset = off + struct_size - struct_field_offset - struct_field_size };
+ break :result MCValue{ .stack_offset = off + adjusted_field_offset };
+ },
+ .memory => |addr| {
+ break :result MCValue{ .memory = addr + adjusted_field_offset };
},
else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),
}
diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig
index 6a0ebb5123..03be28b9d1 100644
--- a/test/behavior/struct.zig
+++ b/test/behavior/struct.zig
@@ -174,16 +174,12 @@ const MemberFnTestFoo = struct {
};
test "call member function directly" {
- if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
-
const instance = MemberFnTestFoo{ .x = 1234 };
const result = MemberFnTestFoo.member(instance);
try expect(result == 1234);
}
test "store member function in variable" {
- if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
-
const instance = MemberFnTestFoo{ .x = 1234 };
const memberFn = MemberFnTestFoo.member;
const result = memberFn(instance);