После шести месяцев разработки сформирован (http://lists.llvm.org/pipermail/llvm-announce/2018-September... релиз проекта LLVM 7.0 (http://llvm.org/) (Low Level Virtual Machine) - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы. Из новых возможностей LLVM 7.0 отмечается возможность мультиверсионирования функций в Clang, улучшение поддержки предкомпилированных заголовков PCH (https://en.wikipedia.org/wiki/Precompiled_header) в 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, дополнительные оптимизации и средства диагностики.
Улучшения (http://releases.llvm.org/7.0.0/tools/clang/docs/ReleaseNotes... в Clang 7.0:
- В UBSan (Undefined Behavior Sanitizer), детекторе неопределенного поведения (http://ru.wikipedia.org/wiki/%D0%9D%D0%B... добавлен режим проверки неявных преобразований ("-fsanitize=implicit-conversion"), который пока ограничен выявлением неявных усечений целых значений;
- Доступна экспериментальная поддержка отладочной информации в формате DWARF v5 (включается "-gdwarf-5 -O0"), в том числе новых таблиц ".debug_names";
- Добавлена поддержка мультиверсионирования функций, техники для включения в результирующий исполняемый файл нескольких реализаций функции, использующих разные специализированные расширенные наборы инструкций. Разные варианты функций определяются при помощи атрибута "target (http://releases.llvm.org/7.0.0/tools/clang/docs/AttributeRef... реализация которого совместима с 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 (http://en.wikipedia.org/wiki/Parallel_Thread_Execution) (Parallel Thread Execution);
- В статический анализатор добавлен новый режим проверки MmapWriteExec для определения попыток маппинга страниц памяти одновременно для записи и исполнения;
- В linter clang-tidy добавлена (http://releases.llvm.org/7.0.0/tools/clang/tools/extra/docs/... большая порция новых проверок. Добавлена возможность сохранения результатов в формате 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 (http://releases.llvm.org/7.0.0/docs/CommandGuide/llvm-exeges... для автоматического измерения производительности выполнения машинных инструкций;
- Добавлена новая утилита llvm-mca (http://releases.llvm.org/7.0.0/docs/CommandGuide/llvm-mca.html) для прогнозирования производительности машинного кода для указанного CPU;
- Проведена оптимизация преобразования вещественных чисел в значения других типов;
- Реализована возможность профилирования кода, оптимизированного при помощи JIT, при помощи утилиты perf;
- Внесены многочисленные улучшения в бэкенды для архитектур X86, AArch64, ARM, SystemZ, Hexagon, MIPS и PowerPC.
URL: http://lists.llvm.org/pipermail/llvm-announce/2018-September...
Новость: https://www.opennet.ru/opennews/art.shtml?num=49299