使用 LLVM 编写 JIT 时,如何重用 C 操作码实现?
-
21-08-2019 - |
题
在 llvm 教程和示例中,编译器通过如下调用输出 LLVM IR
return Builder.CreateAdd(L, R, "addtmp");
但很多解释器是这样写的:
switch (opcode) {
case ADD:
result = L + R;
break;
...
如何提取每个代码片段以使用 LLVM 生成 JIT,而无需在 LLVM IR 中重新实现每个操作码?
解决方案
好的,首先将所有代码片段重构为自己的函数。所以你的代码将转到:
void addOpcode(uint32_t *result, uint32_t L, uint32_t R) {
*result = L + R;
}
switch (opcode) {
case ADD:
addOpcode(&result, L, R);
break;
....
好的,完成此操作后,您的解释器应该仍然可以运行。现在获取所有新函数并将它们放入自己的文件中。现在使用 llvm-gcc 或 clang 编译该文件,而不是生成本机代码,而是使用 “cpp”后端 (-三月-cpp)。这将生成实例化编译单元字节码的 C++ 代码。您可以指定选项以将其限制为特定功能等。您可能想使用“-cppgen module”。
现在,返回解释器循环,将对生成的 C++ 代码的调用粘合在一起,而不是直接执行原始代码,然后将其传递给一些优化器和本机代码生成器。Gratz 对 JIT 的看法;-) 您可以在几个 LLVM 项目中看到这样的示例,例如中的 vm_ops llvm-lua.
不隶属于 StackOverflow