aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2021-12-30 14:39:06 +0100
committerjoachimschmidt557 <joachim.schmidt557@outlook.com>2021-12-30 14:39:06 +0100
commit69d03d3a297809d1bc91ed5848501c64666244a1 (patch)
tree05d08dc6e88e0d3ace9f2626b764a64c32c90624 /src/codegen.zig
parentac7fa95af471304c270a4ae1da4fe074610854d1 (diff)
downloadzig-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.zig23
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| {