LLVM jit和native

zah*_*pov 18 jit llvm clang

我不明白LLVM JIT如何与正常的无JIT编译相关,文档也不好.

例如,假设我使用clang前端:

  1. 案例1:我使用clang/llvm将C文件编译为native.我理解的这个流程就像gcc流程 - 我得到了我的x86可执行文件并运行.
  2. 案例2:我编译成在LLVM JIT上运行的某种LLVM IR.在这种情况下,可执行文件包含LLVM运行时以在JIT上执行IR,或者它是如何工作的?

这两者有什么区别,是否正确?LLVM流程是否包括对JIT和非JIT的支持?我什么时候想使用JIT - 对于像C这样的语言来说它有意义吗?

ebo*_*ebo 31

您必须了解LLVM是一个可以帮助您构建编译器的库.Clang只是这个图书馆的前端.

Clang将C/C++代码转换为LLVM IR并将其交给LLVM,后者将其编译为本机代码.

LLVM还能够直接在内存中生成本机代码,然后可以将其称为普通函数.所以情况1.和2.共享LLVM的优化和代码生成.

那么如何使用LLVM作为JIT编译器呢?您构建一个生成一些LLVM IR(在内存中)的应用程序,然后使用LLVM库生成本机代码(仍在内存中).LLVM会向您发送指针,然后您可以调用它.没有铿锵声.

但是,您可以使用clang将一些C代码转换为LLVM IR,并将其加载到JIT上下文中以使用这些函数.

真实世界的例子:

还有Kaleidoscope教程,它展示了如何使用JIT编译器实现一个简单的语言.


Ari*_*iel 27

First, you get LLVM bytecode (LLVM IR):

clang -emit-llvm -S -o test.bc test.c 
Run Code Online (Sandbox Code Playgroud)

Second, you use LLVM JIT:

lli test.bc
Run Code Online (Sandbox Code Playgroud)

That runs the program.

Then, if you wish to get native, you use LLVM backend:

llc test.bc
Run Code Online (Sandbox Code Playgroud)

From the assembly output:

as test.S
Run Code Online (Sandbox Code Playgroud)


Sri*_*ali 7

我正在采取步骤从LLVM社区中的邮件消息编译和运行JIT代码.

[LLVMdev] MCJIT和Kaleidoscope教程

头文件:

// foo.h
extern void foo(void);
Run Code Online (Sandbox Code Playgroud)

和一个简单的foo()函数的函数:

//foo.c
#include <stdio.h>
void foo(void) {
    puts("Hello, I'm a shared library");
}
Run Code Online (Sandbox Code Playgroud)

主要功能:

//main.c
#include <stdio.h>
#include "foo.h"
int main(void) {
    puts("This is a shared library test...");
    foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用foo.c构建共享库:

gcc foo.c -shared -o libfoo.so -fPIC
Run Code Online (Sandbox Code Playgroud)

为main.c文件生成LLVM bitcode:

clang -Wall -c -emit-llvm -O3 main.c -o main.bc
Run Code Online (Sandbox Code Playgroud)

并通过jit(和MCJIT)运行LLVM bitcode以获得所需的输出:

lli -load=./libfoo.so main.bc
lli -use-mcjit -load=./libfoo.so main.bc
Run Code Online (Sandbox Code Playgroud)

你也可以把clang输出管道输入lli:

clang -Wall -c -emit-llvm -O3 main.c -o - | lli -load=./libfoo.so 
Run Code Online (Sandbox Code Playgroud)

产量

This is a shared library test...
Hello, I'm a shared library
Run Code Online (Sandbox Code Playgroud)

来源获得

在Linux上使用GCC共享库