Отличия от 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`` можно включить режим, корректно
  учитывающий выравнивание. Однако здесь нужно помнить о том, что при использовании
  опции её нужно использовать всегда. Нельзя допускать того, чтобы часть программы,
  выполняющей атомарные операции над определённым участком памяти, собиралась
  с опцией, а другая часть программы, выполняющей атомарные операции над этим же
  самым участком памяти, собиралась без опции. В этом случае можно столкнуться
  с проблемой, описанной в статье :doc:`atomic16`, но уже для произвольного размера
  типа

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


