Чтобы получить AST, а также познакомиться с этапами внешнего интерфейса, в книге «Основные библиотеки LLVM» есть глава о внешнем интерфейсе. В основном это имеет такой поток (в случае llvm-4.0.1 и должен быть похожим для более поздних версий):
cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
CompilerInstance.cpp:CompilerInstance::ExecuteAction
ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
CodeGenAction.cpp:HandleTranslationUnit
Последняя функция обрабатывает весь модуль перевода (на этом этапе уже обрабатываются decls верхнего уровня) и вызывает EmitBackendOutput
для выполнения внутренних операций. Так что эта функция является хорошим местом, где вы можете что-то сделать с полным AST и до выдачи выходных данных бэкэнда.
С точки зрения того, как манипулировать AST, у clang есть несколько основных руководств по этому вопросу: http://clang.llvm.org/docs/RAVFrontendAction.html.
Также посмотрите на ASTDumper.cpp
. Это лучший пример посещения АСТ.
Еще один хороший учебник: https://jonasdevlieghere.com/understanding-the-clang-ast/ научит вас, как найти конкретный оператор вызова в AST с помощью трех различных подходов.