После шести месяцев разработки подготовлен (http://lists.llvm.org/pipermail/llvm-announce/2017-March/000... релиз проекта LLVM 4.0 (http://llvm.org/) (Low Level Virtual Machine) - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.
LLVM 4.0 стал первым выпуском в рамках новой нумерации версий (https://www.opennet.ru/opennews/art.shtml?num=45690), в которой решено уйти от разделения значительных и функциональных выпусков. Отныне в каждом функциональном обновлении будет меняться первая цифра (в сентябре состоится релиз LLVM 5.0.0, весной следующего года 6.0.0 и т.д.). Для обеспечения совместимости с существующими системами разбора номеров версий LLVM корректирующие обновления, как и раньше будут приводить к увеличению третьей цифры (4.0.1, 4.0.2, 4.0.3).
Из новых возможностей LLVM 4.0 отмечается использование статистики выполнения в оптимизаторе ThinLTO, более агрессивное устранение бесполезного кода, экспериментальная поддержка сопрограмм, экспериментальная поддержка целевой платформы AVR, улучшение совместимости с GNU ld и значиетельное увеличение производительности компоновщика LLD.
Улучшения (http://releases.llvm.org/4.0.0/tools/clang/docs/ReleaseNotes... в Clang 4.0:
- Добавлен атрибут diagnose-if (http://releases.llvm.org/4.0.0/tools/clang/docs/AttributeRef... позволяющем выводить предупреждения или ошибки, если вызов функции соответствует одному или нескольким условиям, определённым пользователем. Например:
void abs(int a)
__attribute__((diagnose_if(a >= 0, "Redundant abs call", "warning")));
- Расширены средства девиртуализации (https://ru.wikipedia.org/wiki/%D0%A2%D0%... (замена непрямых вызовов на условное выполнение развёрнутых inline-блоков) при помощи новой опции "-fstrict-vtable-pointers (http://releases.llvm.org/4.0.0/tools/clang/docs/UsersManual....
- В оптимизатор ThinLTO (http://blog.llvm.org/2016/06/thinlto-scalable-and-incrementa... ("-flto=thin"), работающий на этапе связывания, добавлена поддержка учёта данных профилирования (PGO (https://ru.wikipedia.org/wiki/Profile-guided_optimization), Profile-guided optimization), накопленных в процессе выполнения программы, для более точного принятия решений об импортировании функций и продвижения косвенных вызовов между различными модулями. При включении отладочного режима (-g) существенно сокращено время сборки и уменьшен размер исполняемого файла;
- Представлен новый флаг компиляции "-Og", позволяющий выполнить оптимизацию с сохранением удобства отладки (в текущей версии опция аналогична применению режима "-O1";
- Добавлена опция "-MJ" для вывода БД компиляции в формате JSON для интеграции с существующими системами сборки;
- Устранена порция ошибок в реализации OpenCL и добавлено новое OpenCL-расширение cl_khr_mipmap_image. Добавлен флаг "-cl-ext" для переопределения списка расширений, компилируемых для выбранной целевой платформы. Добавлены pragma OPENCL EXTENSION the_new_extension_name : begin/end для добавления собственных расширений OpenCL без правки кола Clang. В документацию Clang включено руководство (http://releases.llvm.org/4.0.0/tools/clang/docs/UsersManual.... по OpenCL;
- В статическом анализаторе улучшена поддержка кода, использующего gtest. Добавлена опция "--show-description" для вывода описаний дефектов в списке scan-build. Добавлены новые проверки: предупреждение при виртуальных вызовах из конструкторов и деструкторов, проверка синхронизированных копий свойств mutable-типов в Objective C, таких как NSMutableArray, проверка нежелательных сравнений NSNumber, CFNumberRef и других числовых объектов Cocoa со скалярными значениями;
- В linter clang-tidy добавлена (http://releases.llvm.org/4.0.0/tools/clang/tools/extra/docs/... большая порция новых проверок. В include-fixer обеспечена интеграция с Emacs;
Основные новшества (http://llvm.org/releases/4.0.0/docs/ReleaseNotes.html) LLVM 4.0:
- Добавлена экспериментальная поддержка сопрограмм (http://releases.llvm.org/4.0.0/docs/Coroutines.html), активируемая при указании опции "-enable-coroutines" или через API addCoroutinePassesToExtensionPoints;
- Повышены требования к минимальным версиям компиляторов. Для сборки LLVM теперь необходимы как минимум GCC 4.8 и Visual Studio 2015;
- Обеспечена обработка invariant.group для различных базовых блоков, что сделало возможным выполнение девиртуализации виртуальных вызовов внутри циклов;
- В фазе агрессивного удаления мёртвого кода (https://ru.wikipedia.org/wiki/%D0%9C%D1%... (adce) реализовано удаление веток, не влияющих на поведение программы. Циклы оставляются по умолчанию, но они могут быть удалены при явном указании опции "-adce-remove-loops", если тело цикла не включает значимых операций.
- В утилиту llvm-cov добавлена возможность экспорта coverage-статистики в формате JSON. Кроме того, также улучшен вывод в формате HTML;
URL: http://lists.llvm.org/pipermail/llvm-announce/2017-March/000...
Новость: http://www.opennet.ru/opennews/art.shtml?num=46181