Make PlaceRef
hold a PlaceValue
for the non-layout fields (like OperandRef
does)
This commit is contained in:
parent
040afd36f3
commit
b9b05d5a23
@ -974,7 +974,7 @@ fn load_operand(
|
||||
&mut self,
|
||||
place: PlaceRef<'tcx, RValue<'gcc>>,
|
||||
) -> OperandRef<'tcx, RValue<'gcc>> {
|
||||
assert_eq!(place.llextra.is_some(), place.layout.is_unsized());
|
||||
assert_eq!(place.val.llextra.is_some(), place.layout.is_unsized());
|
||||
|
||||
if place.layout.is_zst() {
|
||||
return OperandRef::zero_sized(place.layout);
|
||||
@ -999,10 +999,10 @@ fn scalar_load_metadata<'a, 'gcc, 'tcx>(
|
||||
}
|
||||
}
|
||||
|
||||
let val = if let Some(llextra) = place.llextra {
|
||||
OperandValue::Ref(place.llval, Some(llextra), place.align)
|
||||
let val = if let Some(llextra) = place.val.llextra {
|
||||
OperandValue::Ref(place.val.llval, Some(llextra), place.val.align)
|
||||
} else if place.layout.is_gcc_immediate() {
|
||||
let load = self.load(place.layout.gcc_type(self), place.llval, place.align);
|
||||
let load = self.load(place.layout.gcc_type(self), place.val.llval, place.val.align);
|
||||
if let abi::Abi::Scalar(ref scalar) = place.layout.abi {
|
||||
scalar_load_metadata(self, load, scalar);
|
||||
}
|
||||
@ -1012,9 +1012,9 @@ fn scalar_load_metadata<'a, 'gcc, 'tcx>(
|
||||
|
||||
let mut load = |i, scalar: &abi::Scalar, align| {
|
||||
let llptr = if i == 0 {
|
||||
place.llval
|
||||
place.val.llval
|
||||
} else {
|
||||
self.inbounds_ptradd(place.llval, self.const_usize(b_offset.bytes()))
|
||||
self.inbounds_ptradd(place.val.llval, self.const_usize(b_offset.bytes()))
|
||||
};
|
||||
let llty = place.layout.scalar_pair_element_gcc_type(self, i);
|
||||
let load = self.load(llty, llptr, align);
|
||||
@ -1027,11 +1027,11 @@ fn scalar_load_metadata<'a, 'gcc, 'tcx>(
|
||||
};
|
||||
|
||||
OperandValue::Pair(
|
||||
load(0, a, place.align),
|
||||
load(1, b, place.align.restrict_for_offset(b_offset)),
|
||||
load(0, a, place.val.align),
|
||||
load(1, b, place.val.align.restrict_for_offset(b_offset)),
|
||||
)
|
||||
} else {
|
||||
OperandValue::Ref(place.llval, None, place.align)
|
||||
OperandValue::Ref(place.val.llval, None, place.val.align)
|
||||
};
|
||||
|
||||
OperandRef { val, layout: place.layout }
|
||||
@ -1045,8 +1045,8 @@ fn write_operand_repeatedly(
|
||||
) {
|
||||
let zero = self.const_usize(0);
|
||||
let count = self.const_usize(count);
|
||||
let start = dest.project_index(self, zero).llval;
|
||||
let end = dest.project_index(self, count).llval;
|
||||
let start = dest.project_index(self, zero).val.llval;
|
||||
let end = dest.project_index(self, count).val.llval;
|
||||
|
||||
let header_bb = self.append_sibling_block("repeat_loop_header");
|
||||
let body_bb = self.append_sibling_block("repeat_loop_body");
|
||||
@ -1064,7 +1064,7 @@ fn write_operand_repeatedly(
|
||||
self.cond_br(keep_going, body_bb, next_bb);
|
||||
|
||||
self.switch_to_block(body_bb);
|
||||
let align = dest.align.restrict_for_offset(dest.layout.field(self.cx(), 0).size);
|
||||
let align = dest.val.align.restrict_for_offset(dest.layout.field(self.cx(), 0).size);
|
||||
cg_elem.val.store(self, PlaceRef::new_sized_aligned(current_val, cg_elem.layout, align));
|
||||
|
||||
let next = self.inbounds_gep(
|
||||
|
@ -354,7 +354,7 @@ fn codegen_intrinsic_call(
|
||||
|
||||
let block = self.llbb();
|
||||
let extended_asm = block.add_extended_asm(None, "");
|
||||
extended_asm.add_input_operand(None, "r", result.llval);
|
||||
extended_asm.add_input_operand(None, "r", result.val.llval);
|
||||
extended_asm.add_clobber("memory");
|
||||
extended_asm.set_volatile_flag(true);
|
||||
|
||||
@ -388,8 +388,8 @@ fn codegen_intrinsic_call(
|
||||
if !fn_abi.ret.is_ignore() {
|
||||
if let PassMode::Cast { cast: ty, .. } = &fn_abi.ret.mode {
|
||||
let ptr_llty = self.type_ptr_to(ty.gcc_type(self));
|
||||
let ptr = self.pointercast(result.llval, ptr_llty);
|
||||
self.store(llval, ptr, result.align);
|
||||
let ptr = self.pointercast(result.val.llval, ptr_llty);
|
||||
self.store(llval, ptr, result.val.align);
|
||||
} else {
|
||||
OperandRef::from_immediate_or_packed_pair(self, llval, result.layout)
|
||||
.val
|
||||
@ -511,7 +511,7 @@ fn store(
|
||||
let can_store_through_cast_ptr = false;
|
||||
if can_store_through_cast_ptr {
|
||||
let cast_ptr_llty = bx.type_ptr_to(cast.gcc_type(bx));
|
||||
let cast_dst = bx.pointercast(dst.llval, cast_ptr_llty);
|
||||
let cast_dst = bx.pointercast(dst.val.llval, cast_ptr_llty);
|
||||
bx.store(val, cast_dst, self.layout.align.abi);
|
||||
} else {
|
||||
// The actual return type is a struct, but the ABI
|
||||
@ -539,7 +539,7 @@ fn store(
|
||||
|
||||
// ... and then memcpy it to the intended destination.
|
||||
bx.memcpy(
|
||||
dst.llval,
|
||||
dst.val.llval,
|
||||
self.layout.align.abi,
|
||||
llscratch,
|
||||
scratch_align,
|
||||
|
@ -82,7 +82,7 @@ macro_rules! require_simd {
|
||||
let place = PlaceRef::alloca(bx, args[0].layout);
|
||||
args[0].val.store(bx, place);
|
||||
let int_ty = bx.type_ix(expected_bytes * 8);
|
||||
let ptr = bx.pointercast(place.llval, bx.cx.type_ptr_to(int_ty));
|
||||
let ptr = bx.pointercast(place.val.llval, bx.cx.type_ptr_to(int_ty));
|
||||
bx.load(int_ty, ptr, Align::ONE)
|
||||
}
|
||||
_ => return_error!(InvalidMonomorphization::InvalidBitmask {
|
||||
|
Loading…
Reference in New Issue
Block a user