Как мне перевести CIL на IL LLVM? - PullRequest
6 голосов
/ 20 февраля 2011

Я хочу скомпилировать C # в LLVM IL.Поэтому я думаю, что я могу попробовать перевести скомпилированный CIL в LLVM IL.

Есть некоторые инструменты, которые я могу использовать, такие как vmkit и mono-llvm.

Кто-нибудь использует эти инструменты?Или как я могу перевести CIL в LLVM?

Ответы [ 3 ]

5 голосов
/ 30 декабря 2014

Для получения ИК-кода LLVM из CIL вам необходимо использовать инструмент il2bc (другое название C # Native), который вы можете загрузить с http://csnative.codeplex.com/.

Вам просто нужно выполнить несколько простых шагов.

Il2Bc.exe <Your DLL>.dll

Если вы хотите сгенерировать исполняемый файл из него, вам необходимо скомпилировать сгенерированный файл .ll (код IR LLVM).

Например, у вас есть приложение "Hello World"

* * 1010

Скомпилируйте его (он создаст файл helloworld.ll)

Il2Bc.exe helloworld.cs /corelib:CoreLib.dll

Создать файл IR LLVM для базовой библиотеки (будет создан файл corelib.ll)

Il2Bc.exe CoreLib.dll

Вам необходимо сгенерировать файл EXE (он сгенерирует файл .EXE):

llc -filetype=obj -mtriple=i686-w64-mingw32 CoreLib.ll
llc -filetype=obj -mtriple=i686-w64-mingw32 helloworld.ll
g++ -o helloworld.exe helloworld.obj CoreLib.obj -lstdc++ -lgc-lib -march=i686 -L .
4 голосов
/ 25 ноября 2011

Мне кажется, я понимаю, что вопрос заключается в том, что вы хотите использовать LLVM IR так же, как GCC может компилировать Java с использованием gcj?

У LLVM была возможность выводить CIL напрямую из любого внешнего интерфейса, который вы использовали (поэтому теоретически вы можете сделать C / C ++ для CIL). Следующие опции команды:

llc -march=msil

будет выводить CIL (теоретически) из любого поддерживаемого интерфейса LLVM.

Переход от C # или CIL к LLVM IR еще не завершен (или, по крайней мере, не завершен). Вам потребуется интерфейс C #.

VMKit имел какие-то строительные леса на C #. Поддержка никогда не была полной и интерес с тех пор исчез. Они перешли только на поддержку Java. Вы можете попробовать их исходный репозиторий и посмотреть, есть ли какие-либо остатки их ранней работы на C #, которые могут быть переработаны в полноценный интерфейс C #.

Также обратите внимание, что вы можете написать свой собственный C # для LLVM IR компилятор в C # (используя Mono или любой другой) и использовать P / Invoke для вызова в LLVM библиотеки и создание LLVM IR. Есть некоторая полезная информация, такая как Создание собственного игрушечного компилятора с использованием Flex, Bison и LLVM .

Эта область также становится интересной теперь, когда проект компилятор как сервис ( Roslyn ) выпустил свою первую пару CTP-релизов, а Mono - проект Mono.CSharp. Хотя я думаю, что Roslyn немного более многофункциональный.

4 голосов
/ 20 февраля 2011

Ответ зависит от ваших целей.Почему вы хотите перевести C # в LLVM?

VMKit был разработан как среда для построения реализаций виртуальных машин.Я полагаю, что в какой-то момент у него была некоторая поддержка для CLR, но эта поддержка с тех пор застаивалась в пользу его реализации JVM.Его целью является создание виртуальной машины с нуля.

Mono-llvm - это проект, который заменяет моно JIT-бэкэнд на LLVM-бэкэнд.Его цель - повысить производительность кода JITed на Mono.

Если ваша цель - использовать Mono с более высокой производительностью, хорошим выбором будет mono-llvm.

Если вы хотите собратьцелая виртуальная машина с нуля, тогда VMKit может работать.

Если вы просто хотите реализовать опережающий компилятор, который создает исполняемые файлы без зависимостей CLR, вы можете просто загрузить библиотеки ядра LLVM из:

http://llvm.org/

По сути, он преобразует CIL в текстовое представление LLVM IR, а затем использует API-интерфейсы LLVM для компиляции его в машинный код.

Я не знаюНе знаю, сгенерирует ли LLVM объектные файлы для вас.Возможно, вам придется создавать их самостоятельно, но это довольно просто.По сути, это просто вставка машинного кода в структуру данных, создание таблиц строк, разделов и символов, а затем сериализация всего на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...