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