2012-10-26 41 views
0

是否有人知道如何使用Sun Studio編譯器插入可識別的代碼序列,而沒有可怕的搞錯優化?將生成的sparc彙編代碼的段標記爲檢查

我想查看一下Sun Studio(12.1)編譯器在很多實例中用一些代碼所做的工作,並且正在尋找一種方法來標記生成的代碼, op指令,所以我可以找到我的代碼片段。我使用的第一個嘗試:

asm volatile ("nop ; nop ; nop ") ; 
// ... <stuff I want to look at here> ... 
asm volatile ("nop ; nop ; nop ; nop ; nop") ; 

但是,當我使用這個時,編譯器在nop塊內生成未優化的代碼。例如:

nop 
nop 
nop 
ld  [%sp + 0x8bf], %g2 
srl  %g2, 0x0, %g3 
sllx  %g3, 0x2, %g4 
ld  [%sp + 0x8c3], %g5 
ldx  [%sp + 0x8c7], %o2 
st  %g5, [%o2 + %g4] 
ld  [%sp + 0x8b7], %o3 
ldx  [%sp + 0x8c7], %o4 
st  %o3, [%o4 + 0x28] 
nop 
nop 
nop 
nop 
nop 

有問題的代碼只是兩個商店。我不太瞭解sparc彙編,但是看起來編譯器已經完全放棄了在nop塊內優化代碼。例如,爲什麼它會產生一個新的負載ldx [%sp + 0x8c7], %o4,當它在%02中完成時重新計算商店的基地址?

瞥一眼周圍的代碼,它可能很好地在所使用的asm揮發物附近的任何地方未被優化。

我想,而不是下面,創建一個文件的.il此聯彙編:

.inline DO_Nop3,0 
    nop 
    nop 
    nop 
.end 
.inline DO_Nop5,0 
    nop 
    nop 
    nop 
    nop 
    nop 
.end 

在我的源代碼如下:

extern "C" void DO_Nop3() ; 
extern "C" void DO_Nop5() ; 

利用這一點,我已經得到了相反的問題,編譯器現在太聰明瞭,並完全消除了我的nop指令(我猜它看着.inline塊中的指令的副作用,然後後來正確地認爲這不起作用,並且拋出那一點代碼)。

有沒有更好的方法?

+1

如何調用一個特定的函數,以便您可以識別反彙編中的調用操作碼? –

+0

我一直希望有一些不太乾擾的東西,因爲函數調用可能會引入額外的寄存器壓力。 –

回答

0

問題是編譯器可以自由地重新排序指令; asm volatile塊會阻止它進行並可能會阻止優化。

調試符號應該給你從指令地址到源代碼行的映射。不過,我不知道有任何方便讀取矮人2 /刺的好工具。

+0

應該更好地優化的糟糕的代碼是兩對asm揮發物之間的。不應該有太多的藉口來錯誤地優化它(具體的例子不是針對結構基地址加載到%o4中,因爲它已經存在於%o2中......這兩個代碼都與內部的存儲指令相關聯一對asm()塊。) –

+0

另請注意,我對優化的代碼特別感興趣,並且不要指望調試符號最終會在這裏工作得太好。 –