add docs
This commit is contained in:
parent
7db3324340
commit
a4c0d369b6
|
@ -8,25 +8,41 @@
|
||||||
// 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.
|
||||||
|
|
||||||
|
//! For the NLL computation, we need to compute liveness, but only for those
|
||||||
|
//! local variables whose types contain regions. The others are not of interest
|
||||||
|
//! to us. This file defines a new index type (LocalWithRegion) that indexes into
|
||||||
|
//! a list of "variables whose type contain regions". It also defines a map from
|
||||||
|
//! Local to LocalWithRegion and vice versa -- this map can be given to the
|
||||||
|
//! liveness code so that it only operates over variables with regions in their
|
||||||
|
//! types, instead of all variables.
|
||||||
|
|
||||||
|
use rustc::ty::TypeFoldable;
|
||||||
use rustc_data_structures::indexed_vec::IndexVec;
|
use rustc_data_structures::indexed_vec::IndexVec;
|
||||||
use rustc::mir::{Mir, Local};
|
use rustc::mir::{Mir, Local};
|
||||||
use util::liveness::LiveVariableMap;
|
use util::liveness::LiveVariableMap;
|
||||||
use rustc_data_structures::indexed_vec::Idx;
|
|
||||||
use rustc::ty::TypeFoldable;
|
|
||||||
|
|
||||||
|
use rustc_data_structures::indexed_vec::Idx;
|
||||||
|
|
||||||
|
/// Map between Local and LocalWithRegion indices: this map is supplied to the
|
||||||
|
/// liveness code so that it will only analyze those variables whose types
|
||||||
|
/// contain regions.
|
||||||
crate struct NllLivenessMap {
|
crate struct NllLivenessMap {
|
||||||
|
/// For each local variable, contains either None (if the type has no regions)
|
||||||
|
/// or Some(i) with a suitable index.
|
||||||
pub from_local: IndexVec<Local, Option<LocalWithRegion>>,
|
pub from_local: IndexVec<Local, Option<LocalWithRegion>>,
|
||||||
|
/// For each LocalWithRegion, maps back to the original Local index.
|
||||||
pub to_local: IndexVec<LocalWithRegion, Local>,
|
pub to_local: IndexVec<LocalWithRegion, Local>,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LiveVariableMap for NllLivenessMap {
|
impl LiveVariableMap for NllLivenessMap {
|
||||||
type LiveVar = LocalWithRegion;
|
|
||||||
|
|
||||||
fn from_local(&self, local: Local) -> Option<Self::LiveVar> {
|
fn from_local(&self, local: Local) -> Option<Self::LiveVar> {
|
||||||
self.from_local[local]
|
self.from_local[local]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type LiveVar = LocalWithRegion;
|
||||||
|
|
||||||
fn from_live_var(&self, local: Self::LiveVar) -> Local {
|
fn from_live_var(&self, local: Self::LiveVar) -> Local {
|
||||||
self.to_local[local]
|
self.to_local[local]
|
||||||
}
|
}
|
||||||
|
@ -37,6 +53,8 @@ impl LiveVariableMap for NllLivenessMap {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NllLivenessMap {
|
impl NllLivenessMap {
|
||||||
|
/// Iterates over the variables in Mir and assigns each Local whose type contains
|
||||||
|
/// regions a LocalWithRegion index. Returns a map for converting back and forth.
|
||||||
pub fn compute(mir: &Mir) -> Self {
|
pub fn compute(mir: &Mir) -> Self {
|
||||||
let mut to_local = IndexVec::default();
|
let mut to_local = IndexVec::default();
|
||||||
let from_local: IndexVec<Local,Option<_>> = mir
|
let from_local: IndexVec<Local,Option<_>> = mir
|
||||||
|
@ -55,4 +73,5 @@ impl NllLivenessMap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Index given to each local variable whose type contains a region.
|
||||||
newtype_index!(LocalWithRegion);
|
newtype_index!(LocalWithRegion);
|
||||||
|
|
Loading…
Reference in New Issue