2010-12-10 133 views
1

Valgrind使用中間代碼表示讓我們測試二進制代碼,以便我們不必處理編程語言級別的構造。在將二進制代碼轉換爲Valgrind的中間表示(IR)代碼的過程中,它顯示了使用寄存器執行添加等操作。其中有1024個正在使用。我沒有得到的是另一種稱爲臨時寄存器的寄存器,其表示爲tX,其中X是某個數字。因此,我可以看到:寄存器和臨時寄存器有什麼區別?

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

t表示臨時註冊表。據我所知,他們似乎與常規寄存器非常相似,但無法弄清楚它們的不同之處。有人能告訴我什麼是臨時登記冊,以及它與常規登記簿有什麼不同?

+1

我可能在這裏丟失了一些明顯的東西,但在這個例子中我既沒有看到`R`也沒有看到`T` ......? – 2010-12-10 05:21:17

+0

@Laurence:解決了我的問題。感謝您指出。 – Legend 2010-12-10 06:04:03

回答

2

在編譯器構造類中,我被教導說中間代碼中的寄存器是虛擬寄存器。它們不一定與目標平臺的可執行文件有關。它們可能是真正的CPU寄存器,或者它們可能是內存中的臨時對象。這一切都取決於代碼生成器和優化器。代碼生成器決定臨時分配的位置。

生成IR的一個重要原因是最大化編譯器的可移植性。您可以爲所有平臺使用一個編譯器前端,然後將IR傳遞給特定於平臺的代碼生成器。 GCC以這種方式工作,我相信大多數(如果不是全部的話)體面編譯器以這種方式工作。

另一個好處是您可以在IR代碼發送到代碼生成器之前執行某些優化。一些優化不是特定於平臺的:例如,不受循環影響的代碼可以被撤出循環。平臺優化器通常會在較低級別進行優化,例如寄存器分配,分支等,這些都取決於CPU的屬性。