The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"GCC удалён из основного состава FreeBSD "
Отправлено Аноним, 07-Мрт-20 08:05 
> Достаточно большую, чтобы нельзя было сделать одним-двумя mov (или mov + str).

Ну да. Однако memcpy прямо в кодогенерации - достаточно неожиданно, а в микроконтроллере еще и очень так себе сюрприз. А с LTO и вовсе вспрыг на грабли.

> Так ведь это изменение меняет семантику,

Однако если уж он так хотел адски поумничать, мог бы, чтоли, заметить что это переменная с локальной видимостью в функции, используемая только readonly, которую никто нигде никак больше не использует и сам задемотить ее до static const, чтоли...

> а компилятор не может оптимизировать в нарушение стандарта,

Ну вообще-то если хочется чтобы совсем вот так, полагается "volatile" сказать. Некоторые вещи компилер имеет право не заметить. Ну например он не знает что обработчик IRQ или хардварного exception кто-то (железо) ВНЕЗАПНО вызывает.

> делает строго по документации.

Если уж мы об этом, запрос freestanding клещится с идеей влупить memcpy. И прямо на уровне стандарта C99 вроде даже, там удосужились сие явно регламентировать.

> «спасибо» любителям использовать UB и требовать обратной совместимости)?

Не очень понимаю этот реверанс. Воткнуть memcpy в freestanding окружении - и правда UB, потому что его там быть не обязано. Проблема в том что это сделал не я а компилер...

> Так что если там действительно совсем константа, конечно нужно было сразу
> указывать static const, всегда так делаю.

Что однако не извиняет ВНЕЗАПНЫЙ memcpy в freestanding окружении. Но это было бы полбеды, еще половина - в том как это с LTO умеет взаимодействовать :)

> Эх, человек. Со своим инструментом надо если не дружить, то хотя бы
> сотрудничать на взаимовыгодных условиях. А не сражаться. Не надо так.

Да на самом деле я с ним и дружу. В МК с ним приходится оооочень плотно знакомиться, там начальная раскрутка окружения (да, я написал себе "стартап", прямо на си) и чудеса линкерным скриптом, и даже Очень Странные Макросы. Но когда меня дернул черт LTO попробовать - я таки отхватил вот приключений, явно больше чем ожидал :)

> То что операции + и * компилятор всё равно реализует — не смущает?

Он это реализует только очень местами - в лучшем случае это как раз таки лобовые ассемблерные команды, что-нибудь типа ADD и MUL.

> никакое из этих (документированных!) явлений код раздувать не будет.

Код распух когда -O3 пущен с LTO. Обычно LTO убавляет размер, но в случае -O3 вышло наоборот. Почитав как это работает - там у LTO какое-то довольно сложное взаимодействие, так что в каких-то отдельных случаях он так и правда может. И даже есть какие-то более fine-graned опции тюнинга оптимизаций, подозреваю что ими можно попробовать повертеть. Но меня устроило -O2+LTO если мне "быстро" и -Os+LTO если "место жмет".

> было почитать документацию.

Документация на LTO, кстати, довольно средненькая и лаконичная. Хоят общее понимание процесса дает, но в целом LTO в GCC та еще камасутра, имхо.

> больше из-за того что некогда было подумать над выбором типов, добавлением
> static и const в нужных местах, алгоритмическими оптимизациями и т.д.

Так компилер и не умничал, до тех пор пока я не попробовал посмотреть а какой вообще минимально можно код. Я сменил набор команд и врубил LTO. А он и взбрыкни с undefined reference, и даже если memcpy дать.

> Так ведь такое дело, что это код не более левый, чем весь
> остальной сгенерированный компилятором.

Как бы это сказать? Ну если вы господа умники уж втыкаете референс на memcpy - тогда, хотя-бы, врубите мозг и не optimize out его реализацию, не?! А то как я его provide'ить должен? :)

> можно было сделать красивее, но знали б где упадут — соломки подстелили.

Можно было уважить стандарт и не фигарить в freestanding окружение такие клюки. А если уж так сильно хочется - ну, ладно, а зачем тогда мой memcpy выпиливать и потом жаловаться? Я еще должен явно хинтить что он used, при том что компилер сам его used? В общем он сам себя надул :)

> инструкциями. Но, насколько понимаю, когда отключаются builtins, такая оптимизация уже
> не будет работать, конечно.

И более того - в МК работа с памятью довольно деликатная штука и такие выходки могут отобрать у меня контроль над происходящим до того как все инициализировано. Обгадив весь компот. Я чо, на асме стартап должен писать? Да ну в пень?! Половина фич Cortex M в том что его можно с места в карьер сями пнуть, без асма.

> В общем, сражаться с инструментом — заведомо плохая идея и если есть
> ощущение что сражаешься, надо читать доку, обычно окажется что решение куда
> проще, чем казалось, да ещё и тому есть неиллюзорные причины.

Я примерно так и сделал, и все же имею заметить что LTO может подкинуть сюрпризов в упомянутом случае.

p.s. да вы не бойтесь, на шланге я вообще не возьмусь такие пируэты откалывать и там наверняка не меньше приколов зарыто... :)

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру