Valgrind使用中间代码表示来让我们检测二进制代码,这样我们就不必处理编程语言级别的构造。在将二进制代码转换为Valgrind的中间表示(IR)代码的过程中,它显示了寄存器用于添加等操作。其中有1024个正在使用。我没有得到的是另一种称为临时寄存器的寄存器,表示为tX
,其中X是某个数字。因此,我可以看到:
t28 = Add32(t26,0xFFFFFFFC:I32)
t4 = LDle:I32(t28)
t
表示临时注册。据我所知,它们似乎与常规寄存器非常相似,但我们无法弄清楚它们是如何不同的。有人能告诉我临时寄存器是什么以及它与常规寄存器的区别吗?
答案 0 :(得分:2)
在编译器构造类中,我被教导中间代码中的寄存器是虚拟寄存器。它们不一定与目标平台的可执行文件有任何关系。它们可以是真正的CPU寄存器,也可以是内存中的临时存储器。这一切都取决于代码生成器和优化器。代码生成器决定临时分配的位置。
生成IR的一个重要原因是最大化编译器的可移植性。您可以为所有平台使用一个编译器前端,然后将IR传递给特定于平台的代码生成器。 GCC以这种方式工作,我确信大多数(如果不是全部)正常的编译器都是这样工作的。
另一个好处是,在将IR代码发送到代码生成器之前,您可以对IR代码执行某些优化。某些优化不是特定于平台的:例如,不受循环影响的代码可以退出循环。平台优化器通常在较低级别上进行优化,例如寄存器分配,分支等,这些内容实际上取决于CPU的属性。