Как использовать LLVM для генерации графа вызовов? - PullRequest
13 голосов
/ 30 марта 2012

Я пытаюсь сгенерировать граф вызовов для ядра Linux, который будет включать указатели на функции (см. Мой предыдущий вопрос Генерация статического графа вызовов для ядра Linux для получения дополнительной информации). Мне сказали, что LLVM должен подходить для этой цели, однако я не смог найти соответствующую информацию на llvm.org

Буду признателен за любую помощь, включая указатели на соответствующую документацию.

1 Ответ

14 голосов
/ 30 марта 2012

Сначала вы должны скомпилировать ваше ядро ​​в LLVM IR (вместо собственных объектных файлов).Затем, используя llvm-ld, объедините все файлы объектов IR в один большой модуль.Это может быть довольно сложно сделать, вам придется сильно изменить make-файлы, но я считаю, что это выполнимо.

Теперь вы можете сделать свой анализ.Простой график вызовов может быть создан с помощью инструмента opt с проходом -dot-callgraph.Маловероятно обрабатывать указатели функций, поэтому вы можете захотеть изменить его.

Отслеживание всех возможных путей потока данных, которые будут содержать ваши функциональные указатели, является довольно сложной задачей, и в общем случае это невозможно сделать (если есть какой-либо указатель на целочисленные приведения, если указатели хранятся в сложных данныхсооружения и т. д.).В большинстве конкретных случаев вы можете попытаться реализовать глобальную абстрактную интерпретацию, чтобы приблизить все возможные пути потока данных для ваших указателей.Конечно, это не будет точным, но тогда вы получите хотя бы консервативное приближение.

...