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

После года разработки вышел релиз набора компиляторов GCC 4.5.0 в котором представлен новый оптимизатор на этапе компоновки, реализована экспериментальная поддержка некоторых возможностей стандарта C++0x, продолжена интеграция наработок проекта Graphite с реализацией поддержки автоматического распараллеливания операций.

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

  • Общие нюансы:
    • Для сборки GCC теперь требуется математическая библиотека MPC (multiprecision library) для более точных вычислений на этапе компиляции;
    • Часть старых архитектур была объявлена устаревшей и будет полностью исключена в версии 4.6.0: IRIX до версии 6.5, Solaris 7, Tru64 Unix до версии 5.1, более подробно читайте об этом с списке рассылки;
    • Убрана поддержка систем, объявленных устаревшими в версии GCC 4.4.0;
    • Из релиза исключены утилиты protoize и unprotoize;
    • Улучшились возможности по генерации отладочного кода, в связи с чем требуется GDB версии не ниже 7.5;
    • Для x86 архитектур код с плавающей точной, генерируемый согласно ужесточенным требованиям стандарта C99, будет работать гораздо медленней, чем в старых версиях GCC. Для решения этой проблемы используйте ключ компиляции -fexcess-precision=fast;
    • Атрибут функции noinline более не гарантирует то, что GCC не создаст клон функции - для предотвращения создания клона появился новый атрибут noclone. Клонирование функции обозначает, что создаётся дубликат функции при некоторых обстоятельствах, например, когда известно значение одного из атрибутов функции;
  • Новые возможности оптимизации:
    • Флаг компиляции -save-temps теперь может использовать дополнительный аргумент. Так, при использовании опций -save-temps и -save-temps=cwd GCC будет писать временные в текущую рабочую директорию, основываясь на расположении исходников. При -save-temps=obj временные файлы будут сохраняться в туже директорию, куда были сохранены объектные файлы (-o). Это позволит компилировать одно и тоже дерево исходников в разные директории.
    • Файлы с отладочной информацией теперь будут сохраняться туда же, куда были сохранены объектные файлы;
    • Для компиляции сложных арифметических выражений теперь используется библиотека MPC, что позволило более точно высчитывать их результат;
    • Появилась новая опция межфайловой оптимизации при линковке файлов -flto. Эта опция заставляет компилятор добавлять в каждый объектный файл некоторую секцию .ELF, и когда затем происходит линковка файла GCC, заметив эту секцию выполняет оптимизацию всех объектных файлов как-будто если бы это был един файл исходников;
    • Подсистема Graphite теперь позволяет включать автоматическую параллезацию с помощью опции -floop-parallelize-all;
    • Переписана инфраструктура оптимизации на основе restrict qualified pointers, что привело к генерации более производительного кода. Также была включена оптимизация кода для этой возможности при использовании флага компиляции -fno-strict-aliasing;
    • Улучшен код функций, генерируемый для уровней -O2 и -Os: если встречаются прототипы функции, параметры которых затем нигде не используются то тогда эти параметры не передаются, а аргументы передаваемые по указателю передаются по значению.
    • GCC теперь оптимизирует код исключений.

Среди прочих изменений нужно отметить улучшенную поддержку стандарта C++0x, улучшенные возможности выдачи сообщений об ошибках на этапе компиляции, улучшение компиляции кода C++, использующего темплейты и многое другое.

© OpenNet