Бесконечные траблы с бесконечностью
Jan. 16th, 2018 02:41 pmВот невзлюбил меня за что-то сишный макрос INFINITY. Всего-то три месяца назад боролись c использованием этого слова как ключевого в SQL.
Так теперь новая затея.
После очередного вливания патчей из апстрима стали валиться регрешн тесты на спарке (64-битная сборка).
Копались, копались и докопались до того, что причина в __int128_t, который в 5-м gcc вроде бы есть, но как-то не очень работает (спасибо хоть в кору бэкэнд не роняет при алигменте 8).
Первое, что посоветовали в hackers, это "А вы gcc обновите, там это недавно фиксиил".
Ну накатил я на этот спарк gcc 5.5.0 с opencsw.org (до этого там была 5.2.0 оттуда же). Запускаю сборку, а она ба-бах, и падает. Оказывается макроса INFINITY, NAN и HUGE_VAL определены через такие builtins, которых в этом GCC и не было. Ну может в 3.4.3 с Software Companion они и были, но с тех пор давно сплыли, а gcc почему-то в своих include-fixed это не фиксит. Хотя math.h туда копирует и как-то патчит.
Пришлось руками туда дописывать определения этих макросов потыренные с ближайшего Linux-а с GCC той же major version. (это оказалась убунта 14.04).
Что самое обидное, 128 целым это не помогло. Придется теперь писать тест, который определяет это, и пропихивать его в configure постгреса.
Кстати Том Лейн, который прислал свой прототип такого теста, почему-то уверен, что2*2=5
97656255 << 12 = 400000000000. Но тест у него не работает (в смысле говорит что All OK, когда не OK) не поэтому.
Так теперь новая затея.
После очередного вливания патчей из апстрима стали валиться регрешн тесты на спарке (64-битная сборка).
Копались, копались и докопались до того, что причина в __int128_t, который в 5-м gcc вроде бы есть, но как-то не очень работает (спасибо хоть в кору бэкэнд не роняет при алигменте 8).
Первое, что посоветовали в hackers, это "А вы gcc обновите, там это недавно фиксиил".
Ну накатил я на этот спарк gcc 5.5.0 с opencsw.org (до этого там была 5.2.0 оттуда же). Запускаю сборку, а она ба-бах, и падает. Оказывается макроса INFINITY, NAN и HUGE_VAL определены через такие builtins, которых в этом GCC и не было. Ну может в 3.4.3 с Software Companion они и были, но с тех пор давно сплыли, а gcc почему-то в своих include-fixed это не фиксит. Хотя math.h туда копирует и как-то патчит.
Пришлось руками туда дописывать определения этих макросов потыренные с ближайшего Linux-а с GCC той же major version. (это оказалась убунта 14.04).
Что самое обидное, 128 целым это не помогло. Придется теперь писать тест, который определяет это, и пропихивать его в configure постгреса.
Кстати Том Лейн, который прислал свой прототип такого теста, почему-то уверен, что
97656255 << 12 = 400000000000. Но тест у него не работает (в смысле говорит что All OK, когда не OK) не поэтому.