После шести месяцев разработки представлен (http://lists.llvm.org/pipermail/llvm-dev/2019-March/131157.html) релиз проекта LLVM 8.0 (http://llvm.org/) (Low Level Virtual Machine) - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы. Из новых возможностей LLVM 8.0 отмечается включение защиты от атак Spectre, поддержка распараллеленной компиляции в ORC JIT, стабилизация компиляции в WebAssembly, добавление в Clang опции для инициализации автоматически распределяемых переменных, улучшение предкомпиляции и поддержка флага /Zc:dllexportInlines в clang-cl, поддержка архитектуры RISC-V в компоновщике lld, расширение средств диагностики.
Улучшения (http://releases.llvm.org/8.0.0/tools/clang/docs/ReleaseNotes...) в Clang 8.0:
- Добавлена возможность инициализации автоматически распределяемых переменных (https://en.wikipedia.org/wiki/Automatic_variable) (например, локальных переменных, определённых внутри конструкций). По умолчанию автоматические переменные остаются неинициализированными. Инициализация осуществляется при указании опции "-ftrivial-auto-var-init=pattern" и позволяет избавиться от некоторых форм неопределённого поведения, вызванных заполнением переменных случайными остаточными данными из стека и регистров. Для принудительного отключения инициализации, например, для больших массивов, предусмотрен атрибут "dont_initialize_me";
- Добавлена поддержка файлов повторного сопоставления данных профилировния (profile-remapping (http://releases.llvm.org/8.0.0/tools/clang/docs/UsersManual....)), которые позволяют сопоставить символьные имена и данные профилирования для использования ранее сгенерированных профилей выполнения с другой версией программы с изменёнными таблицами символов (например, из-за переименования класса или пространства имён);
- Добавлены новые диагностические опции: "-Wextra-semi-stmt" для выявления лишних ";" и "-Wempty-init-stmt" для выявления пустых блоков инициализации в конструкциях if, switch и for;
- Помимо ранее добавленной защиты Retpoline в состав включены изменения (http://releases.llvm.org/8.0.0/docs/SpeculativeLoadHardening...) для генерации последовательностей инструкций для получения данных из памяти с блокированием утечек, вызванных спекулятивным выполнением инструкций в современных 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), детектора неопределенного поведения (http://ru.wikipedia.org/wiki/%D0%9D%D0%B...), выявляющего во время выполнения программы ситуации, когда поведение программы становится неопределенным. Расширен спектр ситуаций, охватываемых в режиме "-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 с обращающимися к памяти операндами для упреждающей загрузки в кэш (https://lists.llvm.org/pipermail/llvm-dev/2018-November/1274...) (cache prefetching (https://en.wikipedia.org/wiki/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.
URL: http://lists.llvm.org/pipermail/llvm-dev/2019-March/131157.html
Новость: https://www.opennet.dev/opennews/art.shtml?num=50360