Struct rustc_mir_dataflow::value_analysis::Map
source · pub struct Map<'tcx> {
locals: IndexVec<Local, Option<PlaceIndex>>,
projections: FxHashMap<(PlaceIndex, TrackElem), PlaceIndex>,
places: IndexVec<PlaceIndex, PlaceInfo<'tcx>>,
value_count: usize,
inner_values: IndexVec<PlaceIndex, Range<usize>>,
inner_values_buffer: Vec<ValueIndex>,
}
Expand description
Partial mapping from Place
to PlaceIndex
, where some places also have a ValueIndex
.
This data structure essentially maintains a tree of places and their projections. Some additional bookkeeping is done, to speed up traversal over this tree:
- For iteration, every
PlaceInfo
contains an intrusive linked list of its children. - To directly get the child for a specific projection, there is a
projections
map.
Fields§
§locals: IndexVec<Local, Option<PlaceIndex>>
§projections: FxHashMap<(PlaceIndex, TrackElem), PlaceIndex>
§places: IndexVec<PlaceIndex, PlaceInfo<'tcx>>
§value_count: usize
§inner_values: IndexVec<PlaceIndex, Range<usize>>
§inner_values_buffer: Vec<ValueIndex>
Implementations§
source§impl<'tcx> Map<'tcx>
impl<'tcx> Map<'tcx>
sourcepub fn new(
tcx: TyCtxt<'tcx>,
body: &Body<'tcx>,
value_limit: Option<usize>,
) -> Self
pub fn new( tcx: TyCtxt<'tcx>, body: &Body<'tcx>, value_limit: Option<usize>, ) -> Self
Returns a map that only tracks places whose type has scalar layout.
This is currently the only way to create a Map
. The way in which the tracked places are
chosen is an implementation detail and may not be relied upon (other than that their type
are scalars).
sourcefn register(
&mut self,
tcx: TyCtxt<'tcx>,
body: &Body<'tcx>,
exclude: BitSet<Local>,
value_limit: Option<usize>,
)
fn register( &mut self, tcx: TyCtxt<'tcx>, body: &Body<'tcx>, exclude: BitSet<Local>, value_limit: Option<usize>, )
Register all non-excluded places that have scalar layout.
fn register_place( &mut self, ty: Ty<'tcx>, base: PlaceIndex, elem: TrackElem, ) -> PlaceIndex
sourcefn cache_preorder_invoke(&mut self, root: PlaceIndex)
fn cache_preorder_invoke(&mut self, root: PlaceIndex)
Precompute the list of values inside root
and store it inside
as a slice within inner_values_buffer
.
source§impl<'tcx> Map<'tcx>
impl<'tcx> Map<'tcx>
sourcepub fn apply(&self, place: PlaceIndex, elem: TrackElem) -> Option<PlaceIndex>
pub fn apply(&self, place: PlaceIndex, elem: TrackElem) -> Option<PlaceIndex>
Applies a single projection element, yielding the corresponding child.
sourcefn find_extra(
&self,
place: PlaceRef<'_>,
extra: impl IntoIterator<Item = TrackElem>,
) -> Option<PlaceIndex>
fn find_extra( &self, place: PlaceRef<'_>, extra: impl IntoIterator<Item = TrackElem>, ) -> Option<PlaceIndex>
Locates the given place, if it exists in the tree.
sourcepub fn find(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
pub fn find(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
Locates the given place, if it exists in the tree.
sourcepub fn find_discr(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
pub fn find_discr(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
Locates the given place and applies Discriminant
, if it exists in the tree.
sourcepub fn find_len(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
pub fn find_len(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
Locates the given place and applies DerefLen
, if it exists in the tree.
sourcefn children(
&self,
parent: PlaceIndex,
) -> impl Iterator<Item = PlaceIndex> + Captures<'_> + Captures<'tcx>
fn children( &self, parent: PlaceIndex, ) -> impl Iterator<Item = PlaceIndex> + Captures<'_> + Captures<'tcx>
Iterate over all direct children.
sourcefn for_each_aliasing_place(
&self,
place: PlaceRef<'_>,
tail_elem: Option<TrackElem>,
f: &mut impl FnMut(ValueIndex),
)
fn for_each_aliasing_place( &self, place: PlaceRef<'_>, tail_elem: Option<TrackElem>, f: &mut impl FnMut(ValueIndex), )
Invoke a function on the given place and all places that may alias it.
In particular, when the given place has a variant downcast, we invoke the function on all the other variants.
tail_elem
allows to support discriminants that are not a place in MIR, but that we track
as such.
sourcefn for_each_variant_sibling(
&self,
parent: PlaceIndex,
preserved_child: Option<PlaceIndex>,
f: &mut impl FnMut(ValueIndex),
)
fn for_each_variant_sibling( &self, parent: PlaceIndex, preserved_child: Option<PlaceIndex>, f: &mut impl FnMut(ValueIndex), )
Invoke the given function on all the descendants of the given place, except one branch.
sourcefn for_each_value_inside(
&self,
root: PlaceIndex,
f: &mut impl FnMut(ValueIndex),
)
fn for_each_value_inside( &self, root: PlaceIndex, f: &mut impl FnMut(ValueIndex), )
Invoke a function on each value in the given place and all descendants.
sourcepub fn for_each_projection_value<O>(
&self,
root: PlaceIndex,
value: O,
project: &mut impl FnMut(TrackElem, &O) -> Option<O>,
f: &mut impl FnMut(PlaceIndex, &O),
)
pub fn for_each_projection_value<O>( &self, root: PlaceIndex, value: O, project: &mut impl FnMut(TrackElem, &O) -> Option<O>, f: &mut impl FnMut(PlaceIndex, &O), )
Invoke a function on each value in the given place and all descendants.
Trait Implementations§
Auto Trait Implementations§
impl<'tcx> DynSend for Map<'tcx>
impl<'tcx> DynSync for Map<'tcx>
impl<'tcx> Freeze for Map<'tcx>
impl<'tcx> !RefUnwindSafe for Map<'tcx>
impl<'tcx> Send for Map<'tcx>
impl<'tcx> Sync for Map<'tcx>
impl<'tcx> Unpin for Map<'tcx>
impl<'tcx> !UnwindSafe for Map<'tcx>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<T> Filterable for T
impl<T> Filterable for T
source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 136 bytes