Релиз набора компиляторов 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