pub enum AddCallGuards {
AllCallEdges,
CriticalCallEdges,
}
Variants
AllCallEdges
CriticalCallEdges
Implementations
sourceimpl AddCallGuards
impl AddCallGuards
pub fn add_call_guards(&self, body: &mut Body<'_>)
Trait Implementations
sourceimpl<'tcx> MirPass<'tcx> for AddCallGuards
impl<'tcx> MirPass<'tcx> for AddCallGuards
Breaks outgoing critical edges for call terminators in the MIR.
Critical edges are edges that are neither the only edge leaving a block, nor the only edge entering one.
When you want something to happen “along” an edge, you can either do at the end of the predecessor block, or at the start of the successor block. Critical edges have to be broken in order to prevent “edge actions” from affecting other edges. We need this for calls that are codegened to LLVM invoke instructions, because invoke is a block terminator in LLVM so we can’t insert any code to handle the call’s result into the block that performs the call.
This function will break those edges by inserting new blocks along them.
NOTE: Simplify CFG will happily undo most of the work this pass does.
fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>)
fn name(&self) -> Cow<'_, str>
sourcefn is_enabled(&self, _sess: &Session) -> bool
fn is_enabled(&self, _sess: &Session) -> bool
true
if this pass is enabled with the current combination of compiler flags.sourcefn phase_change(&self) -> Option<MirPhase>
fn phase_change(&self) -> Option<MirPhase>
fn is_mir_dump_enabled(&self) -> bool
sourceimpl PartialEq<AddCallGuards> for AddCallGuards
impl PartialEq<AddCallGuards> for AddCallGuards
sourcefn eq(&self, other: &AddCallGuards) -> bool
fn eq(&self, other: &AddCallGuards) -> bool
impl StructuralPartialEq for AddCallGuards
Auto Trait Implementations
impl RefUnwindSafe for AddCallGuards
impl Send for AddCallGuards
impl Sync for AddCallGuards
impl Unpin for AddCallGuards
impl UnwindSafe for AddCallGuards
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut 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: 1 byte
Size for each variant:
AllCallEdges
: 0 bytesCriticalCallEdges
: 0 bytes