MIR 디버깅
-Z dump-mir 플래그를 사용하면 MIR의 텍스트 표현을 덤프할 수 있습니다. -Z dump-mir와 함께 사용하는 다음 선택적 플래그를 쓰면 추가 출력 형식을 사용할 수 있으며, 그 예는 다음과 같습니다:
-Z dump-mir-graphviz- MIR을 제어 흐름 그래프로 나타내는.dot파일을 덤프합니다-Z dump-mir-dataflow- 제어 흐름 그래프의 각 지점에서의 데이터 흐름 상태를 보여 주는.dot파일을 덤프합니다
-Z dump-mir=F는 컴파일의 각 단계에서 각 함수의 MIR을 볼 수 있게 해 주는 편리한 컴파일러 옵션입니다. -Z dump-mir는 필터 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 함수 안에 나타난 “승격된 상수(promoted constants)“의 MIR을 가리킵니다.)
-Z unpretty=mir-cfg 플래그를 사용하면 크레이트 전체에 대한 graphviz MIR 제어 흐름 다이어그램을 만들 수 있습니다:
TODO: 그 밖에 추가할 내용이 있습니까?