llvm: Как получить граф вызовов для модуля внешнего узла
У меня есть программа, позволяющая рассмотреть myProgram.c, которая использует некоторую библиотеку (созданная пользователем библиотека), скажем, myLibrary.
#include "myLibrary.h"'
int main()
{
//call some function in myLibrary lets say foo
foo();
}
Теперь, когда я создал модуль проход. И я генерирую граф вызовов. Теперь в сгенерированном графе вызовов есть узел для функции foo() следующим образом:
Вызвать узел графа для функции: 'foo'<<0x951d300>> # использует =3 CS<0x0> вызывает внешний узел.
Теперь я хочу, чтобы все функции, которые будут вызываться этим foo в myLibrary.
Является ли это возможным? Могу ли я получить граф вызовов myLibrary через узел графа вызовов функции foo в myProgram.c
1 ответ
Я попробовал это с помощью следующих шагов, и смог получить все функции из графа вызовов.
Сначала my_program.c выглядит так
#include "my_library.h"
int main()
{
foo();
}
my_library.c is
#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, что странно, но у меня нет объяснения этому.