0

Sun Studio コンパイラを使用して、最適化をひどく台無しにすることなく、認識可能なコード シーケンスを挿入する方法を知っている人はいますか?

Sun Studio (12.1) コンパイラがいくつかのインスタンスでコードの一部をどのように処理するかを確認したいと考えており、生成されたコードを認識可能な一連の no-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

問題のコードは、2 つの店舗だけです。sparc アセンブリについてはよくわかりませんが、これはコンパイラが nop ブロック内のコードの最適化を完全にあきらめたようです。ldx [%sp + 0x8c7], %o4たとえば、ストアのベース アドレスを ですでに再計算しているのに、新しいロード を生成するのはなぜでしょう%02か。

周囲のコードを一目見ただけで、使用されている asm volatile の近くのどこでも最適化されていない可能性があります。

代わりに次のことを試し、このインライン 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後で、正しくこれを決定すると推測しています)。何もせず、そのコードを投げ捨てます)。

より良い方法はありますか?

4

1 に答える 1

0

問題は、コンパイラが自由に命令を並べ替えられることです。asm volatileブロックはそれを阻止し、最適化を阻害する可能性があります。

シンボルをデバッグすると、命令アドレスからソース行へのマッピングが得られるはずです。ただし、dwarf2/stabs を便利に読み取るための優れたツールは知りません。

于 2012-10-26T20:41:21.983 に答える