Индексы подразумевают много сравнений.
Как правило, строки длиннее, чем целые числа и правила сопоставления могут быть применены для сравнения, так сравнение представляет в виде строки, обычно более в вычислительном отношении интенсивная задача, чем сравнение целых чисел.
Иногда, тем не менее, это быстрее для использования строки в качестве первичного ключа, чем сделать дополнительное соединение с string to numerical id
таблица.
Вероятно, вам нужен стабильный C API, предоставляемый в библиотеке libclang, в отличие от нестабильных внутренних API C ++, о которых упоминали другие.
Лучшая документация для начала - видео / слайды выступления «libclang: Thinking Beyond the Compiler», доступного на веб-сайте LLVM Developers Meeting .
Тем не менее, обратите внимание, что стабильность API достигается ценой комплексности. Вы не сможете сделать все с этим API, но его гораздо проще использовать.
Я считаю этот ASTUnit :: LoadFromCompilerInvocation () fn наиболее простым способом построения AST.
Эта ссылка может дать вам некоторые идеи http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471
Чтобы получить 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
, чтобы сделать backend вещи. Так что эта функция является хорошим местом, где вы можете что-то сделать с полным AST и до выдачи выходных данных бэкэнда.
С точки зрения того, как манипулировать AST, у clang есть несколько основных руководств по этому вопросу: http://clang.llvm.org/docs/RAVFrontendAction.html .
Также посмотрите на ASTDumper.cpp
. Это лучший пример посещения АСТ.
Еще один хороший учебник: https://jonasdevlieghere.com/understanding-the-clang-ast/ научит вас, как найти конкретный оператор вызова в AST с помощью трех разных подходов.