Релиз набора компиляторов LLVM 8.0
20 марта 2019 года
После шести месяцев разработки представлен релиз проекта 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";
- Расширены возможности кеширующего сервера clangd (Clang Server), например, добавлена поддержка глобального для всех файлов проекта индекса, обеспечено добавление спецификаторов пространств имён при автодополнении кода, предложен индекс экспортируемых символов, добавлено расширение LSP;
- В linter clang-tidy добавлена большая порция новых проверок.
Основные новшества LLVM 8.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" обеспечено автодополнение ввода табуляцией;
- В libc++ прекращена поддержка macOS 10.6 и удалены типы std::dynarray и std::bad_array_length, не вошедшие в стандарт C++;
- В компоновщике LLD добавлена поддержка архитектуры RISC-V и начальная поддержка ISA MSP430. Добавлены новые флаги: "--call-graph-profile", "--no-call-graph-profile", "--warn-ifunc-textrel", "-z interpose", "-z global", "-z nodefaultlib". При компоновке ELF-файлов сегмент ".note" теперь помещается в первую страницу генерируемого файла для упрощения доступа к важной информации (например .note.gnu.build-id) в core-файлах, даже в случае их усечения по размеру. Добавлена начальная поддержка создания разделяемых библиотек для WebAssembly;
- В бэкенд для архитектуры x86 добавлена поддержка CPU AMD bdver2 на базе микроархитектуры Piledriver. Для указания в опции "-march" добавлен новый идентификатор CPU "cascadelake", идентичный skylake-avx512 с включением дополнительного набора инструкций avx512vnni. Прекращена подстановка инструкции ADCX, которая мало чем отличается от инструкции ADC, но увеличивает размер кода;
- Внесены многочисленные улучшения в бэкенды для архитектур AArch64, ARM, SystemZ, Hexagon, MIPS и PowerPC.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.