Эльбрус/clang

Материал из ALT Linux Wiki

Когда не справляется 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