我怎样才能得到的是在程序中的各个功能进行函数调用列表,从LLVM的中间表示?(How can I g

2019-09-27 11:24发布

我试图建立与LLVM代码分析工具的简单版本。

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

我怎样才能得到的是在程序中的各个功能进行函数调用列表,从LLVM的中间表示?

所述输入参数I具有是LLVM的一个实例:模块类,它表示该程序。 然后,我得到的与功能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

  }

}

Answer 1:

这是我们工作的代码片段在这里 :

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可以以类似的方式获得。

谷歌CallInst vs InvokeInst也了解有或没有调用的函数的功能。 如果一个函数没有调用的函数,这是间接调用。 间接调用出现在LLVM IR当源代码而不是直接调用的函数的,调用一个函数指针。 在C ++中,当一些类通过一个抽象接口(多态性),经营这经常发生。 所以请记住,这是不是100%,总能够跟踪调用的函数,即使你有一个适当的调用指令。



文章来源: How can I get the list of function calls that are performed in each function of a program, from the intermediate representation of LLVM?
标签: c++ llvm