pub struct BasicBlocks<'tcx> {
    basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>,
    cache: Cache,
}

Fields§

§basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>§cache: Cache

Implementations§

source§

impl<'tcx> BasicBlocks<'tcx>

source

pub fn new(basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>) -> Self

source

pub fn is_cfg_cyclic(&self) -> bool

Returns true if control-flow graph contains a cycle reachable from the START_BLOCK.

source

pub fn dominators(&self) -> &Dominators<BasicBlock>

source

pub fn predecessors(&self) -> &IndexVec<BasicBlock, SmallVec<[BasicBlock; 4]>>

Returns predecessors for each basic block.

source

pub fn reverse_postorder(&self) -> &[BasicBlock]

Returns basic blocks in a reverse postorder.

See traversal::reverse_postorder’s docs to learn what is preorder traversal.

source

pub fn switch_sources( &self ) -> &FxHashMap<(BasicBlock, BasicBlock), SmallVec<[Option<u128>; 1]>>

switch_sources()[&(target, switch)] returns a list of switch values that lead to a target block from a switch block.

source

pub fn as_mut(&mut self) -> &mut IndexVec<BasicBlock, BasicBlockData<'tcx>>

Returns mutable reference to basic blocks. Invalidates CFG cache.

source

pub fn as_mut_preserves_cfg( &mut self ) -> &mut IndexVec<BasicBlock, BasicBlockData<'tcx>>

Get mutable access to basic blocks without invalidating the CFG cache.

By calling this method instead of e.g. BasicBlocks::as_mut you promise not to change the CFG. This means that

  1. The number of basic blocks remains unchanged
  2. The set of successors of each terminator remains unchanged.
  3. For each TerminatorKind::SwitchInt, the targets remains the same and the terminator kind is not changed.

If any of these conditions cannot be upheld, you should call BasicBlocks::invalidate_cfg_cache.

source

pub fn invalidate_cfg_cache(&mut self)

Invalidates cached information about the CFG.

You will only ever need this if you have also called BasicBlocks::as_mut_preserves_cfg. All other methods that allow you to mutate the basic blocks also call this method themselves, thereby avoiding any risk of accidentally cache invalidation.

Trait Implementations§

source§

impl<'tcx> Clone for BasicBlocks<'tcx>

source§

fn clone(&self) -> BasicBlocks<'tcx>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'tcx> Debug for BasicBlocks<'tcx>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'tcx, __D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<__D> for BasicBlocks<'tcx>

source§

fn decode(__decoder: &mut __D) -> Self

source§

impl<'tcx> Deref for BasicBlocks<'tcx>

§

type Target = IndexSlice<BasicBlock, BasicBlockData<'tcx>>

The resulting type after dereferencing.
source§

fn deref(&self) -> &IndexSlice<BasicBlock, BasicBlockData<'tcx>>

Dereferences the value.
source§

impl<'tcx> DirectedGraph for BasicBlocks<'tcx>

source§

impl<'tcx, __E: TyEncoder<I = TyCtxt<'tcx>>> Encodable<__E> for BasicBlocks<'tcx>

source§

fn encode(&self, __encoder: &mut __E)

source§

impl<'tcx, 'graph> GraphPredecessors<'graph> for BasicBlocks<'tcx>

§

type Item = BasicBlock

§

type Iter = Copied<Iter<'graph, BasicBlock>>

source§

impl<'a, 'b> GraphSuccessors<'b> for BasicBlocks<'a>

source§

impl<'tcx, '__ctx> HashStable<StableHashingContext<'__ctx>> for BasicBlocks<'tcx>

source§

fn hash_stable( &self, __hcx: &mut StableHashingContext<'__ctx>, __hasher: &mut StableHasher )

source§

impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for BasicBlocks<'tcx>

source§

fn try_fold_with<__F: FallibleTypeFolder<TyCtxt<'tcx>>>( self, __folder: &mut __F ) -> Result<Self, __F::Error>

The entry point for folding. To fold a value t with a folder f call: t.try_fold_with(f). Read more
source§

fn fold_with<F>(self, folder: &mut F) -> Self
where F: TypeFolder<I>,

A convenient alternative to try_fold_with for use with infallible folders. Do not override this method, to ensure coherence with try_fold_with.
source§

impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for BasicBlocks<'tcx>

source§

fn visit_with<__V: TypeVisitor<TyCtxt<'tcx>>>( &self, __visitor: &mut __V ) -> ControlFlow<__V::BreakTy>

The entry point for visiting. To visit a value t with a visitor v call: t.visit_with(v). Read more
source§

impl<'tcx> WithNumNodes for BasicBlocks<'tcx>

source§

impl<'tcx> WithPredecessors for BasicBlocks<'tcx>

source§

fn predecessors( &self, node: Self::Node ) -> <Self as GraphPredecessors<'_>>::Iter

source§

impl<'tcx> WithStartNode for BasicBlocks<'tcx>

source§

fn start_node(&self) -> Self::Node

source§

impl<'tcx> WithSuccessors for BasicBlocks<'tcx>

source§

fn successors(&self, node: Self::Node) -> <Self as GraphSuccessors<'_>>::Iter

Auto Trait Implementations§

§

impl<'tcx> !RefUnwindSafe for BasicBlocks<'tcx>

§

impl<'tcx> !Send for BasicBlocks<'tcx>

§

impl<'tcx> !Sync for BasicBlocks<'tcx>

§

impl<'tcx> Unpin for BasicBlocks<'tcx>

§

impl<'tcx> !UnwindSafe for BasicBlocks<'tcx>

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<_>>()).

§

type Output = R

source§

impl<Tcx, T> DepNodeParams<Tcx> for T
where Tcx: DepContext, T: for<'a> HashStable<StableHashingContext<'a>> + Debug,

source§

default fn fingerprint_style() -> FingerprintStyle

source§

default fn to_fingerprint(&self, tcx: Tcx) -> Fingerprint

This method turns the parameters of a DepNodeConstructor into an opaque Fingerprint to be used in DepNode. Not all DepNodeParams support being turned into a Fingerprint (they don’t need to if the corresponding DepNode is anonymous).
source§

default fn to_debug_str(&self, _: Tcx) -> String

source§

default fn recover(_: Tcx, _: &DepNode) -> Option<T>

This method tries to recover the query key from the given DepNode, something which is needed when forcing DepNodes during red-green evaluation. The query system will only call this method if fingerprint_style() is not FingerprintStyle::Opaque. It is always valid to return None here, in which case incremental compilation will treat the query as having changed instead of forcing it.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

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<P> IntoQueryParam<P> for P

source§

impl<'tcx, T> IsSuggestable<'tcx> for T
where T: TypeVisitable<TyCtxt<'tcx>> + TypeFoldable<TyCtxt<'tcx>>,

source§

fn is_suggestable(self, tcx: TyCtxt<'tcx>, infer_suggestable: bool) -> bool

Whether this makes sense to suggest in a diagnostic. Read more
source§

fn make_suggestable( self, tcx: TyCtxt<'tcx>, infer_suggestable: bool ) -> Option<T>

source§

impl<T> MaybeResult<T> for T

§

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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<'tcx, T> ToPredicate<'tcx, T> for T

source§

fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> T

source§

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

§

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>,

§

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<'tcx, T> TypeVisitableExt<'tcx> for T
where T: TypeVisitable<TyCtxt<'tcx>>,

source§

fn has_vars_bound_at_or_above(&self, binder: DebruijnIndex) -> bool

Returns true if self has any late-bound regions that are either bound by binder or bound by some binder outside of binder. If binder is ty::INNERMOST, this indicates whether there are any late-bound regions that appear free.
source§

fn has_vars_bound_above(&self, binder: DebruijnIndex) -> bool

Returns true if this type has any regions that escape binder (and hence are not bound by it).
source§

fn has_escaping_bound_vars(&self) -> bool

Return true if this type has regions that are not a part of the type. For example, for<'a> fn(&'a i32) return false, while fn(&'a i32) would return true. The latter can occur when traversing through the former. Read more
source§

fn has_type_flags(&self, flags: TypeFlags) -> bool

source§

fn has_projections(&self) -> bool

source§

fn has_inherent_projections(&self) -> bool

source§

fn has_opaque_types(&self) -> bool

source§

fn has_coroutines(&self) -> bool

source§

fn references_error(&self) -> bool

source§

fn error_reported(&self) -> Result<(), ErrorGuaranteed>

source§

fn has_non_region_param(&self) -> bool

source§

fn has_infer_regions(&self) -> bool

source§

fn has_infer_types(&self) -> bool

source§

fn has_non_region_infer(&self) -> bool

source§

fn has_infer(&self) -> bool

source§

fn has_placeholders(&self) -> bool

source§

fn has_non_region_placeholders(&self) -> bool

source§

fn has_param(&self) -> bool

source§

fn has_free_regions(&self) -> bool

“Free” regions in this context means that it has any region that is not (a) erased or (b) late-bound.
source§

fn has_erased_regions(&self) -> bool

source§

fn has_erasable_regions(&self) -> bool

True if there are any un-erased free regions.
source§

fn is_global(&self) -> bool

Indicates whether this value references only ‘global’ generic parameters that are the same regardless of what fn we are in. This is used for caching.
source§

fn has_bound_regions(&self) -> bool

True if there are any late-bound regions
source§

fn has_non_region_bound_vars(&self) -> bool

True if there are any late-bound non-region variables
source§

fn has_bound_vars(&self) -> bool

True if there are any bound variables
source§

fn still_further_specializable(&self) -> bool

Indicates whether this value still has parameters/placeholders/inference variables which could be replaced later, in a way that would change the results of impl specialization.
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

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: 184 bytes