MIR 방문자
MIR 방문자는 MIR을 순회하면서 무언가를 찾거나 MIR을 변경할 때 쓰는 편리한 도구입니다. 방문자 트레이트는 rustc_middle::mir::visit 모듈에 정의되어 있습니다. 하나의 매크로로 생성되는 트레이트가 두 가지 있는데, &Mir에서 동작하며 공유 참조를 돌려주는 Visitor와 &mut Mir에서 동작하며 가변 참조를 돌려주는 MutVisitor입니다.
방문자를 구현하려면 해당 방문자를 나타내는 타입을 만들어야 합니다. 일반적으로 이 타입은 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 메서드를 구현하여 재정렬 후보가 될 수 있는 지역 변수를 식별합니다.
순회
방문자 외에도 rustc_middle::mir::traversal 모듈에는 MIR CFG를 여러 표준 순서(예: 전위 순서, 역후위 순서 등)로 순회하는 데 유용한 함수들이 들어 있습니다.