1

Valgrind 使用中间代码表示来让我们检测二进制代码,这样我们就不必处​​理编程语言级别的结构。在将二进制代码转换为 Valgrind 的中间表示 (IR) 代码的过程中,它显示了寄存器用于加法等操作。其中有 1024 个正在使用。我没有得到的是另一种类型的寄存器,称为临时寄存器,表示为tXX 是某个数字。因此,我可以看到:

t28 = Add32(t26,0xFFFFFFFC:I32)
t4 = LDle:I32(t28)

t意思是临时寄存器。据我所见,它们的行为似乎与常规寄存器非常相似,但无法弄清楚它们有何不同。有人能告诉我什么是临时登记册,它与普通登记册有何不同?

4

1 回答 1

2

在编译器构造课程中,我被告知中间代码中的寄存器是虚拟寄存器。它们不一定与目标平台的可执行文件有任何关系。它们可以是真正的 CPU 寄存器,也可以是内存中的临时寄存器。这完全取决于代码生成器和优化器。代码生成器决定了应该在哪里分配临时对象。

生成 IR 的一个重要原因是最大限度地提高编译器的可移植性。您可以为所有平台使用一个编译器前端,然后将 IR 传递给特定于平台的代码生成器。GCC 就是这样工作的,我敢肯定,如果不是全部的话,大多数体面的编译器都是这样工作的。

另一个好处是您可以在将 IR 代码发送到代码生成器之前对其执行某些优化。一些优化不是特定于平台的:例如,不受循环影响的代码可以被拉出循环。平台优化器通常在较低级别上进行优化,例如寄存器分配、分支等,这些东西实际上取决于 CPU 的属性。

于 2010-12-10T14:38:52.970 回答