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

После года разработки состоялся релиз свободного набора компиляторов GCC 7.1, первый значительный выпуск в новой ветке GCC 7.x. Релиз приурочен к 30-летию с момента формирования первого выпуска GCC 1.0. В соответствии с новой схемой нумерации выпусков, версия 7.0 использовалась в процессе разработки, а незадолго до выхода GCC 7.1 уже ответвилась ветка GCC 8.0, на базе которой будет сформирован следующий значительный релиз GCC 8.1.

GCC 7.1 примечателен удалением из состава компилятора для языка Java, реализацией экспериментальной поддержки грядущего стандарта C++17, расширением средств диагностики, реализацией новых оптимизаций, поддержкой OpenMP 4.5 для GPGPU NVidia PTX, поддержкой набора инструкций RISC-V, поддержкой операционной системы Fuchsia.

Основные изменения:

  • Во фронтэнде для языка С++ реализована экспериментальная поддержка всех возможностей черновика стандарта C++17. Для включения следует использовать опции »-std=c++1z» и »-std=gnu++1z». В библиотеку libstdc++ также добавлены почти все возможности, представленные в C++17;
  • Существенно расширены средства диагностики ошибок, добавлены новые предупреждения, улучшено отслеживание местоположения переменных и вхождение в диапазон допустимых значений. Существенно расширена система рекомендации по устранению проблем (например, предупредит о »%s» в printf, если значение «i + j») и предложений по замене опечаток в идентификаторах (gtk_widget_showall => gtk_widget_show_all), типах (singed => signed), макросах (array[MAX_ITEM] => array[MAX_ITEMS]) и директивах препроцессора endfi => endif);
  • Многочисленные улучшения оптимизаций: добавлены новые оптимизации во время динамического связывания, межпроцедурные и внутрепроцедурные оптимизации. Реализованы дополнительные методы слияния стадий компиляции, выноса операций за пределы циклов, разбиения циклов на части;
  • В Address Sanitizer добавлен отчёт об использовании переменных;
  • Добавлена возможность использования OpenMP 4.5 для ускорения вычислений за счёт выноса операций (offloading) на специализированные процессоры NVIDIA PTX;
  • При использовании опции »-fverbose-asm» в комментариях к ассемблерному коду приводятся ссылки на строки в файле и куски Си-кода из которых были сгенерированы данные ассемблерные выражения;
         # example.c:7:     total += i * i;         movl    %edx, %ecx      # i, tmp92         imull   %edx, %ecx      # i, tmp92 
  • Из состава GCC удалены все компоненты компилятора GCJ (GNU Compiler For Java). Инициатива по удалению GCJ стартовала ещё в 2013 году и связана с запущенным состоянием GCJ, который много лет не развивается (полностью поддерживается только Java 1.2) и содержит ряд проблем, мешающих применению GCJ на практике. Кроме того, смысл существования GCJ стал неоправдан после сосредоточения разработки открытых компонентов Java в проекте OpenJDK, который также распространяется под лицензией GPL;
  • Для новых целевых платформ (PowerPC, SPARC) задействован по умолчанию новый механизм распределения регистров LRA (Local Register Allocator), реализующий метод рематериализации, при котором вместо сохранения значения регистра при необходимости используется его повторное вычисление;
  • Режим профилирования libstdc++ объявлен устаревшим и будет удалён в будущих выпусках;
  • Объявлен устаревшим Cilk+, набор расширений для языков Си и Си++ с реализацией предложенной компанией Intel методики параллельного программирования;
  • Добавлена поддержка формата отладочной информации DWARF 5 (опция -gdwarf-5). По умолчанию по-прежнему используется DWARF 4;
  • Добавлена поддержка обработки файлов в бинарном формате BRIG 1.0, предназначенном для использования с языком HSAIL (Heterogeneous System Architecture Intermediate Language). В состав включена runtime-библиотека libhsail-rt для HSAIL. GCC-фронтэнд для BRIG может использоваться для реализации финализаторов HSAIL (вариант HSAIL, скомпилированный для заданных процессоров);
  • В генератор кода в виде разделяемой библиотеки libgccjit (для встраивания в другие процессы и использования для организации JIT-компиляции байткода в машинный код) добавлена возможность передачи через API диагностической информации о выявленных проблемах в коде;
  • Добавлена поддержка AArch64-архитектур ARMv8.2-A и ARMv8.3-A (-march=armv8.3-a), а также процессоров ARM Cortex-A73 (cortex-a73), Broadcom Vulcan (vulcan), Cavium ThunderX CN81xx (thunderxt81), Cavium ThunderX CN83xx (thunderxt83), Cavium ThunderX CN88xx (thunderxt88), Cavium ThunderX CN88xx (thunderxt88p1), Cavium ThunderX 2 CN99xx (thunderx2t99) и Qualcomm Falkor (falkor);
  • Добавлена поддержка новых процессоров ARM: ARM Cortex-A73 (cortex-a73), ARM Cortex-M23 (cortex-m23) и ARM Cortex-M33 (cortex-m33). Добавлена поддержка архитектуры ARMv8-M в двух профилях ARMv8-M Baseline и ARMv8-M Mainline (с DSP и расширениями с для вычислений с плавающей запятой). Переведены в разряд устаревших архитектуры ARMv5 и ARMv5E (поддержка ARMv5T, ARMv5TE и ARMv5TEJ сохранена).
  • Для архитектуры x86–64 добавлена поддержка расширений AVX-512: 4FMAPS (Fused Multiply Accumulation Packed Single precision), 4VNNIW (Vector Neural Network Instructions Word variable precision), VPOPCNTDQ (Vector Population Count) и SGX (Software Guard Extensions);
  • Добавлена поддержка набора инструкций RISC-V;
  • Добавлена поддержка операционной системы Fuchsia, которую развивает компания Google;

© OpenNet