如何从LLVM的中间表示中获取在程序的每个函数中执行的函数调用列表?

时间:2017-04-01 18:33:45

标签: c++ llvm

我正在尝试使用LLVM构建一个简单版本的代码分析工具。

我有一些.ll文件包含某些程序的中间LLVM表示。

如何从LLVM的中间表示中获取在程序的每个函数中执行的函数调用列表?

我输入的参数是LLVM:Module类的一个实例,它代表程序。然后,我使用函数getFunctionList()获得程序中存在的函数列表。

void getFunctionCalls(const Module *M)
{

  // Iterate functions in program
  for (auto curFref = M->getFunctionList().begin(), endFref = M->getFunctionList().end();
 curFref != endFref; ++curFref) {

        // For each function
        // Get list of function calls

  }

}

1 个答案:

答案 0 :(得分:4)

这是我们工作代码here中的一个片段:

for (auto &module : Ctx.getModules()) {
  auto &functionList = module->getModule()->getFunctionList();
  for (auto &function : functionList) {
    for (auto &bb : function) {
      for (auto &instruction : bb) {
        if (CallInst *callInst = dyn_cast<CallInst>(&instruction)) {
          if (Function *calledFunction = callInst->getCalledFunction()) {
            if (calledFunction->getName().startswith("llvm.dbg.declare")) {

另请注意,还可以通过类似的方式获取调用说明InvokeInst

Google CallInst vs InvokeInst并了解有或没有被调用函数的函数。如果函数没有被调用的函数,则这是间接调用。当源代码而不是直接调用函数时,间接调用出现在LLVM IR中,调用函数指针。在C ++中,当某些类通过抽象接口(多态)进行操作时,通常会发生这种情况。所以请记住,即使你有一个调用指令,跟踪一个被调用的函数也不是百分之百。