aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-02-02 16:33:58 +0100
committerGitHub <noreply@github.com>2022-02-02 16:33:58 +0100
commitf95fcb2b1fadb34588f727f22b4d5ed07cd73d5e (patch)
tree04255c9c61f790c1bc67d770d7cd8299fd1cdc2d /src/codegen.zig
parent23e981bbd1138bb7328d2cbb5a0480e26324088e (diff)
parentc157b1987865892fa1acfe88208e3567048fc892 (diff)
downloadzig-f95fcb2b1fadb34588f727f22b4d5ed07cd73d5e.tar.gz
zig-f95fcb2b1fadb34588f727f22b4d5ed07cd73d5e.zip
Merge pull request #10762 from ziglang/stage2-x86_64-new-regalloc-api
stage2: handle more MCValue types in `struct_field_ptr` in x86_64 and pad out nonpacked struct fields when lowering to bytes (all targets incl wasm32)
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 = {} };