После года разработки и спустя 25 лет после основания проекта представлен (http://permalink.gmane.org/gmane.comp.gcc.devel/125441) релиз новой ветки свободного набора компиляторов GCC 4.7 (http://gcc.gnu.org), развиваемого проектом GNU. В новой версии реализованы новые методы оптимизации, прекращена поддержка устаревших систем, расширена поддержка стандартов C++11 и C11, реализована поддержка транзакционных блоков для C/C++, улучшена поддержка языка Google Go, обеспечена поддержка процессоров ARM Cortex-A7, Intel Ivy Bridge, Intel Haswell и AMD Fusion Piledriver.
Основные изменения (http://gcc.gnu.org/gcc-4.7/changes.html):
-
Улучшения в оптимизации кода:
- Улучшение фреймворка оптимизации во время динамического связывания (LTO - Link Time Optimization) - проведена работа по увеличению масштабируемости, повышению стабильности и сокращению потребления ресурсов. Например, для использование LTO для Firefox на 64-разрядной системе достаточно 3 Гб ОЗУ, в то время как ранее требовалось 8 Гб.
- Ускорены операции связывания (linking). Например, связывание компонентов Firefox ускорилось в 10 раз). Сокращён размер объектных файлов и уменьшено дисковое пространство, необходимое для хранения временных данных в процессе связывания;
- Улучшены эвристические методы inlinе-раскрытия функций, дополнительно учитывающие известные значения параметров функции. Например, для кода
<font color="#461b7e">
void foo(int a)
{
if (a>10)
... много кода ...
}
void bar (void)
{
foo (0);
}
</font>
код функции foo будет развёрнут внутри bar, даже в ситуации вколчения режима оптимизации по размеру (изначально известно что блок "много кода" при нулевом аргументе никогда не будет вызван).
- Улучшены внутрипроцедурные оптимизации размещения констант. Например, при компиляции кода
<font color="#461b7e">
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);
}
</font>
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 (http://www.opennet.dev/opennews/art.shtml?num=31476), включая поддержку атомарных операций, модель памяти C++11, нестатические инициализаторы членов классов, определяемые пользователем литералы, псевдонимы-декларации, вызов конструкторов класса из других конструкторов этого же класса, расширенный синтаксис декларатора классов friend и т.п. В runtime-библиотеке libstdc++ обеспечена экспериментальная поддержка C++11. Управление поддержкой C++11 осуществляется через опции -std=c++11, -std=gnu++11 и -Wc++11-compat;
- В компиляторе Си добавлена поддержка дополнительных элементов, определённых в стандарте ISO C11 (http://www.opennet.dev/opennews/art.shtml?num=32644), например, Unicode-строки, выравнивание (_Alignas), не возвращающие значения функции, макросы CMPLX. Управление поддержкой C11 осуществляется через опции -std=c11 и -std=gnu11;
- Экспериментальная поддержка в компиляторе транзакционной памяти (http://gcc.gnu.org/wiki/TransactionalMemory) и создание сопутствующей библиотеки libitm. Транзакционная память определяется конструкцией __transaction_atomic { ... } и позволяет (http://lwn.net/Articles/466513/) обеспечить атомарное выполнение блока кода, все результаты работы которого будут или полностью видны для других нитей или невидны совсем. Поддержка транзакционной памяти пока обеспечена для платформ 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 (-march=core-avx2) и AMD 15h/Piledriver (-march=bdver2), продолжающих развитие AMD Fusion APU. Процессоры Intel Haswell поступят в продажу только в следующем году и будут отличаться поддержкой расширенных инструкций AVX2, FMA, BMI, BMI2 и LZCNT;
- Поддержка расширенных наборов инструкций процессоров IA-32/x86-64:
Intel AVX2 (-mavx2), Intel BMI2 (-mbmi2), Intel FMA3 (-mfma), Intel rdrnd (-mrdrnd), дополнительных векторных преобразований AVX (-mf16c);
- Поддержка архитектуры семейства микроконтроллеров XMEGA AVR (ATxmegaxxx);
-
Разное:
- Предварительная поддержка первой версии стандарта (http://weekly.golang.org/doc/go1.html) языка программирования Go. Довести до конца поддержку всех элементов спецификации планируется в выпуске GCC 4.7.1;
- Поддержка различных расширений GNU для отладочного формата DWARF, таких как контроль входящих значений и получение информации о вызовах. Поддержка данных расширений ожидается в GDB 7.4;
- Большая порция улучшений для языка Фортран;
- Поддержка в компиляторах C, C++ и Fortran спецификации OpenMP 3.1 (http://openmp.org/wp/openmp-specifications/).
-
Общие нюансы:
- Объявлены устаревшими и будут удалены в следующих выпусках порты 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;
- Убрана поддержка архитектур, объявленных (http://www.opennet.dev/opennews/art.shtml?num=30035) устаревшими в GCC 4.6.0;
URL: http://permalink.gmane.org/gmane.comp.gcc.devel/125441
Новость: http://www.opennet.dev/opennews/art.shtml?num=33424