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

19 сентября 2018 года

После шести месяцев разработки сформирован релиз проекта 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.

Источники править


 
 
Creative Commons
Эта статья содержит материалы из статьи «Релиз набора компиляторов LLVM 7.0», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots в архив и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.