我想将C#编译为LLVM IL。所以我认为将已编译的CIL翻译成LLVM IL是我可以尝试的一种方式。
我可以使用一些工具,例如vmkit和mono-llvm。
有人使用这个工具吗?或者我如何将CIL翻译成LLVM?
答案 0 :(得分:5)
要从CIL获取LLVM IR代码,您需要使用工具il2bc(其他名称C#Native),您可以从http://csnative.codeplex.com/下载该工具。
您只需执行一些简单的步骤即可。
Il2Bc.exe <Your DLL>.dll
如果要从中生成可执行文件,则需要编译生成的.ll文件(LLVM IR代码)。
例如,您有“Hello World”应用程序
编译它(它会生成一个helloworld.ll文件)
Il2Bc.exe helloworld.cs /corelib:CoreLib.dll
为核心库生成LLVM IR文件(它将生成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 .
答案 1 :(得分:4)
答案取决于你的目标。为什么要将C#转换为LLVM?
VMKit被设计为构建虚拟机实现的框架。我相信它在某一点上对CLR有一些支持,但这种支持因为停滞不前而支持其JVM实现。其目的是从头开始构建VM。
Mono-llvm是一个用LLVM后端替换单声道JIT后端的项目。它的目标是在Mono上提高JITed代码的性能。
如果你的目标是使用Mono,性能更好,mono-llvm是一个不错的选择。
如果您想从头开始构建整个VM,那么VMKit可能会起作用。
如果您只是想实现一个生成可执行文件而没有CLR依赖关系的提前编译器,您可以从以下位置下载LLVM核心库:
基本上它会将CIL转换为LLVM IR的文本表示,然后使用LLVM API将其编译为本机机器代码。
我不知道LLVM是否会为您生成目标文件。你可能必须自己生成它们,但这很容易。它基本上只是将机器代码填充到数据结构中,构建字符串,节和符号表,然后将所有内容序列化到磁盘。
答案 2 :(得分:4)
我想我理解你想要使用LLVM IR的方式与GCC使用gcj编译Java的方式相同吗?
LLVM可以直接从你使用的任何前端输出CIL(理论上你可以做C / C ++到CIL)。以下命令选项:
llc -march=msil
将从(理论上)任何受支持的LLVM前端输出CIL。
从C#或CIL转到LLVM IR尚未完成(或至少已完成)。你需要一个C#前端。
VMKit有一些C#前端脚手架。支持从来没有功能完整,兴趣已经消退。他们已经转向支持Java。您可以尝试使用他们的源存储库,看看是否有任何早期C#工作的残余可以重新编写成一个完整的C#前端。
另请注意,您可以在C#中编写自己的 C#到LLVM IR 编译器(使用Mono或其他)并使用P/Invoke调用LLVM库并创建LLVM IR。有一些很好的信息,例如 Writing Your Own Toy Compiler Using Flex, Bison and LLVM 。
这个领域也变得很有趣,因为编译器作为服务(Roslyn)项目已经有了它的第一个CTP版本,而Mono有它的Mono.CSharp项目。虽然我认为罗斯林的功能更丰富。