Релиз набора компиляторов LLVM 7.0
После шести месяцев разработки сформирован релиз проекта LLVM 7.0 (Low Level Virtual Machine) — GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
Из новых возможностей LLVM 7.0 отмечается возможность мультиверсионирования функций в Clang, улучшение поддержки предкомпилированных заголовков PCH в clang-cl, предварительная поддержка формата отладочной информации DWARF v5, начальная поддержка NVIDIA PTX для ускорения вычислений в OpenMP 4.5, поддержка OpenCL C++, поддержка MSan, X-Ray и libFuzzer во FreeBSD, начальная поддержка UBSan, X-Ray и libFuzzer в OpenBSD, реализация проверки неявных преобразований в UBSan, решение многих проблем с совместимостью в компоновщике lld, новые инструменты llvm-exegesis, llvm-mca и diagtool, дополнительные оптимизации и средства диагностики.
Улучшения в Clang 7.0:
- В UBSan (Undefined Behavior Sanitizer), детекторе неопределенного поведения, добавлен режим проверки неявных преобразований (»-fsanitize=implicit-conversion»), который пока ограничен выявлением неявных усечений целых значений;
- Доступна экспериментальная поддержка отладочной информации в формате DWARF v5 (включается »-gdwarf-5 -O0»), в том числе новых таблиц ».debug_names»;
- Добавлена поддержка мультиверсионирования функций, техники для включения в результирующий исполняемый файл нескольких реализаций функции, использующих разные специализированные расширенные наборы инструкций. Разные варианты функций определяются при помощи атрибута «target», реализация которого совместима с GCC. Например, выражение '__attribute__((target («arch=atom»)))' позволяет определить отдельный вариант функции, который будет использован на процессорах Atom. Мультиверсионирование пока доступно только для исполняемых файлов ELF и для архитектур x86 и x86–64;
- В clang-cl, альтернативном интерфейсе командной строки, обеспечивающем совместимость на уровне опций с компилятором cl.exe из состава Visual Studio, значительно улучшена поддержка предкомпилированных заголовочных файлов в формате PCH. При использовании файла PCH теперь не генерируются inline-методы, которые уже присутствуют в объектах, собранных вместе с PCH-файлом, что позволяет ускорить сборку с применением PCH примерно на 30%. Также добавлена возможность использования предкомпилированных заголовков для заголовочного файла stdafx.h, предлагаемого по умолчанию в Visual Studio;
- Исполняемый файл компилятора и библиотеки теперь включают только номер значительной версии, т.е. вместо исполняемого файла clang-7.0 предлагается clang-7;
- В состав включена вспомогательная утилита diagtool для манипуляции со средствами диагностики clang, например, для определения иерархии предупреждений и оценки какие из элементов этой иерархии включены по умолчанию или применяются для конкретного вызова компилятора;
- Добавлены новые диагностические опции »-Wc++98-compat-extra-semi»,»-Wextra-semi»,»-Wself-assign» и »-Wself-assign-field»;
- Добавлены новые флаги компилятора:»-fstrict-float-cast-overflow» и »-fno-strict-float-cast-overflow» для управления поведением при преобразовании вещественного значения в целое;»-fforce-emit-vtables» и »-fno-force-emit-vtables» для включения/выключения обязательного inline-развёртывания функций с использованием vtables;»-mcrc» и »-mno-crc» для управления применением MIPS инструкций CRC (Cyclic Redundancy Check);»-mvirt» и »-mno-virt» для управления применением MIPS-расширений виртуализации;»-mginv» и »-mno-ginv» для для управления применением MIPS инструкций GINV (Global INValidate);
- Расширены возможности, связанные с поддержкой OpenCL, OpenMP и CUDA. В том числе в OpenCL реализовано расширение cles_khr_int64 и добавлена опция »-cl-uniform-work-group-size» для применения дополнительной оптимизации на этапе компиляции. Началась реализация поддержки OpenCL C++, добавлены флаги »-std/-cl-std=c++» и поддержка ключевых слов. Добавлена возможность использования OpenMP 4.5 для ускорения вычислений за счёт выноса операций (offloading) на чипы с поддержкой псевдоязыка NVIDIA PTX (Parallel Thread Execution);
- В статический анализатор добавлен новый режим проверки MmapWriteExec для определения попыток маппинга страниц памяти одновременно для записи и исполнения;
- В linter clang-tidy добавлена большая порция новых проверок. Добавлена возможность сохранения результатов в формате JSON для интеграции с внешними системами анализа кода. В состав включены новые модули abseil (для проверки библиотеки Abseil), portability и zircon (для проверки ядра ОС Fuchsia).
Основные новшества LLVM 7.0:
- В компоновщике LLD обеспечена готовая для повсеместного использования поддержка форматов ELF (Unix), COFF (Windows) и MinGW. Например, lld/ELF пригоден для компоновки всех компонентов FreeBSD для архитектур AMD64 и ARMv7, и будет применяться в качестве компоновщика по умолчанию в следующей версии FreeBSD. lld/COFF уже применяется для формирования официальных сборок Chrome и Firefox. Форматы Mach-O (macOS) и WebAssembly пока остаются в категории экспериментальных;
- В UBsan, инструментарии X-Ray и библиотеке libFuzzer реализована начальная поддержка OpenBSD (x86 и x86_64);
- В MSan (x86_64), инструментарии X-Ray и libFuzzer (x86 и x86_64) обеспечена поддержка FreeBSD;
- Из установочного пакета для Windows исключены компоненты для интеграции с Visual Studio, которые вынесены в отдельное расширение «LLVM Compiler Toolchain Visual Studio», размещённое в каталоге приложений Visual Studio Marketplace;
- Добавлена новая утилита llvm-exegesis для автоматического измерения производительности выполнения машинных инструкций;
- Добавлена новая утилита llvm-mca для прогнозирования производительности машинного кода для указанного CPU;
- Проведена оптимизация преобразования вещественных чисел в значения других типов;
- Реализована возможность профилирования кода, оптимизированного при помощи JIT, при помощи утилиты perf;
- Внесены многочисленные улучшения в бэкенды для архитектур X86, AArch64, ARM, SystemZ, Hexagon, MIPS и PowerPC.
© OpenNet