MIR visitor

MIR visitor 是遍历 MIR 并查找事物或对其进行更改的便捷工具。Visitor trait 是在 the rustc_middle::mir::visit module 中定义的-其中有两个是通过单个宏生成的:Visitor(工作于 &Mir 之上,返回共享引用)和 MutVisitor(工作于 &mut Mir之上,并返回可变引用)。

要实现 Visitor,您必须创建一个代表您的 Visitor 的类型。 通常,此类型希望在处理 MIR 时“挂”到您需要的任何状态上:

struct MyVisitor<...> {
    tcx: TyCtxt<'tcx>,
    ...
}

然后为该类型实现 VisitorMutVisitor

impl<'tcx> MutVisitor<'tcx> for NoLandingPads {
    fn visit_foo(&mut self, ...) {
        ...
        self.super_foo(...);
    }
}

如上所示,在实现过程中,您可以覆盖任何 visit_foo 方法(例如,visit_terminator),以便编写一些代码,这些代码将在遇到foo 时执行。如果要递归遍历foo的内容,则可以调用 super_foo 方法。 (注意:您永远都不应该覆盖 super_foo

一个非常简单的 Visitor 示例可以在 NoLandingPads 中找到。该 Visitor 甚至不需要任何状态:它仅访问所有终止符并删除其“展开”的后继者。

遍历

除了 Visitor 之外,rustc_middle::mir::traversal 模块 也包含一些有用的函数,用于以不同的标准顺序(例如,前序,反向后序,依此类推)遍历 MIR CFG。