Я интерпретирую ваш вопрос как «как мне реализовать библиотеку времени выполнения на C или C ++ для моего языка, который компилируется в LLVM?»
Один из подходов, как подробно описал Джонатан Танг, преобразует вывод вашего компилятора из LLVM IR в битовый код в сборку, и ванильный gcc
связывает сборку с источником времени выполнения (или объектными файлами).
Альтернативный, возможно, более гибкий подход состоит в том, чтобы использовать llvm-gcc
для компиляции самой среды выполнения в битовый код LLVM, а затем использовать llvm-ld
, чтобы связать битовый код вашего компилятора с битовым кодом вашей среды выполнения. Этот битовый код затем может быть повторно оптимизирован с помощью opt
, преобразован обратно в IR с помощью llvm-dis
, интерпретирован непосредственно с помощью lli
(это будет, на самом деле, работает, только если LLVM был построен против libffi
), или скомпилирован в сборку с llc
(а затем в собственный двоичный файл с ванилью gcc
).