2016-11-17 18 views
0

考虑具有大型只读内存区域(称为“高内存”)的体系结构(即Infocom Z-machine),该区域仅用于存储字符串(和机器代码,但这并不构成问题)。该区域只能通过显示文本的某些指令进行访问。当然,这意味着指向高内存的指针不能被取消引用。用由后端确定的不同值替换常量

我想为此架构编写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中更改哪些内容?
  2. 如何注释LLVM IR以向后端传达字符串应放置在高端内存中并替换为其打包地址?
  3. 如果HIGHMEM_STRING太难或不可能实现为宏,那么还有什么选择?

回答

0

Hexagon后端通过将信息存储在GP寄存器中加载了基地址的特殊段中,并且引用指令在该段内有一个偏移量来做类似的事情。查找CONST64以了解如何处理这些内容。

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

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