#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 году. Был ли он расширен до библиотеки для встраивания в компилятор?