MIR デバッグ
-Z dump-mir フラグを使用すると、MIR のテキスト表現をダンプできます。
以下の任意のフラグを -Z dump-mir と組み合わせて使用すると、追加の出力形式が有効になります。これには次のものが含まれます。
-Z dump-mir-graphviz- MIR を制御フローグラフとして表す.dotファイルをダンプします-Z dump-mir-dataflow- 制御フローグラフ内の各地点における dataflow state を示す.dotファイルをダンプします
-Z dump-mir=F は、コンパイルの各ステージで各関数の MIR を表示できる便利なコンパイラオプションです。-Z dump-mir は filter F を受け取り、どの関数とどのパスに関心があるかを制御できます。例:
> rustc -Z dump-mir=foo ...
これは、名前に foo を含む任意の関数について MIR をダンプします。また、各パスの前後の両方で MIR をダンプします。これらのファイルは mir_dump ディレクトリに作成されます。おそらくかなり多くのファイルが作成されるでしょう。
> cat > foo.rs
fn main() {
println!("Hello, world!");
}
^D
> rustc -Z dump-mir=main foo.rs
> ls mir_dump/* | wc -l
161
ファイルには rustc.main.000-000.CleanEndRegions.after.mir のような名前が付けられます。これらの名前はいくつかの部分で構成されています。
rustc.main.000-000.CleanEndRegions.after.mir
---- --- --- --------------- ----- either before or after
| | | name of the pass
| | index of dump within the pass (usually 0, but some passes dump intermediate states)
| index of the pass
def-path to the function etc being dumped
より選択的なフィルターを作成することもできます。たとえば、main & CleanEndRegions は、main とパス CleanEndRegions の 両方 を参照するものを選択します。
> rustc -Z dump-mir='main & CleanEndRegions' foo.rs
> ls mir_dump
rustc.main.000-000.CleanEndRegions.after.mir rustc.main.000-000.CleanEndRegions.before.mir
フィルターには、複数の & フィルターの集合を組み合わせるための | 部分を含めることもできます。たとえば、main & CleanEndRegions | main & NoLandingPads は、main と CleanEndRegions、または main と NoLandingPads の いずれか を選択します。
> rustc -Z dump-mir='main & CleanEndRegions | main & NoLandingPads' foo.rs
> ls mir_dump
rustc.main-promoted[0].002-000.NoLandingPads.after.mir
rustc.main-promoted[0].002-000.NoLandingPads.before.mir
rustc.main-promoted[0].002-006.NoLandingPads.after.mir
rustc.main-promoted[0].002-006.NoLandingPads.before.mir
rustc.main-promoted[1].002-000.NoLandingPads.after.mir
rustc.main-promoted[1].002-000.NoLandingPads.before.mir
rustc.main-promoted[1].002-006.NoLandingPads.after.mir
rustc.main-promoted[1].002-006.NoLandingPads.before.mir
rustc.main.000-000.CleanEndRegions.after.mir
rustc.main.000-000.CleanEndRegions.before.mir
rustc.main.002-000.NoLandingPads.after.mir
rustc.main.002-000.NoLandingPads.before.mir
rustc.main.002-006.NoLandingPads.after.mir
rustc.main.002-006.NoLandingPads.before.mir
(ここで、main-promoted[0] ファイルは、main 関数内に現れた「昇格された定数」の MIR を参照しています。)
-Z unpretty=mir-cfg フラグを使用すると、クレート全体の graphviz MIR 制御フロー図を作成できます。
TODO: ほかに何かあるか?