mirror of
https://github.com/ziglang/zig.git
synced 2025-12-07 23:03:08 +00:00
stage2 ARM: airStructFieldVal for more MCValues
This commit is contained in:
parent
6b0c950cb8
commit
8fe9d2f986
@ -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_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));
|
||||||
const struct_field_ty = struct_ty.structFieldType(index);
|
const struct_field_ty = struct_ty.structFieldType(index);
|
||||||
const struct_field_size = @intCast(u32, struct_field_ty.abiSize(self.target.*));
|
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) {
|
switch (mcv) {
|
||||||
|
.dead, .unreach => unreachable,
|
||||||
|
.stack_argument_offset => |off| {
|
||||||
|
break :result MCValue{ .stack_argument_offset = off + adjusted_field_offset };
|
||||||
|
},
|
||||||
.stack_offset => |off| {
|
.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}),
|
else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),
|
||||||
}
|
}
|
||||||
|
|||||||
@ -174,16 +174,12 @@ const MemberFnTestFoo = struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
test "call member function directly" {
|
test "call member function directly" {
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
|
||||||
|
|
||||||
const instance = MemberFnTestFoo{ .x = 1234 };
|
const instance = MemberFnTestFoo{ .x = 1234 };
|
||||||
const result = MemberFnTestFoo.member(instance);
|
const result = MemberFnTestFoo.member(instance);
|
||||||
try expect(result == 1234);
|
try expect(result == 1234);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "store member function in variable" {
|
test "store member function in variable" {
|
||||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
|
||||||
|
|
||||||
const instance = MemberFnTestFoo{ .x = 1234 };
|
const instance = MemberFnTestFoo{ .x = 1234 };
|
||||||
const memberFn = MemberFnTestFoo.member;
|
const memberFn = MemberFnTestFoo.member;
|
||||||
const result = memberFn(instance);
|
const result = memberFn(instance);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user