llvm:如何获取外部节点模块的调用图

时间:2017-07-27 16:59:56

标签: llvm llvm-clang llvm-ir

我有一个程序让我们考虑myProgram.c使用一些库(用户创建的库)让我们说myLibrary。

#include "myLibrary.h"'

int main()
{
    //call some function in myLibrary lets say foo
    foo();
}

现在我创建了一个模块传递。我正在生成调用图。 现在在生成的调用图中,函数foo()的节点如下:

调用图形节点的功能:'foo'<<< 0x951d300>> #使用= 3   CS<为0x0>调用外部节点。

现在我想要所有将被这个foo调用的函数 “我的图书馆”。

有可能吗?我可以通过myProgram.c中函数foo的调用图节点获取myLibrary的调用图吗?

1 个答案:

答案 0 :(得分:0)

我通过以下步骤尝试了此操作,并且能够从调用图中获取所有函数。

首先my_program.c看起来像

#include "my_library.h"
int main()
{
    foo();
}

my_library.c是

#include "my_library.h"
void boo() {}

void foo()
{
    boo();
}

clang++ my_program.c -c -emit-llvm
clang++ my_library.c -c -emit-llvm
llvm-link my_program.bc my_library.bc -o linked.bc

然后我使用自定义ModulePass来遍历调用图。要获得调用图,ModulePass使用llvm CallGraphWrapperPass传递。

如果我使用clang而不是clang ++,CallGraph不捕获主调用foo,这很奇怪,但我对此没有任何解释。