diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-02-02 16:33:58 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-02 16:33:58 +0100 |
| commit | f95fcb2b1fadb34588f727f22b4d5ed07cd73d5e (patch) | |
| tree | 04255c9c61f790c1bc67d770d7cd8299fd1cdc2d /src/codegen.zig | |
| parent | 23e981bbd1138bb7328d2cbb5a0480e26324088e (diff) | |
| parent | c157b1987865892fa1acfe88208e3567048fc892 (diff) | |
| download | zig-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.zig | 25 |
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 = {} }; |
