После года разработки и спустя 25 лет после основания проекта представлен релиз новой ветки свободного набора компиляторов GCC 4.7, развиваемого проектом GNU. В новой версии реализованы новые методы оптимизации, прекращена поддержка устаревших систем, расширена поддержка стандартов C++11 и C11, реализована поддержка OpenMP 3.1 и транзакционных блоков для C/C++, улучшена поддержка языка Google Go, обеспечена поддержка процессоров ARM Cortex-A7, Intel Ivy Bridge, Intel Haswell и AMD Fusion Piledriver.
Основные изменения:
-
Общие нюансы:
- Объявлены устаревшими и будут удалены в следующих выпусках порты IRIX 6.5 (mips-sgi-irix6.5), MIPS OpenBSD (mips*-*-openbsd*), Solaris 8 (*-*-solaris2.8) и Tru64 UNIX V5.1 (alpha*-dec-osf5.1*).
- Переведены в разряд устаревших порты ARM, поддерживающие только устаревший акселератор вычислений с плавающей запятой (FPA) и смешанный формат кодирования чисел с плавающей запятой. Большинство портов для устаревших систем ARM будет сохранено, так как они поддерживают альтернативный формат кодирования чисел с плавающей запятой (VFP). Среди подлежащих скорому удалению портов, для которых есть остающиеся в составе альтернативы: arm*-*-rtems (замена arm*-*-rtemseabi), arm*-*-linux-gnu (замена arm*-*-linux-gnueabi), arm*-*-elf (замена arm*-*-eabi), arm*-*-uclinux* (замена arm*-*-uclinux*eabi). Устаревшие порты для которых нет замены на базе VFP: arm*-*-ecos-elf, arm*-*-freebsd, arm*-wince-pe*;
- Объявлена устаревшей поддержка сопроцессора Maverick для ARM
- Удалена поддержка конфигурации для NetWare x86;
- Убрана поддержка архитектур, объявленных устаревшими в GCC 4.6.0;
-
Улучшения в оптимизации кода:
- Улучшение фреймворка оптимизации во время динамического связывания (LTO - Link Time Optimization) - проведена работа по увеличению масштабируемости, повышению стабильности и сокращению потребления ресурсов. Например, для использование LTO для Firefox на 64-разрядной системе достаточно 3 Гб ОЗУ, в то время как ранее требовалось 8 Гб.
- Ускорены операции связывания (linking). Например, связывание компонентов Firefox ускорилось в 10 раз). Сокращён размер объектных файлов и уменьшено дисковое пространство, необходимое для хранения временных данных в процессе связывания;
- Улучшены эвристические методы inlinе-раскрытия функций, дополнительно учитывающие известные значения параметров функции. Например, для кода void foo(int a) { if (a>10) ... много кода ... } void bar (void) { foo (0); } код функции foo будет развёрнут внутри bar, даже в ситуации вколчения режима оптимизации по размеру (изначально известно что блок "много кода" при нулевом аргументе никогда не будет вызван).
- Улучшены внутрипроцедурные оптимизации размещения констант. Например, при компиляции кода void foo(bool flag) { if (flag) ... do something ... else ... do something else ... } void bar (void) { foo (false); foo (true); foo (false); foo (true); foo (false); foo (true); } GCC сгенерирует две копии функции foo, одна для флага true, и другая для флага false;
- Добавлены новые оптимизации строковых операций, основанные на отслеживании размера строк и пытающиеся оптимизировать использование функций strlen, strchr, strcpy, strcat и stpcpy. Например, оптимизатор заменит "strcpy (a, b); strcat (a, c); strcat (a, d);" на "strcpy (stpcpy (stpcpy (a, b), c), d);";
-
Изменения в поддержке языков C и C++:
- В компиляторе C++ обеспечена поддержка большей части стандарта ISO C++11, включая поддержку атомарных операций, модель памяти C++11, нестатические инициализаторы членов классов, определяемые пользователем литералы, псевдонимы-декларации, вызов конструкторов класса из других конструкторов этого же класса, расширенный синтаксис декларатора классов friend и т.п. В runtime-библиотеке libstdc++ обеспечена экспериментальная поддержка C++11. Управление поддержкой C++11 осуществляется через опции -std=c++11, -std=gnu++11 и -Wc++11-compat;
- В компиляторе Си добавлена поддержка дополнительных элементов, определённых в стандарте ISO C11, например, Unicode-строки, выравнивание (_Alignas), не возвращающие значения функции, макросы CMPLX. Управление поддержкой C11 осуществляется через опции -std=c11 и -std=gnu11;
- Экспериментальная поддержка в компиляторе транзакционной памяти и создание сопутствующей библиотеки libitm. Транзакционная память определяется конструкцией __transaction_atomic { ... } и позволяет обеспечить атомарное выполнение блока кода, все результаты работы которого будут или полностью видны для других нитей или невидны совсем. Поддержка транзакционной памяти пока обеспечена для платформ x86-32, x86-64 и Alpha, для включения поддержки при сборке следует использовать опцию "-fgnu-tm";
-
Улучшения в поддержке процессорных архитектур:
- Поддержка процессоров ARM Cortex-A7 (опция для включения -mcpu=cortex-a7), Texas Instruments C6X, Tilera TILE-Gx и TILEPro, Adapteva Epiphany, National Semiconductor CR16,
- Из улучшений для архитектуры x86 отмечается поддержка семейств процессоров Intel Ivy Bridge (-march=core-avx-i), Intel Haswell и AMD Piledriver (-march=bdver2), продолжающих развитие AMD Fusion APU. Процессоры Intel Haswell (march=core-avx2) поступят в продажу только в следующем году и будут отличаться поддержкой расширенных инструкций AVX2, FMA, BMI, BMI2 и LZCNT;
-
Разное:
- Предварительная поддержка первой версии стандартаязыка программирования Go. Довести до конца поддержку всех элементов спецификации планируется в выпуске GCC 4.7.1;
- Поддержка различных расширений GNU для отладочного формата DWARF, таких как контроль входящих значений и получение информации о вызовах. Поддержка данных расширений ожидается в GDB 7.4;
- Большая порция улучшений для языка Фортран;
- Поддержка в компиляторах C, C++ и Fortran спецификации OpenMP 3.1.