Эльбрус/clang
Когда не справляется lcc, приходит на выручку clang.
Выбор clang для сборки
BuildRequires
Для выбора текущей рекомендованной версии clang добавьте в соответствующую часть спека:
%ifarch %e2k BuildRequires: clang %endif
либо для фиксирования конкретной (в целом нежелательно, т.к. со временем изменится и она, но изредка требуется -- или по этой самой причине, или же когда действительно необходимая новейшая версия clang ещё не выбрана по умолчанию в llvm-common):
%ifarch %e2k BuildRequires: clang21.1 %endif
В некоторых случаях может потребоваться и llvm-devel.
autotools
%ifarch %e2k export CC=clang CXX=clang++ %endif
либо
%ifarch %e2k export CC=clang-21 CXX=clang++-21 %endif
cmake
%ifarch %e2k
-DCMAKE_C{_COMPILER=clang,XX_COMPILER=clang++} \
%endif
Передача опций
При необходимости передать специфические lcc-опции оптимизирующему бэкенду условно нечётных clang'ов (у которых в выводе clang -v упоминается lccopt):
$ LCCOPT_CFLAGS="-fno-spec-fp" clang ...
либо
$ clang ... -flb-option="-fno-spec-fp"
Опция перебивает переменную окружения.
Нужно указывать опции, которые получает компилятор ecf_opt. Некоторые опции у драйвера lcc и компилятора ecf_opt могут называться по-разному. Например, -march= для lcc, и --mcpu-internal= для ecf_opt. Поэтому иногда надо запустить драйвер lcc с опцией -v, чтобы пристальным взглядом найти соответствующую опцию ecf_opt.
Опция -v не показывает запуск lccopt-бэкенда. Это можно включить переменной окружения:
$ LCCOPT_VERBOSE_COMPILE=1 clang ...
Более полный информационный режим:
$ LCCOPT_VERBOSE=1 clang ...
Как в общих чертах идет процесс трансляции:
$ LLVM_LCCRT_VERBOSE_IR=1 clang ...
Конкретно по взятой для примера опции -fno-spec-fp в чётных clang'ах дело обстоит так:
- 18: не поддерживается и не требуется, т.к. не генерируется спекулятивность на плавающих операциях
- 20: совпадает с lcc