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

llvm: How to get the call graph for a module of external node

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

#include "myLibrary.h"'

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

现在我已经创建了一个模块通行证。我正在生成调用图。 现在在生成的调用图中有一个函数 foo() 的节点,如下所示:

函数的调用图节点:'foo'<<0x951d300>> #uses=3 CS<0x0> 调用外部节点。

现在我想要这个 foo 在 "myLibrary"。

可能吗?能否通过myProgram.c

中函数foo的调用图节点获取myLibrary的调用图

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

第一个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 pass.

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