mirror of
https://github.com/ziglang/zig.git
synced 2026-01-10 17:35:12 +00:00
Merge pull request #12177 from Vexu/packed-ptr
stage2 llvm: fix handling of pointer fields in packed structs
This commit is contained in:
commit
c1f3aca602
@ -5149,6 +5149,11 @@ pub const FuncGen = struct {
|
||||
const same_size_int = self.context.intType(elem_bits);
|
||||
const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, "");
|
||||
return self.builder.buildBitCast(truncated_int, elem_llvm_ty, "");
|
||||
} else if (field_ty.zigTypeTag() == .Pointer) {
|
||||
const elem_bits = @intCast(c_uint, field_ty.bitSize(target));
|
||||
const same_size_int = self.context.intType(elem_bits);
|
||||
const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, "");
|
||||
return self.builder.buildIntToPtr(truncated_int, elem_llvm_ty, "");
|
||||
}
|
||||
return self.builder.buildTrunc(shifted_value, elem_llvm_ty, "");
|
||||
},
|
||||
@ -7999,7 +8004,10 @@ pub const FuncGen = struct {
|
||||
const non_int_val = try self.resolveInst(elem);
|
||||
const ty_bit_size = @intCast(u16, field.ty.bitSize(target));
|
||||
const small_int_ty = self.dg.context.intType(ty_bit_size);
|
||||
const small_int_val = self.builder.buildBitCast(non_int_val, small_int_ty, "");
|
||||
const small_int_val = if (field.ty.zigTypeTag() == .Pointer)
|
||||
self.builder.buildPtrToInt(non_int_val, small_int_ty, "")
|
||||
else
|
||||
self.builder.buildBitCast(non_int_val, small_int_ty, "");
|
||||
const shift_rhs = int_llvm_ty.constInt(running_bits, .False);
|
||||
// If the field is as large as the entire packed struct, this
|
||||
// zext would go from, e.g. i16 to i16. This is legal with
|
||||
|
||||
@ -413,3 +413,25 @@ test "byte-aligned field pointer offsets" {
|
||||
try S.doTheTest();
|
||||
comptime try S.doTheTest();
|
||||
}
|
||||
|
||||
test "load pointer from packed struct" {
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
|
||||
const A = struct {
|
||||
index: u16,
|
||||
};
|
||||
const B = packed struct {
|
||||
x: *A,
|
||||
y: u32,
|
||||
};
|
||||
var a: A = .{ .index = 123 };
|
||||
var b_list: []B = &.{.{ .x = &a, .y = 99 }};
|
||||
for (b_list) |b| {
|
||||
var i = b.x.index;
|
||||
try expect(i == 123);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user