如何将CIL转换为LLVM IL?

use*_*939 6 cil compilation llvm

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

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

有人使用这个工具吗?或者我怎样才能将CIL翻译成LLVM?

小智 5

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

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

Il2Bc.exe <Your DLL>.dll
Run Code Online (Sandbox Code Playgroud)

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

例如,您有"Hello World"应用程序

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

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

    Il2Bc.exe CoreLib.dll
    
    Run Code Online (Sandbox Code Playgroud)
  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 .
    
    Run Code Online (Sandbox Code Playgroud)


Sco*_*ski 4

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

VMKit 被设计为构建虚拟机实现的框架。我相信它曾经对 CLR 提供过一些支持,但这种支持后来停滞不前,转而支持其 JVM 实现。其目的是从头开始构建虚拟机。

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

如果你的目标是使用 Mono,具有更好的性能,mono-llvm 是一个不错的选择。

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

如果您只是想实现一个提前编译器来生成不依赖于 CLR 的可执行文件,则可以从以下位置下载 LLVM 核心库:

http://llvm.org/

基本上,它将 CIL 转换为 LLVM IR 的文本表示,然后使用 LLVM API 将其编译为本机机器代码。

我不知道LLVM是否会为你生成目标文件。您可能必须自己生成它们,但这非常简单。它基本上只是将机器代码填充到数据结构中,构建字符串、节和符号表,然后将所有内容序列化到磁盘。