Compilation 如何将CIL转换为LLVM IR?

Compilation 如何将CIL转换为LLVM IR?,compilation,llvm,cil,Compilation,Llvm,Cil,我想把C#编译成LLVM-IR。所以我认为将编译后的CIL转换为LLVM IR是我可以尝试的一种方法 我可以使用一些工具,比如vmkit和mono-llvm 有人在用这个工具吗?或者如何将CIL转换为LLVM?答案取决于您的目标。为什么要将C#翻译成LLVM VMKit被设计为构建虚拟机实现的框架。我相信它在某一点上对CLR有一些支持,但由于支持它的JVM实现而停滞不前。它的目的是从头开始构建VM Mono llvm是一个用llvm后端替换Mono JIT后端的项目。它的目标是提高Mono上JI

我想把C#编译成LLVM-IR。所以我认为将编译后的CIL转换为LLVM IR是我可以尝试的一种方法

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


有人在用这个工具吗?或者如何将CIL转换为LLVM?

答案取决于您的目标。为什么要将C#翻译成LLVM

VMKit被设计为构建虚拟机实现的框架。我相信它在某一点上对CLR有一些支持,但由于支持它的JVM实现而停滞不前。它的目的是从头开始构建VM

Mono llvm是一个用llvm后端替换Mono JIT后端的项目。它的目标是提高Mono上JIT代码的性能

如果您的目标是使用性能更好的Mono,Mono llvm是一个不错的选择

如果您想从头开始构建整个VM,那么VMKit可能会起作用

如果您只是想实现一个能够生成无CLR依赖项的可执行文件的超前编译器,您可以从以下位置下载LLVM核心库:

基本上,它将CIL转换为LLVMIR的文本表示,然后使用LLVMAPI将其编译为本机代码


我不知道LLVM是否会为您生成对象文件。您可能需要自己生成它们,但这很容易。它基本上只是将机器代码填充到数据结构中,建立字符串、节和符号表,然后将所有内容序列化到磁盘。

我想我理解的问题是,您希望使用LLVM IR,就像GCC可以使用gcj编译Java一样

LLVM有一个选项可以直接从您使用的任何前端输出CIL(因此理论上您可以对CIL执行C/C++操作)。以下命令选项:

llc -march=msil
将从(理论上)任何受支持的LLVM前端输出CIL

从C#或CIL到LLVM IR尚未完成(或至少完成)。你需要一个C#前端

有一些C#前端脚手架。支持从未完成,兴趣也随之消退。他们已经转向只支持Java。你可以试试他们的源代码库,看看他们早期的C#工作是否有任何残余,是否可以被改写成完整的C#前端

还要注意的是,您可以在C#中编写自己的C#to LLVM IR编译器(使用或其他方式),并使用来调用LLVM库并创建LLVM IR。有一些很好的信息,比如


现在,编译器即服务()项目已经有了最初的几个CTP版本,Mono也有了Mono.CSharp项目,这一领域也变得有趣起来。尽管我认为Roslyn的功能更加丰富。

要从CIL获取LLVM IR代码,您需要使用工具il2bc(另一个名字是C#Native),您可以从下载

您只需要执行一些简单的步骤

Il2Bc.exe <Your DLL>.dll
  • 为核心库生成LLVM IR文件(它将生成corelib.ll文件)

  • 您需要生成一个EXE文件(它将生成一个.EXE文件):


  • 本机代码如何处理垃圾收集步骤?
    Il2Bc.exe helloworld.cs /corelib:CoreLib.dll
    
    Il2Bc.exe CoreLib.dll
    
    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 .