struct LocalDependencyIndex {
sources_by_dest: FxHashMap<Local, FxHashSet<Local>>,
}Expand description
Whole-function local dependency index.
The map is intentionally directioned from destination to source:
sources_by_dest[x] = {y, z} means the value of local x may have been
assigned from y or z. Starting from a sink root, a reverse closure over
this map finds all locals that may flow into the checked argument.
Fields§
§sources_by_dest: FxHashMap<Local, FxHashSet<Local>>Implementations§
Source§impl LocalDependencyIndex
impl LocalDependencyIndex
Sourcefn new(tcx: TyCtxt<'_>, def_id: DefId) -> Self
fn new(tcx: TyCtxt<'_>, def_id: DefId) -> Self
Build dependency edges from MIR assignments and call arguments.
Calls are approximated by connecting their destination to all argument
locals. That is coarse but useful for wrappers such as
ptr.wrapping_add(offset): the resulting pointer local depends on both
the base pointer and the offset local.
Sourcefn closure_from(&self, roots: &FxHashSet<Local>) -> FxHashSet<Local>
fn closure_from(&self, roots: &FxHashSet<Local>) -> FxHashSet<Local>
Compute all locals that may flow into roots.
This deliberately ignores statement order; the planner only decides whether extra loop depth may be useful. The ordinary verifier remains responsible for path-ordered proof or failure once the deeper paths are enumerated.
Auto Trait Implementations§
impl DynSend for LocalDependencyIndex
impl DynSync for LocalDependencyIndex
impl Freeze for LocalDependencyIndex
impl RefUnwindSafe for LocalDependencyIndex
impl Send for LocalDependencyIndex
impl Sync for LocalDependencyIndex
impl Unpin for LocalDependencyIndex
impl UnsafeUnpin for LocalDependencyIndex
impl UnwindSafe for LocalDependencyIndex
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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