Add ScopeAuxiliaryVec
, return MIR+aux via tuple
It's nice to be able to index with a scope-id, but coherence rules prevent us from implementing `Index<ScopeId>` for `Vec<ScopeAuxiliary>`, and I'd prefer that `ScopeAuxiliary` remain in librustc_mir, just for compilation time reasons.
This commit is contained in:
parent
70d0123082
commit
c36707a284
@ -633,7 +633,7 @@ impl<'a,'tcx> Builder<'a,'tcx> {
|
|||||||
span: span,
|
span: span,
|
||||||
});
|
});
|
||||||
let index = index as u32;
|
let index = index as u32;
|
||||||
let extent = self.scope_auxiliary[var_scope_id.index()].extent;
|
let extent = self.scope_auxiliary[var_scope_id].extent;
|
||||||
self.schedule_drop(span, extent, &Lvalue::Var(index), var_ty);
|
self.schedule_drop(span, extent, &Lvalue::Var(index), var_ty);
|
||||||
self.var_indices.insert(var_id, index);
|
self.var_indices.insert(var_id, index);
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ use rustc::middle::ty::{FnOutput, Ty};
|
|||||||
use rustc::mir::repr::*;
|
use rustc::mir::repr::*;
|
||||||
use rustc_data_structures::fnv::FnvHashMap;
|
use rustc_data_structures::fnv::FnvHashMap;
|
||||||
use rustc_front::hir;
|
use rustc_front::hir;
|
||||||
|
use std::ops::{Index, IndexMut};
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
use syntax::codemap::Span;
|
use syntax::codemap::Span;
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ pub struct Builder<'a, 'tcx: 'a> {
|
|||||||
// but these are liable to get out of date once optimization
|
// but these are liable to get out of date once optimization
|
||||||
// begins. They are also hopefully temporary, and will be
|
// begins. They are also hopefully temporary, and will be
|
||||||
// no longer needed when we adopt graph-based regions.
|
// no longer needed when we adopt graph-based regions.
|
||||||
scope_auxiliary: Vec<ScopeAuxiliary>,
|
scope_auxiliary: ScopeAuxiliaryVec,
|
||||||
|
|
||||||
// the current set of loops; see the `scope` module for more
|
// the current set of loops; see the `scope` module for more
|
||||||
// details
|
// details
|
||||||
@ -85,9 +85,24 @@ pub struct Location {
|
|||||||
pub statement_index: usize,
|
pub statement_index: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct MirAndScopeAuxiliary<'tcx> {
|
pub struct ScopeAuxiliaryVec {
|
||||||
pub mir: Mir<'tcx>,
|
pub vec: Vec<ScopeAuxiliary>
|
||||||
pub scope_auxiliary: Vec<ScopeAuxiliary>,
|
}
|
||||||
|
|
||||||
|
impl Index<ScopeId> for ScopeAuxiliaryVec {
|
||||||
|
type Output = ScopeAuxiliary;
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn index(&self, index: ScopeId) -> &ScopeAuxiliary {
|
||||||
|
&self.vec[index.index()]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IndexMut<ScopeId> for ScopeAuxiliaryVec {
|
||||||
|
#[inline]
|
||||||
|
fn index_mut(&mut self, index: ScopeId) -> &mut ScopeAuxiliary {
|
||||||
|
&mut self.vec[index.index()]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
@ -143,7 +158,7 @@ pub fn construct<'a,'tcx>(hir: Cx<'a,'tcx>,
|
|||||||
argument_extent: CodeExtent,
|
argument_extent: CodeExtent,
|
||||||
return_ty: FnOutput<'tcx>,
|
return_ty: FnOutput<'tcx>,
|
||||||
ast_block: &'tcx hir::Block)
|
ast_block: &'tcx hir::Block)
|
||||||
-> MirAndScopeAuxiliary<'tcx> {
|
-> (Mir<'tcx>, ScopeAuxiliaryVec) {
|
||||||
let cfg = CFG { basic_blocks: vec![] };
|
let cfg = CFG { basic_blocks: vec![] };
|
||||||
|
|
||||||
let mut builder = Builder {
|
let mut builder = Builder {
|
||||||
@ -152,7 +167,7 @@ pub fn construct<'a,'tcx>(hir: Cx<'a,'tcx>,
|
|||||||
fn_span: span,
|
fn_span: span,
|
||||||
scopes: vec![],
|
scopes: vec![],
|
||||||
scope_datas: vec![],
|
scope_datas: vec![],
|
||||||
scope_auxiliary: vec![],
|
scope_auxiliary: ScopeAuxiliaryVec { vec: vec![] },
|
||||||
loop_scopes: vec![],
|
loop_scopes: vec![],
|
||||||
temp_decls: vec![],
|
temp_decls: vec![],
|
||||||
var_decls: vec![],
|
var_decls: vec![],
|
||||||
@ -188,8 +203,8 @@ pub fn construct<'a,'tcx>(hir: Cx<'a,'tcx>,
|
|||||||
true
|
true
|
||||||
}));
|
}));
|
||||||
|
|
||||||
MirAndScopeAuxiliary {
|
(
|
||||||
mir: Mir {
|
Mir {
|
||||||
basic_blocks: builder.cfg.basic_blocks,
|
basic_blocks: builder.cfg.basic_blocks,
|
||||||
scopes: builder.scope_datas,
|
scopes: builder.scope_datas,
|
||||||
var_decls: builder.var_decls,
|
var_decls: builder.var_decls,
|
||||||
@ -198,8 +213,8 @@ pub fn construct<'a,'tcx>(hir: Cx<'a,'tcx>,
|
|||||||
return_ty: return_ty,
|
return_ty: return_ty,
|
||||||
span: span
|
span: span
|
||||||
},
|
},
|
||||||
scope_auxiliary: builder.scope_auxiliary,
|
builder.scope_auxiliary,
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a,'tcx> Builder<'a,'tcx> {
|
impl<'a,'tcx> Builder<'a,'tcx> {
|
||||||
|
@ -257,7 +257,7 @@ impl<'a,'tcx> Builder<'a,'tcx> {
|
|||||||
free: None,
|
free: None,
|
||||||
cached_block: None,
|
cached_block: None,
|
||||||
});
|
});
|
||||||
self.scope_auxiliary.push(ScopeAuxiliary {
|
self.scope_auxiliary.vec.push(ScopeAuxiliary {
|
||||||
extent: extent,
|
extent: extent,
|
||||||
dom: self.cfg.current_location(entry),
|
dom: self.cfg.current_location(entry),
|
||||||
postdoms: vec![]
|
postdoms: vec![]
|
||||||
@ -279,7 +279,7 @@ impl<'a,'tcx> Builder<'a,'tcx> {
|
|||||||
let scope = self.scopes.pop().unwrap();
|
let scope = self.scopes.pop().unwrap();
|
||||||
assert_eq!(scope.extent, extent);
|
assert_eq!(scope.extent, extent);
|
||||||
unpack!(block = build_scope_drops(&mut self.cfg, &scope, &self.scopes, block));
|
unpack!(block = build_scope_drops(&mut self.cfg, &scope, &self.scopes, block));
|
||||||
self.scope_auxiliary[scope.id.index()]
|
self.scope_auxiliary[scope.id]
|
||||||
.postdoms
|
.postdoms
|
||||||
.push(self.cfg.current_location(block));
|
.push(self.cfg.current_location(block));
|
||||||
block.unit()
|
block.unit()
|
||||||
@ -313,7 +313,7 @@ impl<'a,'tcx> Builder<'a,'tcx> {
|
|||||||
self.cfg.terminate(block, scope.id, span, free);
|
self.cfg.terminate(block, scope.id, span, free);
|
||||||
block = next;
|
block = next;
|
||||||
}
|
}
|
||||||
self.scope_auxiliary[scope.id.index()]
|
self.scope_auxiliary[scope.id]
|
||||||
.postdoms
|
.postdoms
|
||||||
.push(self.cfg.current_location(block));
|
.push(self.cfg.current_location(block));
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
extern crate syntax;
|
extern crate syntax;
|
||||||
extern crate rustc_front;
|
extern crate rustc_front;
|
||||||
|
|
||||||
use build::{self, MirAndScopeAuxiliary};
|
use build;
|
||||||
use rustc::dep_graph::DepNode;
|
use rustc::dep_graph::DepNode;
|
||||||
use rustc::mir::repr::Mir;
|
use rustc::mir::repr::Mir;
|
||||||
use pretty;
|
use pretty;
|
||||||
@ -183,7 +183,7 @@ fn build_mir<'a,'tcx:'a>(cx: Cx<'a,'tcx>,
|
|||||||
let parameter_scope =
|
let parameter_scope =
|
||||||
cx.tcx().region_maps.lookup_code_extent(
|
cx.tcx().region_maps.lookup_code_extent(
|
||||||
CodeExtentData::ParameterScope { fn_id: fn_id, body_id: body.id });
|
CodeExtentData::ParameterScope { fn_id: fn_id, body_id: body.id });
|
||||||
let MirAndScopeAuxiliary { mut mir, scope_auxiliary } =
|
let (mut mir, scope_auxiliary) =
|
||||||
build::construct(cx,
|
build::construct(cx,
|
||||||
span,
|
span,
|
||||||
implicit_arg_tys,
|
implicit_arg_tys,
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use build::{Location, ScopeAuxiliary};
|
use build::{Location, ScopeAuxiliaryVec};
|
||||||
use rustc::mir::repr::*;
|
use rustc::mir::repr::*;
|
||||||
use rustc::middle::ty::{self, TyCtxt};
|
use rustc::middle::ty::{self, TyCtxt};
|
||||||
use rustc_data_structures::fnv::FnvHashMap;
|
use rustc_data_structures::fnv::FnvHashMap;
|
||||||
@ -39,7 +39,7 @@ pub fn dump_mir<'a, 'tcx>(tcx: &TyCtxt<'tcx>,
|
|||||||
disambiguator: &Display,
|
disambiguator: &Display,
|
||||||
node_id: NodeId,
|
node_id: NodeId,
|
||||||
mir: &Mir<'tcx>,
|
mir: &Mir<'tcx>,
|
||||||
auxiliary: Option<&Vec<ScopeAuxiliary>>) {
|
auxiliary: Option<&ScopeAuxiliaryVec>) {
|
||||||
let filters = match tcx.sess.opts.debugging_opts.dump_mir {
|
let filters = match tcx.sess.opts.debugging_opts.dump_mir {
|
||||||
None => return,
|
None => return,
|
||||||
Some(ref filters) => filters,
|
Some(ref filters) => filters,
|
||||||
@ -91,12 +91,12 @@ pub fn write_mir_fn<'tcx>(tcx: &TyCtxt<'tcx>,
|
|||||||
node_id: NodeId,
|
node_id: NodeId,
|
||||||
mir: &Mir<'tcx>,
|
mir: &Mir<'tcx>,
|
||||||
w: &mut Write,
|
w: &mut Write,
|
||||||
auxiliary: Option<&Vec<ScopeAuxiliary>>)
|
auxiliary: Option<&ScopeAuxiliaryVec>)
|
||||||
-> io::Result<()> {
|
-> io::Result<()> {
|
||||||
// compute scope/entry exit annotations
|
// compute scope/entry exit annotations
|
||||||
let mut annotations = FnvHashMap();
|
let mut annotations = FnvHashMap();
|
||||||
if let Some(auxiliary) = auxiliary {
|
if let Some(auxiliary) = auxiliary {
|
||||||
for (index, auxiliary) in auxiliary.iter().enumerate() {
|
for (index, auxiliary) in auxiliary.vec.iter().enumerate() {
|
||||||
let scope_id = ScopeId::new(index);
|
let scope_id = ScopeId::new(index);
|
||||||
|
|
||||||
annotations.entry(auxiliary.dom)
|
annotations.entry(auxiliary.dom)
|
||||||
@ -183,7 +183,7 @@ fn comment(tcx: &TyCtxt,
|
|||||||
|
|
||||||
fn write_scope_tree(tcx: &TyCtxt,
|
fn write_scope_tree(tcx: &TyCtxt,
|
||||||
mir: &Mir,
|
mir: &Mir,
|
||||||
auxiliary: Option<&Vec<ScopeAuxiliary>>,
|
auxiliary: Option<&ScopeAuxiliaryVec>,
|
||||||
scope_tree: &FnvHashMap<Option<ScopeId>, Vec<ScopeId>>,
|
scope_tree: &FnvHashMap<Option<ScopeId>, Vec<ScopeId>>,
|
||||||
w: &mut Write,
|
w: &mut Write,
|
||||||
parent: Option<ScopeId>,
|
parent: Option<ScopeId>,
|
||||||
@ -201,7 +201,7 @@ fn write_scope_tree(tcx: &TyCtxt,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(auxiliary) = auxiliary {
|
if let Some(auxiliary) = auxiliary {
|
||||||
let extent = auxiliary[child.index()].extent;
|
let extent = auxiliary[child].extent;
|
||||||
let data = tcx.region_maps.code_extent_data(extent);
|
let data = tcx.region_maps.code_extent_data(extent);
|
||||||
writeln!(w, "{0:1$}Extent: {2:?}", "", indent, data)?;
|
writeln!(w, "{0:1$}Extent: {2:?}", "", indent, data)?;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user