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, что странно, но у меня нет объяснения этому.

Другие вопросы по тегам