diff options
| author | Ralf Jung <post@ralfj.de> | 2018-11-07 12:21:28 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2018-11-07 16:54:31 +0100 |
| commit | 9e3f571cc348e8d2004bb9ffc215bf27133e3552 (patch) | |
| tree | 7aab71660d8f9c8626affa84712e500fab362b37 | |
| parent | 154835e5e70ff4e735c8a344a9c13c63433eb670 (diff) | |
| download | rust-9e3f571cc348e8d2004bb9ffc215bf27133e3552.tar.gz rust-9e3f571cc348e8d2004bb9ffc215bf27133e3552.zip | |
drop glue works with raw ptrs, it must EscapeToRaw
| -rw-r--r-- | src/librustc_mir/shim.rs | 10 | ||||
| -rw-r--r-- | src/librustc_mir/transform/generator.rs | 7 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 76a8501fb17..7705396b383 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -222,6 +222,14 @@ fn build_drop_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ); if let Some(..) = ty { + let dropee_ptr = Place::Local(Local::new(1+0)); + if tcx.sess.opts.debugging_opts.mir_emit_retag { + // We use raw ptr operations, better prepare the alias tracking for that + mir.basic_blocks_mut()[START_BLOCK].statements.insert(0, Statement { + source_info, + kind: StatementKind::EscapeToRaw(Operand::Copy(dropee_ptr.clone())), + }) + } let patch = { let param_env = tcx.param_env(def_id).with_reveal_all(); let mut elaborator = DropShimElaborator { @@ -230,7 +238,7 @@ fn build_drop_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, tcx, param_env }; - let dropee = Place::Local(Local::new(1+0)).deref(); + let dropee = dropee_ptr.deref(); let resume_block = elaborator.patch.resume_block(); elaborate_drops::elaborate_drop( &mut elaborator, diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index 5889fabee9d..a292887b17e 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -684,6 +684,13 @@ fn create_generator_drop_shim<'a, 'tcx>( is_block_tail: None, is_user_variable: None, }; + if tcx.sess.opts.debugging_opts.mir_emit_retag { + // Alias tracking must know we changed the type + mir.basic_blocks_mut()[START_BLOCK].statements.insert(0, Statement { + source_info, + kind: StatementKind::EscapeToRaw(Operand::Copy(Place::Local(self_arg()))), + }) + } no_landing_pads(tcx, &mut mir); |
