Использование libclang в качестве компилятора

#llvm #clang

#llvm #лязг

Вопрос:

Я работаю над инструментом, который генерирует C-код из спецификации. Таким образом, пользователям необходимо самостоятельно скомпилировать сгенерированный код, прежде чем использовать скомпилированный код с помощью другого инструмента. Я хотел бы автоматизировать этот утомительный процесс. Интересно, возможно ли с помощью libclang напрямую внедрить компилятор вместо вызова процесса?

Комментарии:

1.ознакомьтесь с этим сообщением в блоге, также вы можете использовать cc1_main here и передать аргументы для достижения этой цели. Оба подхода не используют libclang, хотя

2. Удалось ли вам решить эту проблему? Если да, не могли бы вы поделиться своим решением, пожалуйста?

3. @0dminnimda Если я правильно помню, мы остановились на вызове gcc / clang в подпроцессе.

Ответ №1:

Да, это возможно для некоторых версий clang / llvm. Вы можете начать с http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/cc1_main.cpp?revision=126577amp;view=markup = это сам источник clang двоичного файла. Он вызывает библиотеку libclang, и вы можете интегрировать этот код в свое приложение. (На самом деле, он использует нестабильные интерфейсы C из внутренних библиотек clang и llvm, а не стабильный C API libclang.)

Если вы сохраните все исходные тексты C в файле, это все, что вам нужно. Но если вы хотите передавать исходные тексты напрямую через память, вам следует написать пользовательский SourceManager и установить с помощью setSourceManager() метода CompilerInvocation Clang .

Комментарии:

1. Я не уверен, что clang полностью запущен с cc1_main.cpp файл (связанный с), поэтому также проверьте driver.cpp файл в том же каталоге.

2. @osgx Какие функции нужно вызывать конкретно? Я пытаюсь сделать это, и почти ни одна из строк не работает из-за отсутствия этого и того. Каков минимальный уровень, который потребуется для указания файла .c и получения машинного кода?

3. @SevenBits, используй текущую версию этого файла. Вы также можете задать новый вопрос

4. Обратите внимание, что на самом деле это не так libclang , libclang это интерфейс C, это интерфейс C , который не является стабильным.

5. кралик, спасибо за комментарий. Можете ли вы добавить свой собственный ответ на вопрос (как использовать libclang для встраивания clang llvm в качестве компилятора c / c )? был создан libclang ( llvm.org/devmtg/2010-11/Gregor-libclang.pdf ) в качестве интерфейса для синтаксического анализа / индексации / внешних ссылок / выделения / завершения в 2010 году. Был ли он расширен до библиотеки для встраивания в компилятор?