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