struct GraphAssembler<'tcx> {
graph: DiGraph<DepNode<'tcx, CallString>, DepEdge<CallString>>,
nodes: FxHashMap<DepNode<'tcx, CallString>, NodeIndex>,
control_inputs: Box<[(NodeIndex, DepEdge<CallString>)]>,
}
Fields§
§graph: DiGraph<DepNode<'tcx, CallString>, DepEdge<CallString>>
§nodes: FxHashMap<DepNode<'tcx, CallString>, NodeIndex>
§control_inputs: Box<[(NodeIndex, DepEdge<CallString>)]>
Implementations§
Source§impl<'tcx> GraphAssembler<'tcx>
impl<'tcx> GraphAssembler<'tcx>
fn new() -> Self
fn add_node(&mut self, node: DepNode<'tcx, CallString>) -> NodeIndex
Sourcefn with_new_ctr_inputs<'c, F, R, K>(
&mut self,
vis: &mut VisitDriver<'tcx, 'c, K>,
new_ctrl_inputs: &[(DepNode<'tcx, OneHopLocation>, DepEdge<OneHopLocation>)],
f: F,
) -> Rwhere
F: FnOnce(&mut Self, &mut VisitDriver<'tcx, 'c, K>) -> R,
fn with_new_ctr_inputs<'c, F, R, K>(
&mut self,
vis: &mut VisitDriver<'tcx, 'c, K>,
new_ctrl_inputs: &[(DepNode<'tcx, OneHopLocation>, DepEdge<OneHopLocation>)],
f: F,
) -> Rwhere
F: FnOnce(&mut Self, &mut VisitDriver<'tcx, 'c, K>) -> R,
Forwarding of control flow. It is sound to replace the control inputs here rather than extend them because we are guaranteed that these new nodes are connected to the old ctrl nodes, possibly transitively.
Each node in our graph is either connected to a local control flow
node or to the ones coming from the parent, which is established by
the visit_partial_graph
function. By induction all nodes, including
these control flow sources are connected to the old ctrl inputs.
Trait Implementations§
Source§impl<'tcx, K: Hash + Eq + Clone> Visitor<'tcx, K> for GraphAssembler<'tcx>
impl<'tcx, K: Hash + Eq + Clone> Visitor<'tcx, K> for GraphAssembler<'tcx>
fn visit_inlined_call( &mut self, vis: &mut VisitDriver<'tcx, '_, K>, loc: Location, inst: Instance<'tcx>, k: &K, ctrl_inputs: &[(DepNode<'tcx, OneHopLocation>, DepEdge<OneHopLocation>)], )
fn visit_edge( &mut self, vis: &mut VisitDriver<'tcx, '_, K>, src: &DepNode<'tcx, OneHopLocation>, dst: &DepNode<'tcx, OneHopLocation>, kind: &DepEdge<OneHopLocation>, )
fn visit_partial_graph( &mut self, vis: &mut VisitDriver<'tcx, '_, K>, graph: &PartialGraph<'tcx, K>, )
fn visit_node( &mut self, _vis: &mut VisitDriver<'tcx, '_, K>, _node: &DepNode<'tcx, OneHopLocation>, )
Auto Trait Implementations§
impl<'tcx> Freeze for GraphAssembler<'tcx>
impl<'tcx> !RefUnwindSafe for GraphAssembler<'tcx>
impl<'tcx> Send for GraphAssembler<'tcx>
impl<'tcx> Sync for GraphAssembler<'tcx>
impl<'tcx> Unpin for GraphAssembler<'tcx>
impl<'tcx> !UnwindSafe for GraphAssembler<'tcx>
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
Mutably borrows from an owned value. Read more
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>
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 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>
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