Подтвердить что ты не робот

Как использовать Clang AST?

Я рассматриваю использование Clang AST для своего кода на C и делаю некоторый анализ по AST. Некоторые указатели на то, с чего начать, как получить Clang AST, учебники или что-нибудь в этом отношении, будут очень полезны!!!

Я пытался найти некоторые, и я получил ссылку которая была создана 2 года назад. Но почему-то это не работает для меня. Пример кода в учебнике дает мне слишком много ошибок. Поэтому я не уверен, если я правильно построю код или что-то не так с учебником. Но я был бы рад начать с другой страницы.

4b9b3361

Ответ 1

Начните с учебника, связанного с sharth. Затем пройдите через Кланг Доксиген. Начните с SemaConsumer.

Прочитайте много исходного кода. Кланг - движущаяся цель. Если вы пишете инструменты на основе clang, то вам нужно признать, что clang ежедневно добавляет и фиксирует функции, поэтому вы должны быть готовы прочитать много кода!

Ответ 2

Вероятно, вам нужен стабильный C API, предоставляемый в библиотеке libclang, в отличие от нестабильных внутренних API С++, о которых говорили другие.

Лучшей документацией для начала является видео/слайды разговора "libclang: Thinking Beyond the Compiler", доступный на веб-сайте LLVM Developers Meeting.

Однако обратите внимание, что стабильность API идет за счет комплексности. Вы не сможете делать все с помощью этого API, но его гораздо проще использовать.

Ответ 5

Чтобы получить 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 и перед выпуском выходного файла.

В терминах того, как манипулировать АСТ, у clang есть несколько базовых руководств по этому вопросу: http://clang.llvm.org/docs/RAVFrontendAction.html.

Также смотрите ASTDumper.cpp. Это лучший пример посещения АСТ.

Еще один хороший учебник: https://jonasdevlieghere.com/understanding-the-clang-ast/ рассказывает о том, как найти конкретный вызов expr в AST через три разных подхода.