Use correct offset when codegening mir::Const::Indirect.

This commit is contained in:
Camille GILLOT 2023-09-23 09:35:44 +00:00
parent 6992405674
commit ac0683b783

View file

@ -135,15 +135,14 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
assert_eq!(alloc_align, layout.align.abi); assert_eq!(alloc_align, layout.align.abi);
let read_scalar = |start, size, s: abi::Scalar, ty| { let read_scalar = |start, size, s: abi::Scalar, ty| {
let val = alloc match alloc.0.read_scalar(
.0 bx,
.read_scalar( alloc_range(start, size),
bx, /*read_provenance*/ matches!(s.primitive(), abi::Pointer(_)),
alloc_range(start, size), ) {
/*read_provenance*/ matches!(s.primitive(), abi::Pointer(_)), Ok(val) => bx.scalar_to_backend(val, s, ty),
) Err(_) => bx.const_poison(ty),
.unwrap(); }
bx.scalar_to_backend(val, s, ty)
}; };
// It may seem like all types with `Scalar` or `ScalarPair` ABI are fair game at this point. // It may seem like all types with `Scalar` or `ScalarPair` ABI are fair game at this point.
@ -156,7 +155,7 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
Abi::Scalar(s @ abi::Scalar::Initialized { .. }) => { Abi::Scalar(s @ abi::Scalar::Initialized { .. }) => {
let size = s.size(bx); let size = s.size(bx);
assert_eq!(size, layout.size, "abi::Scalar size does not match layout size"); assert_eq!(size, layout.size, "abi::Scalar size does not match layout size");
let val = read_scalar(Size::ZERO, size, s, bx.backend_type(layout)); let val = read_scalar(offset, size, s, bx.backend_type(layout));
OperandRef { val: OperandValue::Immediate(val), layout } OperandRef { val: OperandValue::Immediate(val), layout }
} }
Abi::ScalarPair( Abi::ScalarPair(
@ -164,10 +163,10 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
b @ abi::Scalar::Initialized { .. }, b @ abi::Scalar::Initialized { .. },
) => { ) => {
let (a_size, b_size) = (a.size(bx), b.size(bx)); let (a_size, b_size) = (a.size(bx), b.size(bx));
let b_offset = a_size.align_to(b.align(bx).abi); let b_offset = (offset + a_size).align_to(b.align(bx).abi);
assert!(b_offset.bytes() > 0); assert!(b_offset.bytes() > 0);
let a_val = read_scalar( let a_val = read_scalar(
Size::ZERO, offset,
a_size, a_size,
a, a,
bx.scalar_pair_element_backend_type(layout, 0, true), bx.scalar_pair_element_backend_type(layout, 0, true),