zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit f9192adaba0eb344ed12aad9c675cd73b740d2a2 (tree)
parent c7f98332383d71a57699426027e82c435e91addc
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date:   Sat, 15 Oct 2022 03:31:17 -0400

llvm: fix lowering of non-byte-aligned field pointers

 * When a field starts at some bit offset within a byte you need to load
   starting from that byte and shift, not starting from the next byte,
   so a rounded-down divide is required here, not a rounded-up one.
 * Remove paragraph from doc that no longer relates to anything.

Closes #12363

Diffstat:
Mdoc/langref.html.in | 5-----
Msrc/codegen/llvm.zig | 2+-
2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/doc/langref.html.in b/doc/langref.html.in @@ -3341,7 +3341,6 @@ fn doTheTest() !void { Zig allows the address to be taken of a non-byte-aligned field: </p> {#code_begin|test|pointer_to_non-byte_aligned_field#} - {#backend_stage1#} const std = @import("std"); const expect = std.testing.expect; @@ -3398,7 +3397,6 @@ fn bar(x: *const u3) u3 { Pointers to non-ABI-aligned fields share the same address as the other fields within their host integer: </p> {#code_begin|test|packed_struct_field_addrs#} - {#backend_stage1#} const std = @import("std"); const expect = std.testing.expect; @@ -3463,9 +3461,6 @@ test "overaligned pointer to packed struct" { try expect(ptr_to_b.* == 2); } {#code_end#} - <p>When this bug is fixed, the above test in the documentation will unexpectedly pass, which will - cause the test suite to fail, notifying the bug fixer to update these docs. - </p> <p> It's also possible to set alignment of struct fields: </p> diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig @@ -3943,7 +3943,7 @@ pub const DeclGen = struct { } break :b b; }; - const byte_offset = llvm_usize.constInt((prev_bits + 7) / 8, .False); + const byte_offset = llvm_usize.constInt(prev_bits / 8, .False); const field_addr = base_addr.constAdd(byte_offset); bitcast_needed = false; const final_llvm_ty = (try dg.lowerType(ptr_child_ty)).pointerType(0);