Commit 8fe9d2f986

joachimschmidt557 <joachim.schmidt557@outlook.com>
2022-02-08 13:21:54
stage2 ARM: airStructFieldVal for more MCValues
1 parent 6b0c950
Changed files (2)
src
arch
test
behavior
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}),
         }
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);