LINUX.ORG.RU

GCC пищит или sizeof(u32) != 4

 , ,


1

4

Сабж

/* DISCLAIMER:
 *     I'm aware of "magic constants" in this file, 
 *     but they stay here because of strange gcc behaviour:
 *
 *     return val >> n | val << (32 - n);
 *
 *     unrolls to
 *
 *     mov     eax, DWORD PTR [rbp-8]
 *     mov     edx, DWORD PTR [rbp-4]
 *     mov     ecx, eax
 *     ror     edx, cl                 ← fast ror here
 *     mov     eax, edx
 *
 *     (x86-64 gcc 5.3, -O0),
 *
 *     but
 *
 *     return val >> n | val << (sizeof(val) * 8 - n);
 *
 *     unrolls to
 *
 *     mov     eax, DWORD PTR [rbp-8] ─┐
 *     mov     edx, DWORD PTR [rbp-4]  │
 *     mov     esi, edx                │
 *     mov     ecx, eax                │
 *     shr     esi, cl                 │
 *     mov     eax, 32                 ├─ no ror
 *     sub     eax, DWORD PTR [rbp-8]  │
 *     mov     edx, DWORD PTR [rbp-4]  │
 *     mov     ecx, eax                │
 *     sal     edx, cl                 │
 *     mov     eax, edx                │
 *     or      eax, esi               ─┘
 */

Пруф: https://godbolt.org/g/rMdXMF

Да, на -O0, но очень часто приходится собирать в debug для прод-узлов, а там -O0. SHA1 сильно базируется на rol, для отладки нужна дебажная инфа, файлы чекаются по 200+ ГБ, тут каждая секунда уже помогает.

★★★★★

Открою тебе секрет: можно собирать сборку с отладочной информацией и одновременно со включенными оптимизациями.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Открою тебе секрет: можно собирать сборку с отладочной информацией и одновременно со включенными оптимизациями.

трепло же ты какое... ничего тебе доверить нельзя, все секреты выбалтываешь

anonymous
()

А при чем тут sizeof(u32)?

Вероятнее всего, с -O0 он генерирует универсальный код, не вычислив sizeof(val) * 8

madcore ★★★★★
()

а там -O0. SHA1 сильно базируется на rol

И неужели нету современных реализаций с использованием SIMD?

madcore ★★★★★
()
Ответ на: комментарий от KivApple

Так с оптимизацией вылезут все UB в говнокоде, так неспортивно.

anonymous
()
Ответ на: комментарий от KivApple

Ага, чтобы потом вместо шагов а, б, ц получить константу на выходе. Гдб от этого раком воет.

PPP328 ★★★★★
() автор топика

Попробуй собирать с -Og.

i-rinat ★★★★★
()
Ответ на: комментарий от PPP328

Многие баги можно отладить и с -O2. Просто придётся смириться с тем, что GDB будет скакать по строчкам не в том порядке, в котором ты ожидаешь. А для сложных багов можно временно запускать версию с -O0 и терпеть потери производительности.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Для сложных багов в распоряжении обычно только core-файл.

PPP328 ★★★★★
() автор топика

Рекомендую купить камни с поддержкой аппаратного SHA :)

buddhist ★★★★★
()

бред, когда уже детей по банят с лорчика, а то считать разучились, по ссылке как раз sizeof(uint) == 4 потому что 32 в итоге

anonymous
()
Ответ на: комментарий от anonymous

Совсем анон слепой пошел. sizeof(u32) равен 4. И это известно еще до компиляции. Вот только gcc про то что 4 * 8 можно сократить до 32 и заюзать ror забыл и сгенерировал тонну кода.

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от madcore

Это все равно что в

#define AAA (5)

i = AAA;
оставить при генерации ААА.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

В том, что твой #define AAA (5) развернет препроцессор еще до компиляции, а 8*4 может посчитается сходу компилятором, а оператор sizeof на первом проходе он оставит напотом и в итоге с концами при -O0.
Чему тут негодовать не очень ясно - просил О0 - на те код без любых движений в сторону оптимизаций.

madcore ★★★★★
()

потому что sizeof — это оператор, который, например, для массивов переменной длины должен вычисляться?

anonymous
()
Ответ на: комментарий от madcore

-O0 не выключает оптимизации, он:

-O0 Reduce compilation time and make debugging produce the expected results.

Т.е. движения в сторону оптимизаций при -O0 всё же имеются.

EXL ★★★★★
()
Ответ на: комментарий от madcore

Странный вывод.

Надо ещё добавить, что некоторые оптимизации в GCC нельзя выключить, потому что даже настроек для них нет. Например if (0) { something(); } он выкидывает очень рано и выключить это не представляется возможным.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Вывод в том, что для разных архитектур/таржетов куча всего существует, чего-то специфического, чего-то обобщенного, потому и с -O0 для чего-то названо оптимизацией, для чего-то нормой.

if (0) { something(); } он выкидывает очень рано и выключить это не представляется возможным.

Куда?

madcore ★★★★★
()
Ответ на: комментарий от PPP328

тупой авто поста, который пытается учить gcc как ему лучше при этом отключает все оптимизации
и да, дебаг информацию можно оставлять и при -O3, учите основы

anonymous
()
Ответ на: комментарий от anonymous

-O0 НЕ отключает оптимизации. Читай мануал.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от madcore

Clang так и делает. При -O0 не оптимизируется вообще ничего - что гарантирует что ВЕСЬ код останется, даже если там невообразимая хрень.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от menangen

Не могём. Мы тут активно избавляемся от юза сторонних либ, потому что даже openssl которую мы юзаем раз в N дней падает у себя в кишках. Обновить не можем, потому что на узлах ядро заморожено (а обновить 2к+ узлов которые разбросаны по стране с вероятностью сделать кирпич достаточно проблематично). Поэтому пишем такие приложения которые в идеальном случае вообще ни от чего не зависят. Написали базовую либу с реализацией практически всего что может пригодиться, поверх нее намутили еще пару и этим и пользуемся. По скорости кстати интересные вещи - memcpy/memmove/memset из либы под linux работает чуть медленее (из-за дополнительных проверок), зато под minix дает ощутимый буст скорости. Будет время - запилю пост с вайнингом почему миникс такое говно.

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

Я подозреваю спекуляцию на UB signed integer overflow

Откуда спекуляция? Сдвигается беззнаковое.

anonymous
()
Ответ на: комментарий от anonymous

Откуда спекуляция? Сдвигается беззнаковое.

В случае 32 - n, а не сдвиг. Просто лень дальше думать.

KennyMinigun ★★★★★
()
Ответ на: комментарий от PPP328

Вот когда в c89 завезут stdint вот тогда и поговорим.
когда в c89 завезут

Скорее с89 куда-то вывезут (на катафалке и с лопатами).

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Что-то с 1990го года не спешат. Наверное катафалки закончились или все еще компилируются на моднявых недоязычках. А с89 вечен. Все конторы типа Keil и проч всегда сначала делают поддержку с89 для своих компиляторов, а уже потом лет через 15 - с99 и последующих.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Гомопроблемы проприетарщиков со штатом состоящим из полутора престарелых макак.

anonymous
()
Ответ на: комментарий от PPP328

Что-то с 1990го года не спешат.

Если вы хотите видеть в результирующем коде нужную вам последовательность инструкций, вы и должны написать их, то есть на ассемблере. А не заниматься 30 лет онанизмом, перебирая -Ox под разные версии компилятора, выискивать этот код и сокрушаться, что в очередной раз компилятор более (пусть и не очень) уровня генерит не то.

vodz ★★★★★
()
Ответ на: комментарий от vodz

во во, clang при -O0 вообще никаких роров в обеих случаях не генерит, да и не обязан, но школьник бегает доказывает что аяяй какой компилятор ему рор не вставил

anonymous
()
Ответ на: комментарий от EXL

На все архитектуры разом?

Креативное цитирование детектед. Какой хочет автор увидеть, на том и писать.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.