[英]Enumerations cause binary change with optimizations in Gcc 4.2.4
我正在使用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
有什么辦法可以避免二進制更改
要檢查Jonathon Reinhart的懷疑“ 可能與分支預測有關 ”,可以嘗試使用-fno-guess-branch-probability
選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.