Я писал недавно, что у меня на плате RISC-V крэшился компилятор clang, установленный из репозитория Debian. Пересобрал его с текстов - всё отлично работает. И сам компилятор, и код, который он генерит.
Вариант FENCE.TSO чуть более хитрый чем просто FENCE, и за счёт этого меньше просаживает производительность. Он разделяет операции чтения на "до" и "после", а также операции записи на "до" и "после". Но не определяет порядок операций чтения относительно операций записи. Эта команда необязательная, и разработчики чипа Allwinner D1 решили её не делать.
Их ошибка состояла в том, что команда FENCE.TSO вызывает исключение "Illegal Instruction". На самом деле, если она не реализована, этот код операции должен отрабатываться как обычный FENCE. Тогда компилятор мог бы генерить FENCE.TSO вместо FENCE, когда это уместно, и давать большую производительность на некоторых процессорах. Из-за ошибки так не получится, увы. Похоже, нынешние компиляторы вообще не используют эту хитрую команду. Я гонял довольно много разного линуксного софта на плате Nezha, и всё отлично работает.
Сборка clang с текстов заняла несколько дней. Понятно, что одноядерный процессор 1ГГц с памятью 1Гбайт не самая мощная платформа для компиляции такого огромного проекта. Пришлось добавить 8Гбайт свопа, иначе на некоторых компонентах сборка падала. Но в конце концов всё получилось.
Запускается сборка так:
Как выяснилось, дело было в машинной команде FENCE.TSO. Это вариант более общей команды FENCE, которая вынуждает систему памяти завершить все операции чтения-записи, накопленные к этому моменту, и только потом приступать к следующей команде. Специальный "спотыкач" для целей синхронизации.$ clang --version
clang version 13.0.0 (https://github.com/llvm/llvm-project.git 4e2aee8d3bab6010420d9be96480f1d8ae0f35c1)
Target: riscv64-unknown-linux-gnu. .
Thread model: posix
InstalledDir: /home/vak/bin
Вариант FENCE.TSO чуть более хитрый чем просто FENCE, и за счёт этого меньше просаживает производительность. Он разделяет операции чтения на "до" и "после", а также операции записи на "до" и "после". Но не определяет порядок операций чтения относительно операций записи. Эта команда необязательная, и разработчики чипа Allwinner D1 решили её не делать.
Их ошибка состояла в том, что команда FENCE.TSO вызывает исключение "Illegal Instruction". На самом деле, если она не реализована, этот код операции должен отрабатываться как обычный FENCE. Тогда компилятор мог бы генерить FENCE.TSO вместо FENCE, когда это уместно, и давать большую производительность на некоторых процессорах. Из-за ошибки так не получится, увы. Похоже, нынешние компиляторы вообще не используют эту хитрую команду. Я гонял довольно много разного линуксного софта на плате Nezha, и всё отлично работает.
Сборка clang с текстов заняла несколько дней. Понятно, что одноядерный процессор 1ГГц с памятью 1Гбайт не самая мощная платформа для компиляции такого огромного проекта. Пришлось добавить 8Гбайт свопа, иначе на некоторых компонентах сборка падала. Но в конце концов всё получилось.
Запускается сборка так:
git clone https://github.com/llvm/llvm-project cd llvm-project mkdir build cd build cmake -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="RISCV" -G "Unix Makefiles" ../llvm make make install
