2009-02-02 63 views
7

在LLVM教程和示例,编译器输出LLVM IR通过拨打电话这样如何在使用LLVM编写JIT时重新使用C操作码实现?

return Builder.CreateAdd(L, R, "addtmp"); 

但很多解释都这样写的:

switch (opcode) { 
    case ADD: 
      result = L + R; 
      break; 
    ... 

你会如何提取这些代码段使用LLVM创建JIT而不必重新实现LLVM IR中的每个操作码?

回答

9

好的,先把所有的代码片断重构成它们自己的函数。所以你的代码去:

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" backend(-march -cpp)编译它。这将生成实例化编译单元字节码的C++代码。您可以指定选项以将其限制为特定功能等。您可能需要使用“-cppgen模块”。

现在回到你的解释器循环粘连在一起调用生成的C++代码,而不是直接执行原始代码,然后将它传递给一些优化器和本地代码生成器。 Gratz的JIT ;-)你可以在几个LLVM项目中看到这个例子,比如llvm-lua中的vm_ops。

+0

太棒了!我认为这会是这样的,LLVM内嵌了所有的功能。 – joeforker 2009-02-03 14:53:19