MIR ビジター
MIR ビジターは、MIR を走査し、何かを探したり変更を加えたりするための便利なツールです。ビジタートレイトは the rustc_middle::mir::visit module で定義されています。これらは単一のマクロによって生成される 2 つのトレイトです。Visitor(&Mir に対して動作し、共有参照を返す)と MutVisitor(&mut Mir に対して動作し、可変参照を返す)です。
ビジターを実装するには、ビジターを表す型を作成する必要があります。通常、この型には MIR の処理中に必要となる何らかの状態を「保持」させます。
struct MyVisitor<...> {
tcx: TyCtxt<'tcx>,
...
}
そして、その型に対して Visitor または MutVisitor トレイトを実装します。
impl<'tcx> MutVisitor<'tcx> for MyVisitor {
fn visit_foo(&mut self, ...) {
...
self.super_foo(...);
}
}
上に示したように、impl の中では任意の visit_foo メソッド(たとえば visit_terminator)をオーバーライドして、foo が見つかるたびに実行されるコードを書くことができます。foo の内容を再帰的に走査したい場合は、super_foo メソッドを呼び出します。(注意: super_foo をオーバーライドすることはありません。)
ビジターの非常に単純な例は LocalFinder にあります。このビジターは visit_local メソッドを実装することで、並べ替えの候補になり得るローカル変数を特定します。
走査
ビジターに加えて、the rustc_middle::mir::traversal module には、MIR CFG を さまざまな標準的な順序(たとえば先行順、逆後行順など)で走査するための便利な関数が含まれています。