在 LLVM 中使用 PtrUseVisitor Class 的正确方法

Correct way to use PtrUseVisitor Class in LLVM

所以我在 LLVM 中找到了 InstVisitor class,这让我耳目一新,可以遍历函数并查看我感兴趣的指令。我能够让它工作的一个简单的实现如下:

class MyInstVisitor : public InstVisitor <MyInstVisitor> {
    public:

    void visitLoadInst(Instruction &I) {
        errs() << "Load:\t" << I << "\n";
    }
};

之后使用案例如下:

void visitor(Function &F) {
    MyInstVisitor MAV;
    MAV.visit(F);
    for (auto &I : F) {
        errs() << I << "\n"; // this traverses a function through for loop
    }
}

进一步查看后,我发现了 InstVisitor 的 child class,我想使用的 PtrUseVisitor (https://llvm.org/doxygen/classllvm_1_1PtrUseVisitor.html)(作为我希望在定位到llvm::LoadInst).

后访问一个指针值的所有用户

但是,我一直在努力寻找一种正确使用它的方法。

我试过各种各样的东西,总结一下:

  1. PtrUseVisitor不能像InstVisitor
  2. 那样被实例化
  3. 因为模板看起来像这样:llvm::PtrUseVisitor<DerivedT>我也试过做类似llvm::PtrUseVisitor<Instruction>::visitPtr()的事情,这是不正确的。
  4. 我想我遗漏了一些关于如何使用继承的 child class 的东西,但我能找到的例子与基本事物有关(例如从 class 继承Animal,例如)

还有很多...只是现在有点迷路了。

我的主要目标是使用以下成员函数: PtrUseVisitor::visitPtr()。任何人都可以帮我提供一个如何使用它的例子吗?

感谢您提供的任何帮助。

看一下 SROA 传递,它定义了一个 class AllocaSlices::SliceBuilder 继承自 PtrUseVisitor。如果您在 class 中查看对 Base:: 方法的调用,这些方法正在使用 PtrUseVisitor.