pub struct Map {
locals: IndexVec<Local, Option<PlaceIndex>>,
projections: FxHashMap<(PlaceIndex, FieldIdx), PlaceIndex>,
places: IndexVec<PlaceIndex, PlaceInfo>,
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, FieldIdx), PlaceIndex>
§places: IndexVec<PlaceIndex, PlaceInfo>
§value_count: usize
§inner_values: IndexVec<PlaceIndex, Range<usize>>
§inner_values_buffer: Vec<ValueIndex>
Implementations§
Source§impl Map
impl Map
Sourcefn new(body: &Body<'_>) -> Self
fn new(body: &Body<'_>) -> 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, body: &Body<'_>, exclude: BitSet<Local>)
fn register(&mut self, body: &Body<'_>, exclude: BitSet<Local>)
Register all non-excluded places that have scalar layout.
Sourcefn register_children<'tcx>(
&mut self,
place: PlaceIndex,
ty: Ty<'tcx>,
worklist: &mut VecDeque<(PlaceIndex, FieldIdx, Ty<'tcx>)>,
)
fn register_children<'tcx>( &mut self, place: PlaceIndex, ty: Ty<'tcx>, worklist: &mut VecDeque<(PlaceIndex, FieldIdx, Ty<'tcx>)>, )
Potentially register the (local, projection) place and its fields, recursively.
Invariant: The projection must only contain trackable elements.
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
.
Sourcefn find(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
fn find(&self, place: PlaceRef<'_>) -> Option<PlaceIndex>
Locates the given place, if it exists in the tree.
Sourcefn children(&self, parent: PlaceIndex) -> impl Iterator<Item = PlaceIndex> + '_
fn children(&self, parent: PlaceIndex) -> impl Iterator<Item = PlaceIndex> + '_
Iterate over all direct children.
Sourcefn apply(&self, place: PlaceIndex, elem: FieldIdx) -> Option<PlaceIndex>
fn apply(&self, place: PlaceIndex, elem: FieldIdx) -> Option<PlaceIndex>
Applies a single projection element, yielding the corresponding child.
Sourcefn for_each_aliasing_place(
&self,
place: PlaceRef<'_>,
f: &mut impl FnMut(ValueIndex),
)
fn for_each_aliasing_place( &self, place: PlaceRef<'_>, f: &mut impl FnMut(ValueIndex), )
Invoke a function on the given place and all places that may alias it.
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.
fn for_each_tracked_place(&self, f: impl FnMut(PlaceIndex, Local, &[FieldIdx]))
fn for_each_tracked_place_rec( &self, root: PlaceIndex, projection: &mut Vec<FieldIdx>, f: &mut impl FnMut(PlaceIndex, &[FieldIdx]), )
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Map
impl RefUnwindSafe for Map
impl Send for Map
impl Sync for Map
impl Unpin for Map
impl UnwindSafe for Map
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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more