是否有人知道如何使用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
塊中的指令的副作用,然後後來正確地認爲這不起作用,並且拋出那一點代碼)。
有沒有更好的方法?
如何調用一個特定的函數,以便您可以識別反彙編中的調用操作碼? –
我一直希望有一些不太乾擾的東西,因爲函數調用可能會引入額外的寄存器壓力。 –