LINUX.ORG.RU
ФорумTalks

Ядро наступает на грабли разрабатываемого GCC 7

 , ,


2

5

Сабж. Релиза GCC 7, конечно, ещё не было, но планируемое время релиза (середина апреля) стремительно приближается, а баги всплывают и всплывают. Теперь на грабли GCC 7 наступает ядро, о чём можно прочитать в Changelog'е 6-го патча к ядру 4.10, который вышел на днях:

commit afd4fdd0da4921a9086b9ea7f9e9214caa990bb3
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Thu Mar 2 12:17:22 2017 -0800

    give up on gcc ilog2() constant optimizations

    commit 474c90156c8dcc2fa815e6716cc9394d7930cb9c upstream.

    gcc-7 has an "optimization" pass that completely screws up, and
    generates the code expansion for the (impossible) case of calling
    ilog2() with a zero constant, even when the code gcc compiles does not
    actually have a zero constant.

    And we try to generate a compile-time error for anybody doing ilog2() on
    a constant where that doesn't make sense (be it zero or negative).  So
    now gcc7 will fail the build due to our sanity checking, because it
    created that constant-zero case that didn't actually exist in the source
    code.

    There's a whole long discussion on the kernel mailing about how to work
    around this gcc bug.  The gcc people themselevs have discussed their
    "feature" in

       https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72785

    but it's all water under the bridge, because while it looked at one
    point like it would be solved by the time gcc7 was released, that was
    not to be.

    So now we have to deal with this compiler braindamage.

    And the only simple approach seems to be to just delete the code that
    tries to warn about bad uses of ilog2().

    So now "ilog2()" will just return 0 not just for the value 1, but for
    any non-positive value too.

    It's not like I can recall anybody having ever actually tried to use
    this function on any invalid value, but maybe the sanity check just
    meant that such code never made it out in public.

★★★★★
Ответ на: комментарий от cvs-255

cvs-255> может это значит, что надо лучше продумывать архитектуру, чтобы не было нужно привязываться к этим нестандартным вещам?

Очевидно, какие-то оптимизации идут от этого. Как по части разработки, так и по части выполнения кода.

Quasar ★★★★★
()

Не понял этого понаехавшего школьника. gcc не ругается на ilog2 с заведомо неподходящей константой? Или генерирует неправильный код, подставляя константу с потолка? Чем это мешает ядру?

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

Функция ilog2() считает логарифм по основанию 2. При этом в самих исходниках зелёным по чёрному написано, что нет такой степени числа 2, которая давала бы 0. Поэтому 0 здесь - некорректный аргумент, который не надо передавать функции. Но, GCC при оптимизации генерирует код в т.ч. и для этого случая с константой 0.

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

А кто говорил, что проблема именно лютая? Тем не менее, она есть, и её будут решать. Но, по ходу, не раньше релиза GCC 7.

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

Там был хитрый код, который позволял посчитать log2 от констант во время компиляции. А ещё в этом коде была проверка на неположительные числа. Раньше всё было норм, код компилировался. Теперь GCC внезапно решил генерировать код не лениво, как раньше, а для всех случаев, включая 0. Код перестал собираться. Вообще.

Проверку убрали, теперь собирается.

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

gcc не ругается на ilog2 с заведомо неподходящей константой?

ilog2 — макрос, определённый в include/linux/log2.h. Это не встроенная функция компилятора.

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

Ага, щаз, шлангом еще лялекс не собирается. О дистрибутивах и их пакетах и речи не идет.

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

это железобетонная регрессия. не отработал нормально constant propagation.

ckotinko ☆☆☆
()
Ответ на: комментарий от O02eg

Для ответов на эти вопросы уже нужны специалисты по GCC. На общих знаниях не получается выехать.

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