用后端

时间:2016-11-17 20:56:30

标签: llvm-clang llvm-ir

考虑一个具有大型只读内存区域(称为"高内存")的架构(即Infocom Z-machine),它仅用于存储字符串(和机器代码,但不是&# 39;提出问题)。只能通过显示文本的某些指令访问此区域。当然,这意味着指向高内存的指针无法解除引用。

我想为这个架构编写一个LLVM后端。为了做到这一点,我需要一种方法来告诉后端将某些字符串存储在高内存中,并获得"打包地址"所述字符串(也用于将字符串转换为Z-Machine字符串编码,但这不是重点)。

理想情况下,我能够定义类似C函数的宏HIGHMEM_STRING,它将采用字符串文字并扩展为整数常量。假设有一个函数void print_paddr(uint16_t paddr),我希望能够做到:

print_paddr(HIGHMEM_STRING("It is pitch black. You are likely to be eaten by a grue."));

然后后端会知道将字符串放在高内存中并将其打包地址作为参数传递给print_paddr

我的问题有三个部分:

  1. 我可以使用LLVM内在函数实现这样的宏,还是使用带有后端特殊指令的asm块,或者其他类似方式而不必分叉Clang?否则,我必须在Clang中改变什么?
  2. 如何注释LLVM IR以向后端传达一个字符串应该放在高内存中并替换为其打包地址?
  3. 如果HIGHMEM_STRING太难或不可能实现为宏,有哪些替代方案?

1 个答案:

答案 0 :(得分:0)

Hexagon后端通过将信息存储在GP寄存器中加载基址的特殊部分并且引用指令在该部分内有偏移量来执行类似的操作。寻找CONST64以了解如何处理这些。

基本上,当我们在LLVM IR中识别数据时,我们想要放入这个特殊部分,我们用数据创建一个伪指令。当我们写出ELF文件时,我们将部分切换到GP-rel部分,发出数据,然后切换回文本部分并发出指令以取消引用该符号。

如果您可以根据内容识别这些字符串而不是让用户在程序文本中指定它们,则可能会更容易。