diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-17 02:06:54 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-18 20:42:38 -0400 |
| commit | 60e69fdaa15a304f374df3e067e08aeaa622d412 (patch) | |
| tree | 97334e532a0841adb9aab41b7b79c8273a1b674f /src/codegen.zig | |
| parent | 35da95fe8765874a1ccffb0d7bfd523b14f44a4a (diff) | |
| download | zig-60e69fdaa15a304f374df3e067e08aeaa622d412.tar.gz zig-60e69fdaa15a304f374df3e067e08aeaa622d412.zip | |
codegen: emit global vector padding
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 7a22d0b218..67d3d8bca7 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -747,15 +747,23 @@ pub fn generateSymbol( .Vector => switch (typed_value.val.tag()) { .bytes => { const bytes = typed_value.val.castTag(.bytes).?.data; - const len = @intCast(usize, typed_value.ty.arrayLen()); - try code.ensureUnusedCapacity(len); + const len = math.cast(usize, typed_value.ty.arrayLen()) orelse return error.Overflow; + const padding = math.cast(usize, typed_value.ty.abiSize(target) - len) orelse + return error.Overflow; + try code.ensureUnusedCapacity(len + padding); code.appendSliceAssumeCapacity(bytes[0..len]); + if (padding > 0) try code.writer().writeByteNTimes(0, padding); return Result.ok; }, .aggregate => { const elem_vals = typed_value.val.castTag(.aggregate).?.data; const elem_ty = typed_value.ty.elemType(); - const len = @intCast(usize, typed_value.ty.arrayLen()); + const len = math.cast(usize, typed_value.ty.arrayLen()) orelse return error.Overflow; + const padding = math.cast(usize, typed_value.ty.abiSize(target) - + (math.divCeil(u64, elem_ty.bitSize(target) * len, 8) catch |err| switch (err) { + error.DivisionByZero => unreachable, + else => |e| return e, + })) orelse return error.Overflow; for (elem_vals[0..len]) |elem_val| { switch (try generateSymbol(bin_file, src_loc, .{ .ty = elem_ty, @@ -765,13 +773,18 @@ pub fn generateSymbol( .fail => |em| return Result{ .fail = em }, } } + if (padding > 0) try code.writer().writeByteNTimes(0, padding); return Result.ok; }, .repeated => { const array = typed_value.val.castTag(.repeated).?.data; const elem_ty = typed_value.ty.childType(); const len = typed_value.ty.arrayLen(); - + const padding = math.cast(usize, typed_value.ty.abiSize(target) - + (math.divCeil(u64, elem_ty.bitSize(target) * len, 8) catch |err| switch (err) { + error.DivisionByZero => unreachable, + else => |e| return e, + })) orelse return error.Overflow; var index: u64 = 0; while (index < len) : (index += 1) { switch (try generateSymbol(bin_file, src_loc, .{ @@ -782,13 +795,17 @@ pub fn generateSymbol( .fail => |em| return Result{ .fail = em }, } } + if (padding > 0) try code.writer().writeByteNTimes(0, padding); return Result.ok; }, .str_lit => { const str_lit = typed_value.val.castTag(.str_lit).?.data; const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len]; - try code.ensureUnusedCapacity(str_lit.len); + const padding = math.cast(usize, typed_value.ty.abiSize(target) - str_lit.len) orelse + return error.Overflow; + try code.ensureUnusedCapacity(str_lit.len + padding); code.appendSliceAssumeCapacity(bytes); + if (padding > 0) try code.writer().writeByteNTimes(0, padding); return Result.ok; }, else => unreachable, |
