codegen/wasm: fix tuple member offset computation

It didn't account for field alignement.
This commit is contained in:
Xavier Bouchoux
2023-10-13 22:26:09 +02:00
parent 895c81ce72
commit 27a19908ed
2 changed files with 5 additions and 6 deletions

View File

@@ -5331,17 +5331,17 @@ fn airAggregateInit(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
else => {
const result = try func.allocStack(result_ty);
const offset = try func.buildPointerOffset(result, 0, .new); // pointer to offset
var prev_field_offset: u64 = 0;
for (elements, 0..) |elem, elem_index| {
if ((try result_ty.structFieldValueComptime(mod, elem_index)) != null) continue;
const elem_ty = result_ty.structFieldType(elem_index, mod);
const elem_size: u32 = @intCast(elem_ty.abiSize(mod));
const field_offset = result_ty.structFieldOffset(elem_index, mod);
_ = try func.buildPointerOffset(offset, @intCast(field_offset - prev_field_offset), .modify);
prev_field_offset = field_offset;
const value = try func.resolveInst(elem);
try func.store(offset, value, elem_ty, 0);
if (elem_index < elements.len - 1) {
_ = try func.buildPointerOffset(offset, elem_size, .modify);
}
}
break :result_value result;

View File

@@ -456,7 +456,6 @@ test "coerce anon tuple to tuple" {
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
var x: u8 = 1;
var y: u16 = 2;