Я просматриваю исходный код ядра Linux и хочу глубоко понять некоторые его подсистемы.Для этого я пытаюсь сгенерировать статический граф вызовов из исходных файлов.
В настоящее время я использую одну подсистему (обычно сгруппированную в один подкаталог, например, mm / для памяти).управления), и исправьте его make-файл для выгрузки промежуточного представления -
ccflags+=-fdump-rtl-expand
. Это создает несколько файлов .expand, которые являются промежуточным представлением, сгенерированным GCC.египет используется для создания графа вызовов из этого промежуточного представления.
$ls -l *.expand > file_list
$egypt `file_list` | dot -Grankdir=LR -Tsvg -o callgraph.svg
Проблема этого подхода заключается в том, что он не может заботиться о некоторых функциях, которые условно компилируются.Например, рассмотрим фрагмент кода -
int main()
{
#ifdef FOO
foo();
#else
bar();
#endif
}
В графе вызова для приведенного выше кода будут показаны функции foo () и bar (), вызываемые из main (), хотя это зависит от макроса 'FOO'определено в другом месте.
Есть ли лучшие инструменты, которые могут создавать граф вызовов программы на C с директивами условной компиляции?
Есть ли способ генерироватьпредварительно обработанный вывод программы на C, которая не раскрывает #includes, но расширяет все директивы условной компиляции? Таким образом, я могу передать предварительно обработанный вывод в египет для генерации callgraph.