Kol*_*oDS 5 compiler-construction compilation llvm
当我尝试构建 LLVM 后端而不RegisterClass在 TableGen 文件中定义实例时,它会引发以下错误:
error:No 'RegisterClass' subclasses defined
Run Code Online (Sandbox Code Playgroud)
如何为 LLVM 定义堆栈机器目标(即不使用寄存器)?
只是不要这样做。LLVM DAG是专门为寄存器机设计的,对于堆栈机编译来说价值不大。您需要一个自定义后端。
我用于解决类似问题的一种方法(LLVM IR -> FPGA 上的堆栈软核)如下:
1) 出于 SSA (reg2mem)
2) 构建中间树表示(即,如果顺序允许,将所有一次性寄存器分配压缩到树中)。这是主要的优化瓶颈,留下的寄存器分配越少越好。
3) 其余寄存器的“寄存器分配”现在全部表示为堆栈分配变量(希望您的堆栈机 ISA 允许)。
4) 直接转换树,无需任何指令选择(您可以在 LLVM IR 级别上执行此操作,而不是使用内在函数和自定义 instcombine 传递)。
编辑:使用基于 DAG 的后端来做到这一点并不容易,它从来就不是为了以这种方式使用的。
我能想到的最接近的事情是使用 DAG 后端生成中间寄存器机器代码,然后使用后处理通道在可能的情况下重新排序指令,否则注入堆栈分配的变量访问。即,将每个堆栈机器指令表示为具有 1 或 2 个寄存器参数和 1 个寄存器结果的伪指令。