Релиз набора компиляторов LLVM 3.9

После шести месяцев разработки подготовлен релиз проекта LLVM 3.9 (Low Level Virtual Machine) — GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный платформонезависимый псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.

В новом выпуске добавлен оптимизатор ThinLTO, обеспечена совместимость с ABI libstdc++ (GCC), реализована поддержка всех возможностей OpenCL 2.0 и возможностей OpenMP 4.5, не связанных с привлечением дополнительных аппаратных вычислительных устройств, добавлен инструмент clang-include-fixer, в компоновщике lld существенно улучшена поддержка ELF и добавлена начальная поддержка LTO-оптимизаций LTO.

Улучшения в Clang 3.9:

  • Расширены средства диагностики Clang, позволяющие выявлять больше проблем и более точно формулировать их суть. Добавлено новое предупреждение »-Wcomma», диагностирующее применение встроенного оператора »,», а также предупреждения »-Wfloat-overflow-conversion» и »-Wfloat-zero-conversion» для выявления переполнения при преобразовании числа с плавающей запятой в целое и преобразования ненулевого числа с плавающей запятой в нулевое целое значение;
  • Реализована полная поддержка всех возможностей стандарта OpenCL 2.0, в том числе в новой версии появилась встроенная функция Pipe, поддержка динамического параллелизма, добавлены функции преобразования адресного пространства to_{global/local/private}, поддержка атрибута nosvm и pragma opencl_unroll_hint. Также улучшены средства диагностики и генерации блоков Clang, используемых в коде ядра OpenCL;
  • Реализованы все возможности стандарта OpenMP 4.5 (Open Multi-Processing), предоставляющего средства для применения методов параллельного программирования в программах на языках Си и Си++, за исключение средств для привлечения дополнительных аппаратных обработчиков (offloading). Значительно улучшено качество генерации конструкций OpenMP, что позволило получать на выходе заметно более быстрый и стабильный код;
  • Добавлена поддержка фреймворка RenderScript (включается опцией »-x renderscript» или при обработке файлов с расширением ».rs»);
  • Расширена экспериментальная поддержка будущего стандарта C++1z, (-std=c++1z), например, добавлены атрибуты [[fallthrough]], [[nodiscard]] и [[maybe_unused]], реализована возможность объединённой инициализации классов с базовыми классами;
  • В статический анализатор добавлена проверка некорректного использования MPI API в C и C++, добавлены проверки утечек памяти и обращений к уже освобождённым блокам на платформе Windows. В состав включена экспеиментальная реализация утилиты scan-build, переписанная на языке Python.
  • Добавлен новый интструмент clang-include-fixer, позволяющий автоматически вставить недостающие директивы »#include»;
  • В linter clang-tidy добавлена большая порция новых проверок;

Основные новшества LLVM 3.9:

  • Компоновщик LLD доведён до рабочего состояния и теперь может связывать реальные приложения в формате ELF, включая сам LLVM и Clang, а также большинство приложений пространства пользователя FreeBSD. В LLD также добавлена поддержка оптимизации на этапе связывания (LTO) и объединение идентичных блоков кода. В дополнение к ранее поддерживаемым арзитектурам x86, x86–64, MIPS, PowerPC и PPC64 добавлена поддержка ARM/Thumb, x32 ABI и MIPS N64 ABI;
  • Обеспечена совместимость с GCC ABI. Многие дистрибутивы Linux (Fedora, Debian, Ubuntu) перешли на использование нового GCC ABI для обхода несовместимостей с C++11 в libstdc++, что, в свою очередь, обернулось появлением несовместимостей с другими компиляторами, в том числе с Clang. В LLVM 3.9 добавлены патчи для решения возникших проблем;
  • Добавлена поддержка ThinLTO для выполнения оптимизации на этапе связывания, который может быть активирован при компиляции и связывании с опцией »-flto=thin». При использовании ThinLTO LTO-оптимизация разделён на три части: генерация промежуточного кода на этапе компиляции, запуск плагина Thin в компоновщике для комбинирования суммарных данных и выполнения общего анализа, и применение бэкенда ThinLTO для применения оптимизаций в параллельном режиме;
  • Внесены многочисленные улучшения в бэкенды для архитектур ARM, AArch64, MIPS и PowerPC. В том числе добавлена поддержка процессоров Qualcomm Kryo, Broadcom Vulcan и Cortex-R8;
  • Для архитектуры x86 добавлена поддержка CPU Intel под кодовыми именами Skylake Server и Knights Landing, примечательных наличием инструкций AVX-512;
  • В бэкенд AMDGPU добавлена поддержка образов шейдеров OpenGL, хранилища буферов, атомарных счётчиков и вычислительных расширений шейдеров. Прекращена поддержка Mesa 11.0.x (требуется Mesa 12);
  • Прекращена поддержка сборочной системы autoconf в пользу CMake. Для сборки LLVM теперь требуется CMake 3.4.3 или более новая версия.

© OpenNet