标记生成的sparc汇编代码段以供检查

时间:2012-10-26 19:14:46

标签: assembly disassembly sparc

有没有人知道如何使用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挥发物附近的任何地方都可能没有优化。

我尝试了以下方法,使用此内联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块阻止它这样做,并可能阻止优化。

调试符号应该为您提供从指令地址到源代码行的映射。不过,我不知道有什么好方法可以方便地阅读dwarf2 / stabs。