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