Clang libtooling: как распечатать определения макросов компилятора

У меня есть утилита на основе LibTooling, и я хотел бы вывести список определений макросов для целей отладки. Можно распечатать определения макросов компилятора с помощью clang/gcc -dM -E -, но, похоже, это не сработает, если я передам -dM -E или -dD в ClangTool. Можно ли каким-либо образом сделать это с помощью LibTooling API или параметров CLI? Неважно, будут ли они включать макросы, определенные в проанализированном исходном коде, или нет.

Я просмотрел другие подобные вопросы, и, насколько я могу судить, все они касаются макросов, развернутых в проанализированном исходном коде. Это не совсем то, что мне нужно.


person Victor K    schedule 11.04.2020    source источник


Ответы (1)


Ответ ослепляюще очевиден — если оглянуться назад. clang::Preprocessor::getPredefines() возвращает именно это — список предопределений компилятора. Объект препроцессора можно получить, например. из clang::CompilerInstance, как аргумент в clang::DiagnosticConsumer::BeginSourceFile() и т.д.

Просто для полноты эта функциональность недоступна через API libclang, но я мог бы сделать это, используя тот факт, что все предопределения присутствуют в начале единицы перевода. Итак, после синтаксического анализа я просто перечислил все курсоры верхнего уровня CursorKind.MACRO_DEFINITION, которые не находятся в каком-либо реальном месте (location.file is None с использованием нотации привязок Python)

person Victor K    schedule 07.05.2020