Отличия от gcc при построении атомарных builtin’ов

При построении атомарных builtin’ов (встроенных функций __atomic_* и __sync_*) в lcc имеется ряд НЕпринципиальных отличий от gcc

  • При построении __sync’ов в ситуациях, когда отсутствует аппаратная поддержка соответствующей операции, gcc строит вызов функции, имя которой либо совпадает с именем __sync’а, либо построено на его основе. Тело функции пользователь должен реализовать самостоятельно. В таких случаях lcc строит вызов функции из библиотеки libatomic, т.е. фактически конвертирует __sync в эквивалентный по смыслу __atomic. В указанных случаях вместо написания собственной реализации нужной функции пользователю достаточно подать опцию -latomic при линковке

  • При построении generic-версий __atomic’ов gcc смотрит только на размер типа, над которым выполняется операция, но не учитывает его выравнивание. В итоге для типов размерами 2, 4, 8, 16 байт атомарная операция принудительно будет строиться как для выровненного типа. В том числе и на тех архитектурах, где невыровненные обращения в память запрещены в принципе. В lcc по умолчанию повторено это поведение, но по опции -mno-unaligned-type-atomic можно включить режим, корректно учитывающий выравнивание. Однако здесь нужно помнить о том, что при использовании опции её нужно использовать всегда. Нельзя допускать того, чтобы часть программы, выполняющей атомарные операции над определённым участком памяти, собиралась с опцией, а другая часть программы, выполняющей атомарные операции над этим же самым участком памяти, собиралась без опции. В этом случае можно столкнуться с проблемой, описанной в статье Потенциальные проблемы при использовании 16-байтных атомарных операций, но уже для произвольного размера типа

  • В защищённом режиме для процессоров с системой команд elbrus-v4 и ниже можно считать, что, грубо говоря, в линковку всегда подана опция -latomic. Технически это не так, но можно исходить их того, что это так. Такая необходимость возникла из-за того, что на процессорах elbrus-v4 и ниже отсутствует аппаратная поддержка 16-байтных атомарных операций (есть только атомарные load и store для дескрипторов). Это приводит к тому, что сборка в защищённом режиме может потребовать использования опции -latomic в то время, как для других режимов и процессоров сборка программы такой опции не требует