diff options
| author | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2021-12-30 14:39:06 +0100 |
|---|---|---|
| committer | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2021-12-30 14:39:06 +0100 |
| commit | 69d03d3a297809d1bc91ed5848501c64666244a1 (patch) | |
| tree | 05d08dc6e88e0d3ace9f2626b764a64c32c90624 /src/codegen.zig | |
| parent | ac7fa95af471304c270a4ae1da4fe074610854d1 (diff) | |
| download | zig-69d03d3a297809d1bc91ed5848501c64666244a1.tar.gz zig-69d03d3a297809d1bc91ed5848501c64666244a1.zip | |
stage2 ARM: implement struct_field_ptr and struct_field_val
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index f93c53804b..fdbdb7d5c1 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -372,11 +372,32 @@ pub fn generateSymbol( return Result{ .appended = {} }; }, .Struct => { + // TODO debug info + // TODO padding of struct members const field_vals = typed_value.val.castTag(.@"struct").?.data; - _ = field_vals; // TODO write the fields for real + for (field_vals) |field_val, index| { + const field_ty = typed_value.ty.structFieldType(index); + if (!field_ty.hasCodeGenBits()) continue; + switch (try generateSymbol(bin_file, src_loc, .{ + .ty = field_ty, + .val = field_val, + }, code, debug_output)) { + .appended => {}, + .externally_managed => |external_slice| { + code.appendSliceAssumeCapacity(external_slice); + }, + .fail => |em| return Result{ .fail = em }, + } + } + + return Result{ .appended = {} }; + }, + .Union => { + // TODO generateSymbol for unions const target = bin_file.options.target; const abi_size = try math.cast(usize, typed_value.ty.abiSize(target)); try code.writer().writeByteNTimes(0xaa, abi_size); + return Result{ .appended = {} }; }, else => |t| { |
