diff options
| author | Matthew Lugg <mlugg@mlugg.co.uk> | 2025-12-20 19:01:43 +0000 |
|---|---|---|
| committer | Matthew Lugg <mlugg@mlugg.co.uk> | 2025-12-21 13:07:00 +0000 |
| commit | 3f08073f7d2f0cd8aa086f1618a74106bf35086d (patch) | |
| tree | 9346e16f57883ffb87201fd1e8148d79622ec47b /src/codegen | |
| parent | b27bdd5af0976d0b94819d6dda557d0dbb8f0d98 (diff) | |
| download | zig-3f08073f7d2f0cd8aa086f1618a74106bf35086d.tar.gz zig-3f08073f7d2f0cd8aa086f1618a74106bf35086d.zip | |
x86_64: hack around more OPV bugs
I would just fix this in Sema if it were easy to do so, but this is more
like a (minor) AIR data design issue than a straightforward Sema bug.
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/x86_64/CodeGen.zig | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/codegen/x86_64/CodeGen.zig b/src/codegen/x86_64/CodeGen.zig index f27b28a3b2..7e8e78334a 100644 --- a/src/codegen/x86_64/CodeGen.zig +++ b/src/codegen/x86_64/CodeGen.zig @@ -171444,12 +171444,14 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { const elem_dies = bt.feed(); if (tuple_type.values.get(ip)[field_index] != .none) continue; const field_type = Type.fromInterned(tuple_type.types.get(ip)[field_index]); - elem_disp = @intCast(field_type.abiAlignment(zcu).forward(elem_disp)); - var elem = try cg.tempFromOperand(elem_ref, elem_dies); - try res.write(&elem, .{ .disp = elem_disp }, cg); - try elem.die(cg); - try cg.resetTemps(reset_index); - elem_disp += @intCast(field_type.abiSize(zcu)); + if (!hack_around_sema_opv_bugs or field_type.hasRuntimeBitsIgnoreComptime(zcu)) { + elem_disp = @intCast(field_type.abiAlignment(zcu).forward(elem_disp)); + var elem = try cg.tempFromOperand(elem_ref, elem_dies); + try res.write(&elem, .{ .disp = elem_disp }, cg); + try elem.die(cg); + try cg.resetTemps(reset_index); + elem_disp += @intCast(field_type.abiSize(zcu)); + } } }, else => return cg.fail("failed to select {s} {f}", .{ |
