about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEduard-Mihai Burtescu <edy.burt@gmail.com>2018-02-07 17:28:07 +0200
committerEduard-Mihai Burtescu <edy.burt@gmail.com>2018-02-20 02:50:26 +0200
commite598bdfaa017e3bf786c19587ea917c6a8aa984e (patch)
treef12ff10aa665b36d7b51bf9ef2a81a43b6ddf99a /src
parentb88180f74c39cb57dc7426f9ad3be813f356ecee (diff)
downloadrust-e598bdfaa017e3bf786c19587ea917c6a8aa984e.tar.gz
rust-e598bdfaa017e3bf786c19587ea917c6a8aa984e.zip
rustc_mir: do not remove dead user variables if debuginfo needs them.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/transform/simplify.rs17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/librustc_mir/transform/simplify.rs b/src/librustc_mir/transform/simplify.rs
index e7675b4ceaf..2c6ed1f19b7 100644
--- a/src/librustc_mir/transform/simplify.rs
+++ b/src/librustc_mir/transform/simplify.rs
@@ -42,6 +42,7 @@ use rustc_data_structures::indexed_vec::{Idx, IndexVec};
 use rustc::ty::TyCtxt;
 use rustc::mir::*;
 use rustc::mir::visit::{MutVisitor, Visitor, PlaceContext};
+use rustc::session::config::FullDebugInfo;
 use std::borrow::Cow;
 use transform::{MirPass, MirSource};
 
@@ -281,16 +282,24 @@ pub struct SimplifyLocals;
 
 impl MirPass for SimplifyLocals {
     fn run_pass<'a, 'tcx>(&self,
-                          _: TyCtxt<'a, 'tcx, 'tcx>,
+                          tcx: TyCtxt<'a, 'tcx, 'tcx>,
                           _: MirSource,
                           mir: &mut Mir<'tcx>) {
         let mut marker = DeclMarker { locals: BitVector::new(mir.local_decls.len()) };
         marker.visit_mir(mir);
         // Return pointer and arguments are always live
-        marker.locals.insert(0);
-        for idx in mir.args_iter() {
-            marker.locals.insert(idx.index());
+        marker.locals.insert(RETURN_PLACE.index());
+        for arg in mir.args_iter() {
+            marker.locals.insert(arg.index());
         }
+
+        // We may need to keep dead user variables live for debuginfo.
+        if tcx.sess.opts.debuginfo == FullDebugInfo {
+            for local in mir.vars_iter() {
+                marker.locals.insert(local.index());
+            }
+        }
+
         let map = make_local_map(&mut mir.local_decls, marker.locals);
         // Update references to all vars and tmps now
         LocalUpdater { map: map }.visit_mir(mir);