0

有谁知道如何使用 Sun Studio 编译器插入可识别的代码序列,而不会搞砸优化?

我想看看 Sun Studio (12.1) 编译器在许多实例中对一些代码做了什么,并且正在寻找一种方法来用一组可识别的无操作指令标记生成的代码,所以我可以找到我的代码片段。我第一次尝试使用:

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 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 回答