枚举在Gcc 4.2.4中通过优化导致二进制更改

时间:2014-04-16 15:16:15

标签: c++ c gcc gcc4 gcc-4.2

我使用的是GCC 4.2.4版。下面解释的问题不能在Gcc 4.6.x上重现,这些是我测试过的两个版本。

我有一个定义枚举的头文件, 标题:abc.h

enum test
{
    VALUE_1 = 1,
    VALUE_2 = 2,

    VALUE_MAX = 0xFFFF,
};

此标头包含在一些源文件中,每个源文件在编译时创建一个对象(.o)。并且很少有源文件不能引用abc.h中的任何枚举。

我看到的问题是,如果我在abc.h中添加一个新常量(VALUE_3),那么不使用任何枚举的对象的二进制md5sum也会得到更改。这只发生在我应用优化而不是编译时。

我怀疑它与标志-ftree-vrp和-ftree-dominator-opts有关,它们通过优化启用。将这些标志与-fno一起使用仍然会导致某些对象发生变化,但会阻止其他少数变化(这些标志会随着这些标志发生变化)。

另一个有趣的观察是md5sum对于偶数或奇数的枚举都是相同的。

任何人都可以帮助我理解后端发生了什么,有没有办法避免二进制更改,以便在没有针对该特定对象的实际代码更改时维护md5sum。

提前致谢。

编辑:

对于一个对象,以下是差异。对于其他对象,也很少有其他更改(在mov等指令中)。如您所见,只交换某些指令中的操作数寄存器。我想了解原因以及如何通过优化来避免它。

# diff test.o.1 test.o.2
1548,1549c1548,1549
<     cmpl    %eax, %ecx
<     jg      .L442
---
>     cmpl    %ecx, %eax
>     jl      .L442

1 个答案:

答案 0 :(得分:1)

  

有没有办法避免二进制更改

要检查Jonathon Reinhart的怀疑“它可能与分支预测有关”,您可以尝试选项-fno-guess-branch-probability