簡體   English   中英

枚舉通過Gcc 4.2.4中的優化導致二進制更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM