MIR 访问者

MIR访问者是遍历MIR并查找事物或对其进行更改的便捷工具。 访问者trait特征是在rustc ::mir::visit模块中定义的 ——其中有两个是通过宏生成的:Visitor(在&Mir上运行并返回共享引用)和MutVisitor(在&mut Mir上运行并返回可变引用)。

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

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

然后您可以为那个类型实现 VisitorMutVisitor trait:

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

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

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

遍历

In addition the visitor, the rustc::mir::traversal module contains useful functions for walking the MIR CFG in different standard orders (e.g. pre-order, reverse post-order, and so forth).

除了访问者之外, rustc::mir::traversal模块也包含了用于按不同的标准顺序(例如,先根序、后根序等等)便利MIR CFG的实用函数。