Я использую GCC версии 4.2.4. Описанная ниже проблема не может быть воспроизведена на Gcc 4.6.x, и это единственные две версии, которые я тестировал.
У меня есть заголовочный файл, который определяет перечисления,
Заголовок: abc.h
enum test
{
VALUE_1 = 1,
VALUE_2 = 2,
VALUE_MAX = 0xFFFF,
};
Этот заголовок включен в несколько исходных файлов, и каждый исходный файл создает объект (.o) во время компиляции. И есть несколько исходных файлов, которые не ссылаются ни на одно из перечислений в abc.h.
Проблема, которую я вижу, заключается в том, что если я добавлю новую константу (VALUE_3) в abc.h, то двоичная сумма md5 объектов, которые не используют никаких перечислений, также получит изменения. Это происходит только тогда, когда я применяю оптимизации, а не иначе при компиляции.
Я подозреваю, что это как-то связано с флагами -ftree-vrp и -ftree-dominator-opts, которые включаются при оптимизации. использование этих флагов с параметром -fno по-прежнему вызывает изменение некоторых объектов, но не позволяет другим измениться (что приводит к изменениям с этими флагами).
Другое интересное замечание состоит в том, что сумма md5 оказывается одинаковой для четного или нечетного числа перечислений.
Может кто-нибудь, пожалуйста, помогите мне понять, что происходит в бэк-энде и есть ли способ избежать двоичного изменения, чтобы поддерживать md5sum, когда нет фактического изменения кода для этого конкретного объекта.
Заранее спасибо.
Отредактировано:
Для одного объекта следующим является diff. Для других объектов также есть несколько других изменений (в инструкциях mov и т. Д.). Как видите, только регистры операндов в некоторых инструкциях меняются местами. Я хочу понять причину и как избежать этого с оптимизацией.
# diff test.o.1 test.o.2
1548,1549c1548,1549
< cmpl %eax, %ecx
< jg .L442
---
> cmpl %ecx, %eax
> jl .L442
есть ли способ избежать бинарного изменения
Чтобы проверить подозрение Джонатона Рейнхарта «это может быть связано с предсказанием ветвления«, вы можете попробовать вариант -fno-guess-branch-probability
,
Других решений пока нет …