Ограничения LLVM IR

Я хочу сгенерировать код LLVM-IR из кода C, и мне было интересно, насколько хороша генерация IR для функций в:

stdio.h, string.h, stdlib.h и, как правило, стандартные функции на основе памяти, такие как malloc, calloc, поскольку мне не удалось найти большинство общих функций в:

http://llvm.org/docs/LangRef.html и интересовался ограничениями этого представление и может ли мне потребоваться добавить мои собственные встроенные функции только для работы со стандартными / наиболее популярными функциями c.

Я хочу изменить код во время выполнения, поэтому мне было интересно, какой подход даст мне наибольшую гибкость, например: вместо этого манипулируйте кодом на уровне AST.

Спасибо


person user1479589    schedule 05.11.2013    source источник
comment
Я написал компилятор для C-подобного языка и нацелился на язык ассемблера LLVM, на который вы ссылаетесь. Понадобилось немного привыкнуть и были некоторые нюансы, но выбором я остался доволен. Вы можете скомпилировать stdlib с помощью clang, а затем связать его со своим кодом. Я счел полезным скомпилировать C с clang на сборку llvm, а затем посмотреть на нее, чтобы получить информацию о том, как это делается в сборке llvm. Но манипулирование кодом во время выполнения, JIT-компиляция - это совсем другая история.   -  person Charlie Burns    schedule 06.11.2013
comment
Привет, я на самом деле думаю о манипулировании LLVM-IR с помощью LLVM Mutate для представления небольших изменений кода, которые я хочу сделать, например: изменение параметров на стандартные библиотечные функции и т. Д.   -  person user1479589    schedule 06.11.2013
comment
возможный дубликат Как сделать компиляцию clang в llvm IR   -  person Flow    schedule 05.03.2015


Ответы (1)


Генерация LLVM IR из C - это именно то, что делает промышленный компилятор Clang. Я предлагаю запустить Clang на небольших фрагментах кода C с -emit-llvm (подробности в этом документе: http://clang.llvm.org/get_started.html) и наблюдая за полученным IR.

Вы даже можете сделать это в своем браузере: http://ellcc.org/demo/index.cgi

Это позволит вам увидеть, как обрабатываются встроенные функции, такие как memcpy, и любые другие подобные сомнения.

Обратите внимание, что ни LLVM, ни Clang не имеют полной библиотеки C, но их можно использовать для компиляции существующей. newlib - популярная переносимая библиотека C, разработанная специально для создания на различных новых платформах. PNaCl, например, использует его для встраивания кода C / C ++ в переносимые исполняемые файлы - он компилирует новую библиотеку с кодом пользователя вместе в один модуль LLVM IR.

person Eli Bendersky    schedule 05.11.2013
comment
Привет, спасибо за ответ. Кроме того, известно ли вам о каких-либо API более высокого уровня для взаимодействия с LLVM IR? Я знаю LLVM C ++ Api .. и другие привязки для него, например: llvmpy и несколько java-оболочек для .. - person user1479589; 06.11.2013
comment
@ user1479589: LLVM C ++ API довольно высокоуровневый. Как вы упомянули, llvmpy (используйте последний проект - github.com/llvmpy/llvmpy ) может быть полезно. Какие более высокие уровни, чем эти, вам нужны, то есть для каких конкретных потребностей они вам нужны? - person Eli Bendersky; 06.11.2013