在 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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top