Проект rustc_codegen_cranelift продолжает динамично развиваться, демонстрируя значительный прогресс в области оптимизации и расширения возможностей компилятора Rust. В июне 2025 года было зафиксировано 476 коммитов, которые принесли существенные улучшения как в функциональности, так и в стабильности. Этот отчет служит подробным обзором наиболее заметных достижений и текущих вызовов, с которыми столкнулась команда разработчиков. Одним из ключевых событий стала реализация поддержки обработки исключений и очистки стека во время аварийного завершения программы на Linux, что стало долгожданным шагом для повышения надежности и гибкости cg_clif – компонента rustc, использующего Cranelift в качестве backend. Исторически работа над поддержкой unwinding началась в рамках бакалаврской работы одного из ведущих участников проекта.
Хотя изначальный код почти полностью функционировал, возникли сложности с размещением дополнительных инструкций перемещения после вызовов функций с возможностью выброса исключений. Эти инструкции должны были выполняться до перехода к блокам обработки исключений, однако из-за особенностей регистрового аллокатора Cranelift такие переходы происходили напрямую, минуя необходимые операции, что приводило к некорректному поведению. Позже, благодаря усилиям Криса Фоллина, ведущего разработчика Cranelift, удалось переработать внутренности регистрового аллокатора и расширить IR Cranelift, что позволило решить описанную проблему и плавно интегрировать поддержку исключений в cg_clif. Тем не менее, на данный момент поддержка unwinding по умолчанию отключена из-за выявленных проблем с производительностью сборки, а также ограничена поддержкой лишь на Linux. На платформах macOS и Windows необходимы дополнительные разработки: macOS требует реализации специфичной схемы кодирования таблиц unwind, а Windows использует сложный подход на основе funclets в модели SEH, который сейчас не поддерживается Cranelift, ориентированным на landingpads.
Помимо улучшений в управлении исключениями, важным направлением стала поддержка ARM64. Теперь вся система непрерывной интеграции успешно собирает и тестирует проекты на нативных ARM64 Linux устройствах, что значительно расширяет проверяемый пул платформ. Был улучшен механизм использования встраиваемых ассемблерных вставок с поддержкой векторных регистров, а также исправлена совместимость популярных зависимостей, таких как half и bytecount, благодаря чему появилась возможность более уверенно разрабатывать и запускать Rust-код на ARM64. В области числовых типов были внесены существенные нововведения. Благодаря усилиям сообщества, реализована поддержка нестабильных типов данных f16 и f128, ранее недоступных в Cranelift backend.
Это расширяет возможности для численных вычислений и научных задач, особенно там, где требуется повышенная точность или оптимизация по занимаемому объему данных. Поддержка этих форматов уже наблюдается в нескольких архитектурах, включая x86_64, aarch64, riscv64 и s390x, демонстрируя мультиплатформенную ориентацию разработки. Немаловажно отметить, что в рамках оптимизации и повышения эффективности кода разработчики стремятся сократить дублирование логики между различными backend-ами компилятора. В частности, были проведены две крупные интеграции в rustc, направленные на совместное использование кода между cg_clif и cg_ssa – традиционным backend-ом компилятора. Это снижает общие затраты на поддержку и ускоряет развитие обеих систем, повышая стабильность и согласованность.
Планируется в дальнейшем интегрировать обработку встроенного ассемблера, опираясь на механизм cg_ssa, что позволит унифицировать и улучшить поддержку inline asm в будущем. В сфере SIMD расширяется набор поддерживаемых вендорских интринсиков, что особенно актуально для платформ ARM64 и x86_64. Были добавлены новые инструкции, такие как vaddlvq_u8 и vld1q_u8_x4 для arm64, а также разработаны и улучшены средства динамического доступа к элементам SIMD-векторов, что открывает двери для более эффективных вычислительных решений и улучшения производительности приложений, интенсивно использующих векторные операции. Также удалось решить часть проблем с ABI, в частности в области обработки 128-битных целочисленных вызовов функций. В результате обновления до версии 1.
0 инструментов abi-cafe уменьшилась необходимость в ручном патчинге исходного кода, что благоприятно сказывается на поддержке и возможности быстрого внедрения будущих улучшений и исправлений. Тем не менее, сохраняются проблемы с совместимостью ABI в разных средах. Например, на ARM64 Linux наблюдается незначительное несовпадение с C ABI, хотя внутренний Rust ABI работает корректно. На ARM64 macOS и x86_64 Windows ситуация сложнее из-за различных особенностей вызовов и передачи значений, особенно для больших типов данных, таких как i128, что требует осторожного подхода при смешивании cg_clif и cg_llvm. Помимо технических достижений, команда активно приглашает сообщество к участию, открывая возможности для новых контрибьюторов ознакомиться с доступными задачами разного уровня сложности.