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

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

Из новых возможностей LLVM 8.0 отмечается включение защиты от атак Spectre, поддержка распараллеленной компиляции в ORC JIT, стабилизация компиляции в WebAssembly, добавление в Clang опции для инициализации автоматически распределяемых переменных, улучшение предкомпиляции и поддержка флага /Zc: dllexportInlines в clang-cl, поддержка архитектуры RISC-V в компоновщике lld, расширение средств диагностики.

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

  • Добавлена возможность инициализации автоматически распределяемых переменных (например, локальных переменных, определённых внутри конструкций). По умолчанию автоматические переменные остаются неинициализированными. Инициализация осуществляется при указании опции »-ftrivial-auto-var-init=pattern» и позволяет избавиться от некоторых форм неопределённого поведения, вызванных заполнением переменных случайными остаточными данными из стека и регистров. Для принудительного отключения инициализации, например, для больших массивов, предусмотрен атрибут «dont_initialize_me»;
  • Добавлена поддержка файлов повторного сопоставления данных профилировния (profile-remapping), которые позволяют сопоставить символьные имена и данные профилирования для использования ранее сгенерированных профилей выполнения с другой версией программы с изменёнными таблицами символов (например, из-за переименования класса или пространства имён);
  • Добавлены новые диагностические опции:»-Wextra-semi-stmt» для выявления лишних »;» и »-Wempty-init-stmt» для выявления пустых блоков инициализации в конструкциях if, switch и for;
  • Помимо ранее добавленной защиты Retpoline в состав включены изменения для генерации последовательностей инструкций для получения данных из памяти с блокированием утечек, вызванных спекулятивным выполнением инструкций в современных CPU. Защита может быть выборочно включена или отключена для определённых функций через указание атрибутов speculative_load_hardening и no_speculative_load_hardening, а также включена глобально при помощи опции »-mspeculative-load-hardening»;
  • Добавлены опции »-fprofile-filter-files=[regexes]» и »-fprofile-exclude-files=[regexes]» для выборочной фильтрации или исключения определённых файлов с данными профилирования в формате gcov;
  • В clang-cl, альтернативном интерфейсе командной строки, обеспечивающем совместимость на уровне опций с компилятором cl.exe из состава Visual Studio, добавлена поддержка опций »/Yc» и »/Yu» для предварительной компиляции заголовочных файлов. Добавлена поддержка флага »/Zc: dllexportInlines», аналогичного флагу »-fvisibility-inlines-hidden», для неприменения атрибутов dllexport и dllimport к inline-функциям;
  • Обеспечена возможность использования инструментов Address Sanitizer и Undefined Behaviour Sanitizer с MinGW;
  • Расширены возможности, связанные с поддержкой OpenCL, OpenMP и CUDA. В том числе добавлены некоторые новые возможности OpenMP 5.0 и расширены средства диагностики;
  • Расширены возможности UBSan (Undefined Behavior Sanitizer), детектора неопределенного поведения, выявляющего во время выполнения программы ситуации, когда поведение программы становится неопределенным. Расширен спектр ситуаций, охватываемых в режиме »-fsanitize=implicit-conversion» (Implicit Conversion Sanitizer), например, добавлено выявление проблем с составными операторами присваивания и обеспечено определение неявных изменений знака целых чисел (»-fsanitize=implicit-integer-sign-change»). При проверке выравнивания теперь выполняется проверка атрибутов, подобных «assume_aligned»;

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

  • Снят флаг экспериментальной разработки с целевой платформы WebAssembly, поддержка которой теперь включена по умолчанию и не требует указания опции LLVM_EXPERIMENTAL_TARGETS_TO_BUILD. В разряд стабильных также переведены формат объектных файлов и C ABI для платформы WebAssembly. Экспериментальной пока остаётся только поддержка многопоточности в WebAssembly;
  • В утилиту llvm-cov добавлена опция »-format=lcov» для экспорта coverage-статистики в формате lcov;
  • Добавлена опция »-x86-discriminate-memops», использующая отладочную информацию для точной идентификации инструкций x86 с обращающимися к памяти операндами для упреждающей загрузки в кэш (cache prefetching);
  • В libFuzzer добавлена поддержка платформы Windows (x86_64);
  • JIT API для компиляции по запросу (ORC, On Request Compilation) добавлена поддержка параллельной компиляции. Старый однопоточный API объявлен устаревшим, переименован в LegacyIRCompileLayer и будет удалён в LLVM 9. На основе нового API реализован демонстрационный JIT LLJIT. Поддержка MCJIT и ExecutionEngine будет продолжена, но для новых проектов ORC отмечен как предпочтительный JIT API;
  • В отладчике LLDB обеспечена подсветка синтаксиса выводимого кода на языке Си. В команде «expression» обеспечено автодополнение ввода табуляцией;
  • В бэкенд для архитектуры x86 добавлена поддержка CPU AMD bdver2 на базе микроархитектуры Piledriver. Для указания в опции »-march» добавлен новый идентификатор CPU «cascadelake», идентичный skylake-avx512 с включением дополнительного набора инструкций avx512vnni. Прекращена подстановка инструкции ADCX, которая мало чем отличается от инструкции ADC, но увеличивает размер кода;
  • Внесены многочисленные улучшения в бэкенды для архитектур AArch64, ARM, SystemZ, Hexagon, MIPS и PowerPC.

© OpenNet