rustc_mir_dataflow

Module framework

Source
Expand description

A framework that can express both gen-kill and generic dataflow problems.

To use this framework, implement the Analysis trait. There used to be a GenKillAnalysis alternative trait for gen-kill analyses that would pre-compute the transfer function for each block. It was intended as an optimization, but it ended up not being any faster than Analysis.

The impls module contains several examples of dataflow analyses.

Then call iterate_to_fixpoint on your type that impls Analysis to get a Results. From there, you can use a ResultsCursor to inspect the fixpoint solution to your dataflow problem (good for inspecting a small number of locations), or implement the ResultsVisitor interface and use visit_results (good for inspecting many or all locations). The following example uses the ResultsCursor approach.

โ“˜
use rustc_const_eval::dataflow::Analysis; // Makes `iterate_to_fixpoint` available.

fn do_my_analysis(tcx: TyCtxt<'tcx>, body: &mir::Body<'tcx>) {
    let analysis = MyAnalysis::new()
        .iterate_to_fixpoint(tcx, body, None)
        .into_results_cursor(body);

    // Print the dataflow state *after* each statement in the start block.
    for (_, statement_index) in body.block_data[START_BLOCK].statements.iter_enumerated() {
        cursor.seek_after(Location { block: START_BLOCK, statement_index });
        let state = cursor.get();
        println!("{:?}", state);
    }
}

Re-exportsยง

Modulesยง

  • cursor ๐Ÿ”’
    Random access inspection of the results of a dataflow analysis.
  • direction ๐Ÿ”’
  • Custom formatting traits used when outputting Graphviz diagrams with the results of a dataflow analysis.
  • A helpful diagram for debugging dataflow problems.
  • Traits used to represent lattices for use as the domain of a dataflow analysis.
  • results ๐Ÿ”’
    Dataflow analysis results.
  • visitor ๐Ÿ”’

Structsยง

Enumsยง

Traitsยง

  • A dataflow problem with an arbitrarily complex transfer function.
  • Analysis domains are all bitsets of various kinds. This trait holds operations needed by all of them.
  • The legal operations for a transfer function in a gen/kill problem.
  • A type that records the edge-specific effects for a SwitchInt terminator.