我正在使用 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