Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 を さまざまな標準的な順序(たとえば先行順、逆後行順など)で走査するための便利な関数が含まれています。