Oracle Solaris Studio 12.2:性能分析器

克隆函数

编译器能够识别可以对其执行额外优化的函数调用。所传递的部分参数是常量的函数调用即是这类调用的其中一个示例。当编译器识别出它可以优化的特定调用时,会创建该函数的副本(称为克隆) 并生成优化代码。

在带注释的源代码中,编译器注释将指示是否创建了克隆函数:


0.       0.       Function foo from source file clone.c cloned, 
                   creating cloned function _$c1A.foo; 
                   constant parameters propagated to clone
0.       0.570     27.    foo(100, 50, a, a+50, b);

注 –

在实际的带注释的源代码显示中,编译器注释行并不换行。


克隆函数名称是标识特定调用的重整名称 (mangled name)。在上面的示例中,编译器注释指示克隆的函数名称为 _$c1A.foo。在函数列表中,该函数显示为:


0.350     0.550     foo
0.340     0.570     _$c1A.foo

因为每个克隆函数都具有不同的指令集,所以带注释的反汇编代码列表会分别显示这些克隆函数。这些函数与任何源文件都没有关联,因此其指令也与任何源代码行号无关。下面显示了某个克隆函数的带注释的反汇编代码的前几行。


0.       0.           <Function: _$c1A.foo>
0.       0.           [?]    10e98:  save        %sp, -120, %sp
0.       0.           [?]    10e9c:  sethi       %hi(0x10c00), %i4
0.       0.           [?]    10ea0:  mov         100, %i3
0.       0.           [?]    10ea4:  st          %i3, [%i0]
0.       0.           [?]    10ea8:  ldd         [%i4 + 640], %f8