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

时间:2017-12-04 20:20:35

标签: llvm llvm-clang llvm-ir dataflow

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

获取他们正在加载值的寄存器
*(LI->getPointerOperand())

LILoadInst类型的指令。现在我需要知道上次访问该寄存器的位置,以便我可以指出检查该指令的数据流到此。任何建议将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

最初,通过排除具有多个出口的循环和函数来简化问题,以便将CFG函数作为单个条目和单个退出图形。

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

function myAction() {
  return (dispatch, getState) => {
    ...
    dispatch(firstAction);

    const state = getState();

    // Check your state conditions from first action here.
    dispatch(secondAction);
    ...
  }
}

然后使用PostDominatorTreeDomTreeNodeBasellvm::Instruction i = [the register for that LoadInst]; auto users = i->users(); 方法(我认为this引入了getLevel 5.0.0,如果不可用您可以使用LLVM并执行BFS遍历的版本,您可以过滤那些级别最高的版本。

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