LLVM - 给定一个寄存器,获取它在 IR 表示中最后使用的位置

LLVM - given a register, get where it was last used in the IR representation

我正在尝试跟踪源代码中的数据流。为此,我正在查看 load 类型的指令,并使用

获取它们从哪个寄存器加载值
*(LI->getPointerOperand())

LILoadInst 类型的指令。现在我需要知道最后一次访问该寄存器的位置,以便我可以指出检查从该指令到该指令的数据流。任何建议将不胜感激。

最初,通过排除循环和具有多个出口的函数来简化问题,这样您就有一个函数 CFG 作为单入口和单出口图。

一种(可能是简单的)方法是首先通过执行以下操作找到其所有用户:

llvm::Instruction i = [the register for that LoadInst];
auto users = i->users();

然后使用 PostDominatorTree and the getLevel method of the DomTreeNodeBase (I think this was introduced with LLVM 5.0.0, if not available in your version you could use getChildren and perform a BFS 遍历),您可以筛选出级别最高的那些。

我不确定你想用循环做什么,但如果没有什么特别的,上面的应该足够了。为了处理函数的多个退出,您可以在任何处理之前使用 mergereturn 传递。