aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index faafe79c13..bcd36358b1 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -373,11 +373,24 @@ pub fn generateSymbol(
},
.Struct => {
// TODO debug info
- // TODO padding of struct members
+ const struct_obj = typed_value.ty.castTag(.@"struct").?.data;
+ if (struct_obj.layout == .Packed) {
+ return Result{
+ .fail = try ErrorMsg.create(
+ bin_file.allocator,
+ src_loc,
+ "TODO implement generateSymbol for packed struct",
+ .{},
+ ),
+ };
+ }
+
+ const struct_begin = code.items.len;
const field_vals = typed_value.val.castTag(.@"struct").?.data;
for (field_vals) |field_val, index| {
const field_ty = typed_value.ty.structFieldType(index);
if (!field_ty.hasRuntimeBits()) continue;
+
switch (try generateSymbol(bin_file, src_loc, .{
.ty = field_ty,
.val = field_val,
@@ -388,6 +401,16 @@ pub fn generateSymbol(
},
.fail => |em| return Result{ .fail = em },
}
+ const unpadded_field_end = code.items.len - struct_begin;
+
+ // Pad struct members if required
+ const target = bin_file.options.target;
+ const padded_field_end = typed_value.ty.structFieldOffset(index + 1, target);
+ const padding = try math.cast(usize, padded_field_end - unpadded_field_end);
+
+ if (padding > 0) {
+ try code.writer().writeByteNTimes(0, padding);
+ }
}
return Result{ .appended = {} };