@@ -135,15 +135,14 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
135
135
assert_eq ! ( alloc_align, layout. align. abi) ;
136
136
137
137
let read_scalar = |start, size, s : abi:: Scalar , ty| {
138
- let val = alloc
139
- . 0
140
- . read_scalar (
141
- bx,
142
- alloc_range ( start, size) ,
143
- /*read_provenance*/ matches ! ( s. primitive( ) , abi:: Pointer ( _) ) ,
144
- )
145
- . unwrap ( ) ;
146
- bx. scalar_to_backend ( val, s, ty)
138
+ match alloc. 0 . read_scalar (
139
+ bx,
140
+ alloc_range ( start, size) ,
141
+ /*read_provenance*/ matches ! ( s. primitive( ) , abi:: Pointer ( _) ) ,
142
+ ) {
143
+ Ok ( val) => bx. scalar_to_backend ( val, s, ty) ,
144
+ Err ( _) => bx. const_poison ( ty) ,
145
+ }
147
146
} ;
148
147
149
148
// It may seem like all types with `Scalar` or `ScalarPair` ABI are fair game at this point.
@@ -156,18 +155,18 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
156
155
Abi :: Scalar ( s @ abi:: Scalar :: Initialized { .. } ) => {
157
156
let size = s. size ( bx) ;
158
157
assert_eq ! ( size, layout. size, "abi::Scalar size does not match layout size" ) ;
159
- let val = read_scalar ( Size :: ZERO , size, s, bx. backend_type ( layout) ) ;
158
+ let val = read_scalar ( offset , size, s, bx. backend_type ( layout) ) ;
160
159
OperandRef { val : OperandValue :: Immediate ( val) , layout }
161
160
}
162
161
Abi :: ScalarPair (
163
162
a @ abi:: Scalar :: Initialized { .. } ,
164
163
b @ abi:: Scalar :: Initialized { .. } ,
165
164
) => {
166
165
let ( a_size, b_size) = ( a. size ( bx) , b. size ( bx) ) ;
167
- let b_offset = a_size. align_to ( b. align ( bx) . abi ) ;
166
+ let b_offset = ( offset + a_size) . align_to ( b. align ( bx) . abi ) ;
168
167
assert ! ( b_offset. bytes( ) > 0 ) ;
169
168
let a_val = read_scalar (
170
- Size :: ZERO ,
169
+ offset ,
171
170
a_size,
172
171
a,
173
172
bx. scalar_pair_element_backend_type ( layout, 0 , true ) ,
0 commit comments