rustc_mir_dataflow::framework::cursor

Struct ResultsCursor

source
pub struct ResultsCursor<'mir, 'tcx, A>
where A: Analysis<'tcx>,
{ body: &'mir Body<'tcx>, results: Results<'tcx, A>, state: A::Domain, pos: CursorPosition, state_needs_reset: bool, reachable_blocks: BitSet<BasicBlock>, }
Expand description

Allows random access inspection of the results of a dataflow analysis.

This cursor only has linear performance within a basic block when its statements are visited in the same order as the DIRECTION of the analysis. In the worst case—when statements are visited in reverse order—performance will be quadratic in the number of statements in the block. The order in which basic blocks are inspected has no impact on performance.

Fields§

§body: &'mir Body<'tcx>§results: Results<'tcx, A>§state: A::Domain§pos: CursorPosition§state_needs_reset: bool

Indicates that state has been modified with a custom effect.

When this flag is set, we need to reset to an entry set before doing a seek.

§reachable_blocks: BitSet<BasicBlock>

Implementations§

source§

impl<'mir, 'tcx, A> ResultsCursor<'mir, 'tcx, A>
where A: Analysis<'tcx>,

source

pub fn get(&self) -> &A::Domain

Returns the dataflow state at the current location.

source

pub fn body(&self) -> &'mir Body<'tcx>

Returns the body this analysis was run on.

source

pub fn into_results(self) -> Results<'tcx, A>

Unwraps this cursor, returning the underlying Results.

source

pub fn new(body: &'mir Body<'tcx>, results: Results<'tcx, A>) -> Self

Returns a new cursor that can inspect results.

source

pub fn results(&self) -> &Results<'tcx, A>

Returns the underlying Results.

source

pub fn mut_results(&mut self) -> &mut Results<'tcx, A>

Returns the underlying Results.

source

pub fn analysis(&self) -> &A

Returns the Analysis used to generate the underlying Results.

source

pub fn mut_analysis(&mut self) -> &mut A

Returns the Analysis used to generate the underlying Results.

source

pub(super) fn seek_to_block_entry(&mut self, block: BasicBlock)

Resets the cursor to hold the entry set for the given basic block.

For forward dataflow analyses, this is the dataflow state prior to the first statement.

For backward dataflow analyses, this is the dataflow state after the terminator.

source

pub fn seek_to_block_start(&mut self, block: BasicBlock)

Resets the cursor to hold the state prior to the first statement in a basic block.

For forward analyses, this is the entry set for the given block.

For backward analyses, this is the state that will be propagated to its predecessors (ignoring edge-specific effects).

source

pub fn seek_to_block_end(&mut self, block: BasicBlock)

Resets the cursor to hold the state after the terminator in a basic block.

For backward analyses, this is the entry set for the given block.

For forward analyses, this is the state that will be propagated to its successors (ignoring edge-specific effects).

source

pub fn seek_before_primary_effect(&mut self, target: Location)

Advances the cursor to hold the dataflow state at target before its “primary” effect is applied.

The “before” effect at the target location will be applied.

source

pub fn seek_after_primary_effect(&mut self, target: Location)

Advances the cursor to hold the dataflow state at target after its “primary” effect is applied.

The “before” effect at the target location will be applied as well.

source

fn seek_after(&mut self, target: Location, effect: Effect)

source

pub fn apply_custom_effect(&mut self, f: impl FnOnce(&mut A, &mut A::Domain))

Applies f to the cursor’s internal state.

This can be used, e.g., to apply the call return effect directly to the cursor without creating an extra copy of the dataflow state.

Auto Trait Implementations§

§

impl<'mir, 'tcx, A> DynSend for ResultsCursor<'mir, 'tcx, A>
where <A as Analysis<'tcx>>::Domain: DynSend, A: DynSend,

§

impl<'mir, 'tcx, A> DynSync for ResultsCursor<'mir, 'tcx, A>
where <A as Analysis<'tcx>>::Domain: DynSync, A: DynSync,

§

impl<'mir, 'tcx, A> Freeze for ResultsCursor<'mir, 'tcx, A>
where <A as Analysis<'tcx>>::Domain: Freeze, A: Freeze,

§

impl<'mir, 'tcx, A> !RefUnwindSafe for ResultsCursor<'mir, 'tcx, A>

§

impl<'mir, 'tcx, A> Send for ResultsCursor<'mir, 'tcx, A>
where <A as Analysis<'tcx>>::Domain: Send, A: Send,

§

impl<'mir, 'tcx, A> Sync for ResultsCursor<'mir, 'tcx, A>
where <A as Analysis<'tcx>>::Domain: Sync, A: Sync,

§

impl<'mir, 'tcx, A> Unpin for ResultsCursor<'mir, 'tcx, A>
where <A as Analysis<'tcx>>::Domain: Unpin, A: Unpin,

§

impl<'mir, 'tcx, A> !UnwindSafe for ResultsCursor<'mir, 'tcx, A>

Blanket Implementations§

source§

impl<T> Aligned for T

source§

const ALIGN: Alignment = _

Alignment of Self.
source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T, R> CollectAndApply<T, R> for T

source§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

source§

type Output = R

source§

impl<T> Filterable for T

source§

fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>

Creates a filterable data provider with the given name for debugging. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<P> IntoQueryParam<P> for P

source§

impl<T> MaybeResult<T> for T

source§

type Error = !

source§

fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

source§

fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
source§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

source§

fn upcast(self, interner: I) -> U

source§

impl<I, T> UpcastFrom<I, T> for T

source§

fn upcast_from(from: T, _tcx: I) -> T

source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<Tcx, T> Value<Tcx> for T
where Tcx: DepContext,

source§

default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<'a, T> Captures<'a> for T
where T: ?Sized,

source§

impl<T> ErasedDestructor for T
where T: 'static,

source§

impl<T> MaybeSendSync for T
where T: Send + Sync,

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.