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 デバッグ

-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-mirfilter 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 は、mainCleanEndRegions、または mainNoLandingPadsいずれか を選択します。

> 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: ほかに何かあるか?