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

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

23 голосов
/ 27 февраля 2011

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

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

Ответы [ 4 ]

14 голосов
/ 28 февраля 2011

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

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

9 голосов
/ 22 сентября 2011

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

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

Тем не менее, обратите внимание, что стабильность API достигается ценой полноты. Вы не сможете делать все с этим API, но его гораздо проще использовать.

1 голос
/ 03 марта 2011

Я считаю этот ASTUnit :: LoadFromCompilerInvocation () fn как самый простой способ создания AST.

Эта ссылка может дать вам некоторые идеи http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471

0 голосов
/ 03 января 2018

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

...