从 LLVM 的机器指令调用函数

har*_*rry 6 c++ llvm clang

有没有办法从机器指令中获取被调用的函数?

现在我正在确定机器指令是否是函数调用,如下所示:

for (MachineBasicBlock &MBB : MF) {
  for (MachineInstr &MI : MBB) {
    if (MI.getDesc().isCall()) {
      // Function call
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我试图遵循这一点,但我在所有情况下都得到了isSymbol()同样的结果。false

我只对直接调用感兴趣(函数指针被忽略)。

Jan*_*ann 0

您应该能够直接转换第一个操作数:

if(MI.getOperand(0).getType() == llvm::MachineOperand::MO_GlobalAddress) {
  const GlobalValue *GV = MI.getOperand(0).getGlobal();
  const Function *Callee = dyn_cast<Function>(GV);
  
  assert(Callee != nullptr && "Unexpected type of global value");
}
Run Code Online (Sandbox Code Playgroud)