diff options
| author | Veikka Tuominen <git@vexu.eu> | 2023-09-26 11:16:03 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-26 11:16:03 +0300 |
| commit | f4c884617f499b52eaecc0ef674609c774052f8f (patch) | |
| tree | c24e4628c314d5e815f4b9796d0ff70335fa58a3 /src/codegen.zig | |
| parent | 2adb932ad6ee4ff3d3c640cb8fb7bf7db0ff5d74 (diff) | |
| parent | 9f4649b197b720dbc168ced25eee0805d3b678b1 (diff) | |
| download | zig-f4c884617f499b52eaecc0ef674609c774052f8f.tar.gz zig-f4c884617f499b52eaecc0ef674609c774052f8f.zip | |
Merge pull request #17215 from kcbanner/read_from_memory_union
sema: add support for unions in readFromMemory and writeToMemory
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 992b51c635..738281cf55 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -583,23 +583,33 @@ pub fn generateSymbol( } const union_obj = mod.typeToUnion(typed_value.ty).?; - const field_index = typed_value.ty.unionTagFieldIndex(un.tag.toValue(), mod).?; - const field_ty = union_obj.field_types.get(ip)[field_index].toType(); - if (!field_ty.hasRuntimeBits(mod)) { - try code.appendNTimes(0xaa, math.cast(usize, layout.payload_size) orelse return error.Overflow); + if (un.tag != .none) { + const field_index = typed_value.ty.unionTagFieldIndex(un.tag.toValue(), mod).?; + const field_ty = union_obj.field_types.get(ip)[field_index].toType(); + if (!field_ty.hasRuntimeBits(mod)) { + try code.appendNTimes(0xaa, math.cast(usize, layout.payload_size) orelse return error.Overflow); + } else { + switch (try generateSymbol(bin_file, src_loc, .{ + .ty = field_ty, + .val = un.val.toValue(), + }, code, debug_output, reloc_info)) { + .ok => {}, + .fail => |em| return Result{ .fail = em }, + } + + const padding = math.cast(usize, layout.payload_size - field_ty.abiSize(mod)) orelse return error.Overflow; + if (padding > 0) { + try code.appendNTimes(0, padding); + } + } } else { switch (try generateSymbol(bin_file, src_loc, .{ - .ty = field_ty, + .ty = ip.typeOf(un.val).toType(), .val = un.val.toValue(), }, code, debug_output, reloc_info)) { .ok => {}, .fail => |em| return Result{ .fail = em }, } - - const padding = math.cast(usize, layout.payload_size - field_ty.abiSize(mod)) orelse return error.Overflow; - if (padding > 0) { - try code.appendNTimes(0, padding); - } } if (layout.tag_size > 0 and layout.tag_align.compare(.lt, layout.payload_align)) { |
