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.

Create an Engine for your analysis using the into_engine method on the Analysis trait, then call iterate_to_fixpoint. From there, you can use a ResultsCursor to inspect the fixpoint solution to your dataflow problem, or implement the ResultsVisitor interface and use visit_results. The following example uses the ResultsCursor approach.

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

fn do_my_analysis(tcx: TyCtxt<'tcx>, body: &mir::Body<'tcx>) {
    let analysis = MyAnalysis::new()
        .into_engine(tcx, body)
        .iterate_to_fixpoint()
        .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 ๐Ÿ”’
  • engine ๐Ÿ”’
    A solver for dataflow problems.
  • 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.
  • 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.