Как создать граф вызовов для кода C с большим количеством директив условной компиляции? - PullRequest
0 голосов
/ 26 сентября 2018

Я просматриваю исходный код ядра 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.

...