aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2023-09-26 11:16:03 +0300
committerGitHub <noreply@github.com>2023-09-26 11:16:03 +0300
commitf4c884617f499b52eaecc0ef674609c774052f8f (patch)
treec24e4628c314d5e815f4b9796d0ff70335fa58a3 /src/codegen.zig
parent2adb932ad6ee4ff3d3c640cb8fb7bf7db0ff5d74 (diff)
parent9f4649b197b720dbc168ced25eee0805d3b678b1 (diff)
downloadzig-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.zig30
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)) {