如何将CIL转换为LLVM IL?

时间:2011-02-20 02:51:52

标签: compilation llvm cil

我想将C#编译为LLVM IL。所以我认为将已编译的CIL翻译成LLVM IL是我可以尝试的一种方式。

我可以使用一些工具,例如vmkit和mono-llvm。

有人使用这个工具吗?或者我如何将CIL翻译成LLVM?

3 个答案:

答案 0 :(得分:5)

要从CIL获取LLVM IR代码,您需要使用工具il2bc(其他名称C#Native),您可以从http://csnative.codeplex.com/下载该工具。

您只需执行一些简单的步骤即可。

Il2Bc.exe <Your DLL>.dll

如果要从中生成可执行文件,则需要编译生成的.ll文件(LLVM IR代码)。

例如,您有“Hello World”应用程序

  1. 编译它(它会生成一个helloworld.ll文件)

    Il2Bc.exe helloworld.cs /corelib:CoreLib.dll
    
  2. 为核心库生成LLVM IR文件(它将生成corelib.ll文件)

    Il2Bc.exe CoreLib.dll
    
  3. 您需要生成一个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核心库:

http://llvm.org/

基本上它会将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项目。虽然我认为罗斯林的功能更丰富。