我不明白LLVM JIT和普通的无JIT编译有什么关系,而且文档也不好。
例如,假设我使用clang
前端:
这两者之间的区别是什么?它们是正确的吗?LLVM流程是否包括对JIT和非JIT的支持?我什么时候想要使用JIT --对于像C这样的语言来说,它有意义吗?
发布于 2010-08-18 13:41:37
您必须了解LLVM是一个帮助您构建编译器的库。Clang仅仅是这个库的前端。
Clang将C/C++代码翻译成LLVM IR,并将其交给LLVM,LLVM将其编译成本机代码。
LLVM还能够直接在内存中生成本机代码,然后可以将其作为普通函数进行调用。因此,情况1.和2.共享LLVM优化和代码生成。
那么如何使用LLVM作为JIT编译器呢?您构建了一个应用程序来生成一些LLVM IR (在内存中),然后使用LLVM库来生成本机代码(仍然在内存中)。LLVM返回一个指针,您可以在以后调用该指针。不会有声响。
但是,您可以使用clang将一些C代码转换为LLVM IR,并将其加载到JIT上下文中以使用这些函数。
真实世界的例子:
Ruby VM
还有Kaleidoscope教程,它展示了如何使用JIT编译器实现一种简单的语言。
发布于 2010-09-19 08:50:12
首先,你得到LLVM字节码(LLVM IR):
clang -emit-llvm -S -o test.bc test.c
其次,使用LLVM JIT:
lli test.bc
来运行程序。
然后,如果你想获得原生版本,你可以使用LLVM后端:
llc test.bc
从程序集输出中:
as test.S
发布于 2013-08-03 00:36:52
我正在采取步骤从LLVM社区的邮件消息中编译和运行JIT代码。
[LLVMdev] MCJIT and Kaleidoscope Tutorial
头文件:
// foo.h
extern void foo(void);
和一个简单foo()函数的函数:
//foo.c
#include <stdio.h>
void foo(void) {
puts("Hello, I'm a shared library");
}
其主要功能是:
//main.c
#include <stdio.h>
#include "foo.h"
int main(void) {
puts("This is a shared library test...");
foo();
return 0;
}
使用foo.c构建共享库:
gcc foo.c -shared -o libfoo.so -fPIC
为main.c文件生成LLVM位码:
clang -Wall -c -emit-llvm -O3 main.c -o main.bc
并通过jit (和MCJIT)运行LLVM位码以获得所需的输出:
lli -load=./libfoo.so main.bc
lli -use-mcjit -load=./libfoo.so main.bc
您还可以将clang输出通过管道传输到lli:
clang -Wall -c -emit-llvm -O3 main.c -o - | lli -load=./libfoo.so
输出
This is a shared library test...
Hello, I'm a shared library
来源:
https://stackoverflow.com/questions/3509215
复制相似问题