Sync from rust debd22da66
This commit is contained in:
commit
a0ea60b3b2
@ -593,6 +593,7 @@ pub(crate) fn codegen_drop<'tcx>(
|
|||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
||||||
source_info: mir::SourceInfo,
|
source_info: mir::SourceInfo,
|
||||||
drop_place: CPlace<'tcx>,
|
drop_place: CPlace<'tcx>,
|
||||||
|
target: BasicBlock,
|
||||||
) {
|
) {
|
||||||
let ty = drop_place.layout().ty;
|
let ty = drop_place.layout().ty;
|
||||||
let drop_instance = Instance::resolve_drop_in_place(fx.tcx, ty).polymorphize(fx.tcx);
|
let drop_instance = Instance::resolve_drop_in_place(fx.tcx, ty).polymorphize(fx.tcx);
|
||||||
@ -620,6 +621,12 @@ pub(crate) fn codegen_drop<'tcx>(
|
|||||||
let ptr = ptr.get_addr(fx);
|
let ptr = ptr.get_addr(fx);
|
||||||
let drop_fn = crate::vtable::drop_fn_of_obj(fx, vtable);
|
let drop_fn = crate::vtable::drop_fn_of_obj(fx, vtable);
|
||||||
|
|
||||||
|
let is_null = fx.bcx.ins().icmp_imm(IntCC::Equal, drop_fn, 0);
|
||||||
|
let target_block = fx.get_block(target);
|
||||||
|
let continued = fx.bcx.create_block();
|
||||||
|
fx.bcx.ins().brif(is_null, target_block, &[], continued, &[]);
|
||||||
|
fx.bcx.switch_to_block(continued);
|
||||||
|
|
||||||
// FIXME(eddyb) perhaps move some of this logic into
|
// FIXME(eddyb) perhaps move some of this logic into
|
||||||
// `Instance::resolve_drop_in_place`?
|
// `Instance::resolve_drop_in_place`?
|
||||||
let virtual_drop = Instance {
|
let virtual_drop = Instance {
|
||||||
@ -659,6 +666,12 @@ pub(crate) fn codegen_drop<'tcx>(
|
|||||||
let (data, vtable) = drop_place.to_cvalue(fx).dyn_star_force_data_on_stack(fx);
|
let (data, vtable) = drop_place.to_cvalue(fx).dyn_star_force_data_on_stack(fx);
|
||||||
let drop_fn = crate::vtable::drop_fn_of_obj(fx, vtable);
|
let drop_fn = crate::vtable::drop_fn_of_obj(fx, vtable);
|
||||||
|
|
||||||
|
let is_null = fx.bcx.ins().icmp_imm(IntCC::Equal, drop_fn, 0);
|
||||||
|
let target_block = fx.get_block(target);
|
||||||
|
let continued = fx.bcx.create_block();
|
||||||
|
fx.bcx.ins().brif(is_null, target_block, &[], continued, &[]);
|
||||||
|
fx.bcx.switch_to_block(continued);
|
||||||
|
|
||||||
let virtual_drop = Instance {
|
let virtual_drop = Instance {
|
||||||
def: ty::InstanceDef::Virtual(drop_instance.def_id(), 0),
|
def: ty::InstanceDef::Virtual(drop_instance.def_id(), 0),
|
||||||
args: drop_instance.args,
|
args: drop_instance.args,
|
||||||
@ -697,4 +710,7 @@ pub(crate) fn codegen_drop<'tcx>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let target_block = fx.get_block(target);
|
||||||
|
fx.bcx.ins().jump(target_block, &[]);
|
||||||
}
|
}
|
||||||
|
43
src/base.rs
43
src/base.rs
@ -548,10 +548,7 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
|
|||||||
}
|
}
|
||||||
TerminatorKind::Drop { place, target, unwind: _, replace: _ } => {
|
TerminatorKind::Drop { place, target, unwind: _, replace: _ } => {
|
||||||
let drop_place = codegen_place(fx, *place);
|
let drop_place = codegen_place(fx, *place);
|
||||||
crate::abi::codegen_drop(fx, source_info, drop_place);
|
crate::abi::codegen_drop(fx, source_info, drop_place, *target);
|
||||||
|
|
||||||
let target_block = fx.get_block(*target);
|
|
||||||
fx.bcx.ins().jump(target_block, &[]);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -619,22 +616,34 @@ fn codegen_stmt<'tcx>(
|
|||||||
Rvalue::UnaryOp(un_op, ref operand) => {
|
Rvalue::UnaryOp(un_op, ref operand) => {
|
||||||
let operand = codegen_operand(fx, operand);
|
let operand = codegen_operand(fx, operand);
|
||||||
let layout = operand.layout();
|
let layout = operand.layout();
|
||||||
let val = operand.load_scalar(fx);
|
|
||||||
let res = match un_op {
|
let res = match un_op {
|
||||||
UnOp::Not => match layout.ty.kind() {
|
UnOp::Not => {
|
||||||
ty::Bool => {
|
let val = operand.load_scalar(fx);
|
||||||
let res = fx.bcx.ins().icmp_imm(IntCC::Equal, val, 0);
|
match layout.ty.kind() {
|
||||||
CValue::by_val(res, layout)
|
ty::Bool => {
|
||||||
|
let res = fx.bcx.ins().icmp_imm(IntCC::Equal, val, 0);
|
||||||
|
CValue::by_val(res, layout)
|
||||||
|
}
|
||||||
|
ty::Uint(_) | ty::Int(_) => {
|
||||||
|
CValue::by_val(fx.bcx.ins().bnot(val), layout)
|
||||||
|
}
|
||||||
|
_ => unreachable!("un op Not for {:?}", layout.ty),
|
||||||
}
|
}
|
||||||
ty::Uint(_) | ty::Int(_) => {
|
}
|
||||||
CValue::by_val(fx.bcx.ins().bnot(val), layout)
|
UnOp::Neg => {
|
||||||
|
let val = operand.load_scalar(fx);
|
||||||
|
match layout.ty.kind() {
|
||||||
|
ty::Int(_) => CValue::by_val(fx.bcx.ins().ineg(val), layout),
|
||||||
|
ty::Float(_) => CValue::by_val(fx.bcx.ins().fneg(val), layout),
|
||||||
|
_ => unreachable!("un op Neg for {:?}", layout.ty),
|
||||||
}
|
}
|
||||||
_ => unreachable!("un op Not for {:?}", layout.ty),
|
}
|
||||||
},
|
UnOp::PtrMetadata => match layout.abi {
|
||||||
UnOp::Neg => match layout.ty.kind() {
|
Abi::Scalar(_) => CValue::zst(dest_layout),
|
||||||
ty::Int(_) => CValue::by_val(fx.bcx.ins().ineg(val), layout),
|
Abi::ScalarPair(_, _) => {
|
||||||
ty::Float(_) => CValue::by_val(fx.bcx.ins().fneg(val), layout),
|
CValue::by_val(operand.load_scalar_pair(fx).1, dest_layout)
|
||||||
_ => unreachable!("un op Neg for {:?}", layout.ty),
|
}
|
||||||
|
_ => bug!("Unexpected `PtrToMetadata` operand: {operand:?}"),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
lval.write_cvalue(fx, res);
|
lval.write_cvalue(fx, res);
|
||||||
|
@ -100,7 +100,7 @@ pub(crate) fn codegen_const_value<'tcx>(
|
|||||||
assert!(layout.is_sized(), "unsized const value");
|
assert!(layout.is_sized(), "unsized const value");
|
||||||
|
|
||||||
if layout.is_zst() {
|
if layout.is_zst() {
|
||||||
return CValue::by_ref(crate::Pointer::dangling(layout.align.pref), layout);
|
return CValue::zst(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
match const_val {
|
match const_val {
|
||||||
|
@ -200,7 +200,7 @@ fn produce_final_output_artifacts(
|
|||||||
// to get rid of it.
|
// to get rid of it.
|
||||||
for output_type in crate_output.outputs.keys() {
|
for output_type in crate_output.outputs.keys() {
|
||||||
match *output_type {
|
match *output_type {
|
||||||
OutputType::Bitcode => {
|
OutputType::Bitcode | OutputType::ThinLinkBitcode => {
|
||||||
// Cranelift doesn't have bitcode
|
// Cranelift doesn't have bitcode
|
||||||
// user_wants_bitcode = true;
|
// user_wants_bitcode = true;
|
||||||
// // Copy to .bc, but always keep the .0.bc. There is a later
|
// // Copy to .bc, but always keep the .0.bc. There is a later
|
||||||
|
@ -95,6 +95,14 @@ pub(crate) fn by_val_pair(
|
|||||||
CValue(CValueInner::ByValPair(value, extra), layout)
|
CValue(CValueInner::ByValPair(value, extra), layout)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create an instance of a ZST
|
||||||
|
///
|
||||||
|
/// The is represented by a dangling pointer of suitable alignment.
|
||||||
|
pub(crate) fn zst(layout: TyAndLayout<'tcx>) -> CValue<'tcx> {
|
||||||
|
assert!(layout.is_zst());
|
||||||
|
CValue::by_ref(crate::Pointer::dangling(layout.align.pref), layout)
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn layout(&self) -> TyAndLayout<'tcx> {
|
pub(crate) fn layout(&self) -> TyAndLayout<'tcx> {
|
||||||
self.1
|
self.1
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user