BlockData

Struct BlockData 

Source
struct BlockData<'a> {
    pub id: BlockId,
    pub contents: &'a BlockData,
    pub is_loop_header: bool,
    pub is_switch: bool,
    pub is_merge_target: bool,
    pub reverse_postorder: Option<u32>,
    pub immediately_dominates: SmallVec<[BlockId; 2]>,
    pub within_loops: SmallVec<[BlockId; 2]>,
    pub only_reach_error: bool,
    pub shortest_paths: HashMap<BlockId, usize>,
    pub flow: IndexVec<BlockId, Ratio<DynaInt<u64, BigUint>>>,
    pub exit_info: ExitInfo,
}

Fields§

§id: BlockId§contents: &'a BlockData§is_loop_header: bool

The (unique) entrypoints of each loop. Unique because we error on irreducible cfgs.

§is_switch: bool

Whether this block is a switch.

§is_merge_target: bool

Blocks that have multiple incoming control-flow edges.

§reverse_postorder: Option<u32>

Order in a reverse postorder numbering. None if the block is unreachable.

§immediately_dominates: SmallVec<[BlockId; 2]>

Nodes that this block immediately dominates. Sorted by reverse_postorder_id, with largest id first.

§within_loops: SmallVec<[BlockId; 2]>

List of loops inside of which this node is (loops are identified by their header). A node is considered inside a loop if it is reachable from the loop header and if it can reach the loop header using only the backwards edges into it (i.e. we don’t count a path that enters the loop header through a forward edge).

Note that we might have to take a backward edge to reach the loop header, e.g.: ’a: loop { // … ’b: loop { // … if true { continue ’a; } else { if true { break ’a; } // This node has to take two backward edges in order to reach the start of 'a. } } }

The restriction on backwards edges is for the following case: loop { loop { .. } // Not in inner loop }

This is sorted by path order from the graph root.

§only_reach_error: bool

Node from where we can only reach error nodes (panic, etc.)

§shortest_paths: HashMap<BlockId, usize>

List of reachable nodes, with the length of shortest path to them. Includes the current node.

§flow: IndexVec<BlockId, Ratio<DynaInt<u64, BigUint>>>

Let’s say we put a quantity of water equal to 1 on the block, and the water flows downards. Whenever there is a branching, the quantity of water gets equally divided between the branches. When the control flows join, we put the water back together. The set below computes the amount of water received by each descendant of the node.

TODO: there must be a known algorithm which computes this, right?… This is exactly this problems: https://stackoverflow.com/questions/78221666/algorithm-for-total-flow-through-weighted-directed-acyclic-graph TODO: the way I compute this is not efficient.

§exit_info: ExitInfo

Reconstructed information about loops and switches.

Implementations§

Trait Implementations§

Source§

impl<'a> Debug for BlockData<'a>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for BlockData<'a>

§

impl<'a> RefUnwindSafe for BlockData<'a>

§

impl<'a> Send for BlockData<'a>

§

impl<'a> Sync for BlockData<'a>

§

impl<'a> Unpin for BlockData<'a>

§

impl<'a> UnwindSafe for BlockData<'a>

Blanket Implementations§

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
§

impl<I, T> ExtractContext<I, ()> for T

§

fn extract_context(self, _original_input: I)

Given the context attached to a nom error, and given the original input to the nom parser, extract more the useful context information. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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
§

impl<I> RecreateContext<I> for I

§

fn recreate_context(_original_input: I, tail: I) -> I

Given the original input, as well as the context reported by nom, recreate a context in the original string where the error occurred. Read more
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.
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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