После года разработки состоялся релиз свободного набора компиляторов GCC 6.1, первый значительный выпуск в новой ветке GCC 6.x. В соответствии с новой схемой нумерации выпусков, версия 6.0 использовалась в процессе разработки, а незадолго до выхода GCC 6.1 уже ответвилась ветка GCC 7.0, на базе которой будет сформирован следующий значительный релиз GCC 7.1.
GCC 6.1 примечателен применением в компиляторе C++ по умолчанию стандарта C++14 вместо ранее предлагаемого C++98, улучшением экспериментальной поддержки C++17, расширением средств диагностики, полной поддержкой OpenMP 4.5, новыми оптимизациями, поддержка системной библиотеки musl, улучшением поддержки платформ ARM, поддержкой процессоров AMD Zen (17 поколение CPU AMD), Intel Skylake, IBM z13 и IBM POWER 9.
Основные изменения:
Для языка C++ по умолчанию активировано использование стандарта C++14 (применяется режим "-std=gnu++14" вместо "-std=gnu++98"). Добавлена поддержка расширения системы шаблонов C++ Concepts, активируемая опцией "-fconcepts". Реализованы некоторые новые элементы будущего стандарта C++17, такие как выражения fold, символьные литералы u8, расширенный static_assert и вложенное определение пространств имён. Реализована возможность вычисления констант для всех бестиповых аргументов шаблонов. Добавлена поддержка транзакционной памяти (C++ Transactional Memory) при сборке с опцией "-fgnu-tm";
В runtime-библиотеке libstdc++ расширен набор специальных математических функций (ISO/IEC 29124:2010), добавлена экспериментальная поддержка стандарта C++17 (в том числе новые функции std::size, std::empty, std::data для контейнеров и массивов, std::uncaught_exceptions, std::invoke, std::shared_mutex, std::void_t и std::bool_constant), экспериментальная поддержка File System TS, экспериментальная поддержка второй версии Library Fundamentals TS, поддержка std::locale для DragonFly и FreeBSD;
Добавлена поддержка Си-библиотеки musl, которую можно использовать на Linux-системах с архитектурой AArch64, ARM, MicroBlaze, MIPS, MIPS64, PowerPC, PowerPC64, SH, i386, x32 и x86_64. Поддержка включается опцией "-mmusl" или при выборе архитектуры по маске "*-linux-musl*";
Многочисленные улучшения в оптимизаторе, работающем во время динамического связывания (Link-time optimization). Расширена информация о типах, сохраняемая во время связывания, что позволило повысить качество анализа псевдонимов. Добавлен режим "-Wodr-type-mismatch", включающий вывод предупреждений о проблемах с типизацией глобальных переменных и деклараций. Cокращён размер объектных файлов LTO (при тестировании сборкой Firefox 46.0 размер уменьшился на 11%). Значительно сокращён размер промежуточных данных в режиме параллелизации во время связывания (при тестировании в Firefox 46.0 отмечается сокращение размера передаваемых данных на 66%). В плагине linker расширена передача информации о типе бинарного файла, генерируемого бэкендом GCC, что позволяет увеличить качество настройки генератора кода и реализовать возможность инкрементальной компоновки;
Улучшение межпроцедурных оптимизаций. Во время клонирования функций задействован более агрессивный метод чистки неиспользуемых параметров функций. Выполнение базовой оптимизации jump threading теперь производится до профилирования конструкций и inline-анализа, что позволяет более точно предсказать время и размер для последующих фаз развёртывания кода и клонирования функций;
В детекторе неопределенного поведения (Undefined Behavior Sanitizer), выявляющего ситуации, когда поведение программы становится неопределенным (зависит от реализации компилятора) из-за ошибки программиста, реализован режим "-fsanitize=bounds-strict", обеспечивающий строгую проверку соблюдения границ массива с использованием дополнительных методов оценки записей в массиве;
Система контроля диапазонов значений (Value range propagation) теперь полагает, что указатели this в функциях C++ не могут иметь значение NULL, что позволяет избавиться от типовых проверок на NULL, но создаёт проблемы с некоторыми кодовыми базами, такими как Qt-5, Chromium и KDevelop. Для выявления проблемного кода следует использовать режим "-fsanitize=undefined", а для возврата NULL-проверок можно установить опцию "-fno-delete-null-pointer-checks";
В анализаторе псевдонимов (Alias analysis), выявляющем обращения из разных мест к одним и тем же данным, обеспечена корректная поддержка атрибутов weakref и alias, что делает возможным организовать доступ к переменной и её псевдониму в рамках одной транзакции во время оптимизации;
Значительно расширена поддержка спецификации параллельного программирования OpenACC 2.0a, определяющей средства для выноса операций на плечи GPU. Добавлена начальная поддержка параллельного выполнения ядер OpenACC. Для выноса вычислений могут быть задействованы GNU NVIDIA PTX на Linux-системах с процессорами x86_64 и PowerPC. Поддерживается распараллеливание с запуском до 32 обработчиков и 32 векторов;
В компиляторах C и C++ полностью реализована спецификация OpenMP 4.0 (Open Multi-Processing), позволяющая ускорить вычисления за счёт выноса операций (offloading) на специализированные процессоры Intel XeonPhi Knights Landing и AMD HSAIL;
Начальная поддержка гетерогенных вычислительных систем на базе архитектуры HSA. Реализована возможность генерации промежуточного языка HSAIL (Heterogeneous System Architecture Intermediate Language) для простых устройств OpenMP при сборке с опцией "--enable-offload-targets=hsa". Добавлен плагин libgomp, позволяющий запустить ядра HSA GPU на GPU, совместимых с HSA;
Расширены средства сборки генератора кода в форме разделяемой библиотеки libgccjit для встраивания в другие процессы и использования для организации JIT-компиляции байткода в машинный код;
Объявлена устаревшей поддержка старых архитектур ARM, предшествующих ARMv4t: arm2, arm250, arm3, arm6, arm60, arm600, arm610, arm620, arm7, arm7d, arm7di, arm70, arm700, arm700i, arm710, arm720, arm710c, arm7100, arm7500, arm7500fe, arm7m, arm7dm, arm7dmi, arm8, arm810, strongarm, strongarm110, strongarm1100, strongarm1110, fa526, fa626. В будущем поддержка данных систем будет прекращена;
Добавлена поддержка новых процессоров ARM: ARM Cortex-A32 (cortex-a32), ARM Cortex-A35 (cortex-a35);
Улучшения для процессоров IA-32/x86-64: Добавлена поддержка процессоров AMD Zen (-march=znver1 и -mtune=znver1) и Intel Skylake с расширениями AVX-512 (-march=skylake-avx512) AVX-512F, AVX512VL, AVX-512CD, AVX-512BW и AVX-512DQ. Добавлена поддержка инструкций monitorx и mwaitx, используемых в CPU AMD. Добавлена поддержка адресных пространств __seg_fs, __seg_gs и __seg_tls;
Начальная поддержка процессоров POWER9, использующих набор инструкций OpenPOWER ISA 3.0. Для систем PowerPC64 обеспечена поддержка 128-разрядных чисел с плавающей запятой (IEEE 128-bit floating-point) с использованием типа __float128 ("-mfloat128");
Добавлена поддержка процессоров IBM z13 (-march=z13), используемых в новых платформах IBM z Systems;
Расширены возможности порта AArch64 и добавлены специфичные для данной архитектуры опции. На системах GNU/Linux AArch64 реализована поддержка опций "-march=native" и "-mcpu=native", при которых GCC сам определяет тип CPU и выбирает набор оптимальных настроек. Реализована поддержка опций "-mtls-size=" и "-fno-plt". Добавлена поддержка архитектуры ARMv8.1-A ("-march=armv8.1-a"), процессора ARM Cortex-A35 ("-mcpu=cortex-a35", "-mtune=cortex-a35") и расширений для крупных систем (Large System Extensions). Улучшена генерация кода для процессоров ARM Cortex-A53 и Samsung Exynos M1;
В разряд устаревших переведены платформы SH5 / SH64 (sh64-*-*) и MeP (mep-elf).
|