2014-04-16 98 views
0

我使用GCC 4.2.4版與優化二元變化。下面解釋的問題不能在Gcc 4.6.x上覆制,這是我測試的唯一兩個版本。枚舉導致的gcc 4.2.4

我具有定義枚舉, 頭的頭文件:abc.h

enum test 
{ 
    VALUE_1 = 1, 
    VALUE_2 = 2, 

    VALUE_MAX = 0xFFFF, 
}; 

此報頭被包括在幾個源文件和每個源文件創建在編譯時的目標(.o)。並且有幾個源文件不引用任何abc.h中的枚舉。

我看到的問題是,如果我在abc.h中添加一個新常量(VALUE_3),那麼不使用任何枚舉的對象的二進制md5sum也會得到更改。這隻發生在我應用優化而不是在編譯時。

我懷疑它有事情做與獲取與優化啓用標誌-ftree-VRP和-ftree-支配-OPTS。在-fno中使用這些標誌仍然會導致一些對象發生變化,但是可以防止其他幾個變化(這些標誌會發生變化)。

另一個有趣的obsevation是md5sum也出來是同爲偶數或奇數枚舉。

誰能請幫助我瞭解什麼在後端是怎麼回事,是有什麼辦法可以避免二元變化來維持的md5sum當有針對特定對象沒有實際上的代碼改變。

在此先感謝。

被修改:

對於一個對象,以下是diff。對於其他對象,其他更改也很少(在mov等指令中)。正如你所看到的,只有某些指令中的操作數寄存器被交換了。我想了解原因以及如何通過優化來避免它。

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

簡單地指出MD5哈希的變化是不夠的。如果你關心這個級別,你應該使用'objdump -d'和朋友來確定* .o文件中*實際*改變了什麼。 –

+0

感謝喬納森。問題描述已被編輯。 – Akamai

+0

已編輯的問題描述。 – Akamai

回答

1

有什麼辦法來避免二元變化

要檢查喬納森·萊因哈特的懷疑「它可能與分支預測做」,你可以嘗試選擇-fno-guess-branch-probability