Своевременная компиляция с использованием libclang и LLVM C

У меня есть программное обеспечение, способное генерировать код C, который я хотел бы использовать в контексте компиляции точно в срок. Насколько я понимаю, LLVM/Clang — это то, что нужно, и для удобства сопровождения проекта я хотел бы использовать C API llvm и Clang (libclang).

Я начал с создания контекста libclang, используя clang_createIndex, и единицу перевода, используя createTranslationUnitFromSourceFile (было бы неплохо иметь возможность не проходить через файловую систему и вместо этого передавать исходный код в виде строки). Но я там сильно застреваю. Как я могу перейти от модуля перевода libclang к «механизму выполнения» LLVM, который, по-видимому, необходим для JIT? Или это даже невозможно с помощью C API?


person Joel    schedule 27.08.2015    source источник


Ответы (1)


Лучший способ узнать, как использовать код, — изучить примеры, которые вам дали.

Существуют руководства о том, как использовать инструменты clang/llvm для компиляции кода C++ и создания LLVM-IR, для компиляции LLVM-IR в LLVM-Bitcode и выполнения этого LLVM-bitcode. Все, что необходимо, чтобы научиться включать эту функциональность в наше приложение, — это исследовать путь выполнения этих инструментов, чтобы найти последовательность методов, которые выполняют то, что мы хотим.

Вот пример использования примеров инструментов для компиляции файла cpp в llvm-bitcode и его выполнения.

clang++ -c -O3 -emit-llvm main.cpp -o main.bc
lli main.bc

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

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

person SteamyThePunk    schedule 01.09.2016
comment
Тогда это будет НЕТ. Поскольку использование внутреннего интерфейса в таком динамичном проекте, как clang/llvm, очень недальновидно. - person user3710044; 01.09.2017
comment
Он не использует внутренний интерфейс. Инструменты являются примерами того, как использовать библиотеки, и в общедоступных интерфейсах проектов llvm и clang доступно несколько уровней абстракции. Однако вы правы в том, что если API не установлен в камне, вы должны быть осторожны при использовании его в своем коде напрямую, вам следует создавать абстракции вдали от динамических API, так что, если он изменится, вам нужно будет только переписать свою абстракцию. - person SteamyThePunk; 09.02.2018
comment
Просто подумал, что добавлю немного больше к этому древнему ответу. На самом деле на сайте LLVM есть учебник по JIT-компиляции. llvm.org/docs/tutorial/BuildingAJIT1.html Посмотрите, у вас нет НРАВИТСЯ ответ, но вы должны принять их, когда они являются правильным ответом или, в данном случае... ЕДИНСТВЕННЫМ ответом. - person SteamyThePunk; 04.07.2020