我使用的是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
答案 0 :(得分:1)
有没有办法避免二进制更改
要检查Jonathon Reinhart的怀疑“它可能与分支预测有关”,您可以尝试选项-fno-guess-branch-probability
。