2016-08-31 5 views
0

次のコードを考えてみましょう。Epb.ccというファイルに入れます。g ++がepbをプッシュし、最適化レベルを越えて関数の先頭にespを保存するのを防ぐことはできますか?

void f() {  
    asm("nop"); 
}     

ここでは、さまざまな最適化レベルでコンパイルします。

g++ -c -O0 -o Out0 Ebp.cc 
g++ -c -O1 -o Out1 Ebp.cc 
g++ -c -O2 -o Out2 Ebp.cc 
g++ -c -O3 -o Out3 Ebp.cc 

ここにはそれぞれobjdump -dの出力があります。

$ objdump -d Out*        

Out0:  file format elf64-x86-64    


Disassembly of section .text:     

0000000000000000 <_Z1fv>:      
    0: 55      push %rbp  
    1: 48 89 e5    mov %rsp,%rbp 
    4: 90      nop    
    5: 5d      pop %rbp  
    6: c3      retq    

Out1:  file format elf64-x86-64    


Disassembly of section .text:     

0000000000000000 <_Z1fv>:      
    0: 90      nop    
    1: c3      retq    

Out2:  file format elf64-x86-64    


Disassembly of section .text:     

0000000000000000 <_Z1fv>:      
    0: 90      nop    
    1: c3      retq    

Out3:  file format elf64-x86-64    


Disassembly of section .text:     

0000000000000000 <_Z1fv>:      
    0: 90      nop    
    1: c3      retq    

それはすべての最適化レベルを越え、この特定の機能のための3つの追加の命令を追加しないためにg++を指示することは可能ですか?

+0

@MichaelPetch、これは問題を解決するため、私はこれを答えとして受け入れます。私は単一の機能にしか影響を及ぼさないものを探していましたが、これも同様に機能すると思います。 – merlin2011

+0

実際には、私はあなたがそれを行うための機能レベルの方法を本当に探していたので、投稿した直後にコメントを削除しました。 GCC/G ++では、それを行う関数属性があるのか​​分かりません。 –

+0

@MichaelPetch、私は、たとえ機能レベルの方法がないとしても、今後この質問を見ている人にとっては、このコメントはまだ価値があると思います。 – merlin2011

答えて

0

@MichaelPetchコメントで指摘したように、(ほかにも、他の機能)この機能に影響を与える一つの解決策は、それは機会を見つけた時はいつでもg++はプロローグを省略するようになりますコンパイラオプションを使用することです最適化レベルに関係なく、

関連する問題