我不明白LLVM JIT如何与正常的无JIT编译相关,文档也不好.
例如,假设我使用clang
前端:
这两者有什么区别,是否正确?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)
我正在采取步骤从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)
来源获得