我有一个程序让我们考虑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的调用图吗?
答案 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,这很奇怪,但我对此没有任何解释。