From 04af24d418da041c1e95dbd7c35f62d661353f3b Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Mon, 13 Apr 2020 17:31:35 +0200 Subject: [PATCH] Don't use codegen_call_inner in codegen_drop --- src/abi/mod.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/abi/mod.rs b/src/abi/mod.rs index 0f08203d8e6..5b81b48a09c 100644 --- a/src/abi/mod.rs +++ b/src/abi/mod.rs @@ -655,19 +655,18 @@ pub(crate) fn codegen_drop<'tcx>( // we don't actually need to drop anything } else { let drop_fn_ty = drop_fn.monomorphic_ty(fx.tcx); + let fn_sig = fx.tcx.normalize_erasing_late_bound_regions( + ParamEnv::reveal_all(), + &drop_fn_ty.fn_sig(fx.tcx), + ); + assert_eq!(fn_sig.output(), fx.tcx.mk_unit()); + match ty.kind { ty::Dynamic(..) => { let (ptr, vtable) = drop_place.to_ptr_maybe_unsized(); let ptr = ptr.get_addr(fx); let drop_fn = crate::vtable::drop_fn_of_obj(fx, vtable.unwrap()); - let fn_sig = fx.tcx.normalize_erasing_late_bound_regions( - ParamEnv::reveal_all(), - &drop_fn_ty.fn_sig(fx.tcx), - ); - - assert_eq!(fn_sig.output(), fx.tcx.mk_unit()); - let sig = clif_sig_from_fn_sig( fx.tcx, fx.triple(), @@ -679,6 +678,15 @@ pub(crate) fn codegen_drop<'tcx>( fx.bcx.ins().call_indirect(sig, drop_fn, &[ptr]); } _ => { + let instance = match drop_fn_ty.kind { + ty::FnDef(def_id, substs) => { + Instance::resolve(fx.tcx, ParamEnv::reveal_all(), def_id, substs).unwrap() + } + _ => unreachable!("{:?}", drop_fn_ty), + }; + + assert!(!matches!(instance.def, InstanceDef::Virtual(_, _))); + let arg_place = CPlace::new_stack_slot( fx, fx.layout_of(fx.tcx.mk_ref( @@ -691,7 +699,18 @@ pub(crate) fn codegen_drop<'tcx>( ); drop_place.write_place_ref(fx, arg_place); let arg_value = arg_place.to_cvalue(fx); - codegen_call_inner(fx, span, None, drop_fn_ty, vec![arg_value], None); + let arg_value = adjust_arg_for_abi(fx, arg_value); + + let mut call_args: Vec = arg_value.into_iter().collect::>(); + + if instance.def.requires_caller_location(fx.tcx) { + // Pass the caller location for `#[track_caller]`. + let caller_location = fx.get_caller_location(span); + call_args.extend(adjust_arg_for_abi(fx, caller_location).into_iter()); + } + + let func_ref = fx.get_function_ref(instance); + fx.bcx.ins().call(func_ref, &call_args); } } }