Релиз набора компиляторов GCC 7
Опубликовано 02 Май 2017 18:09:23
После года разработки состоялся релиз свободного набора компиляторов GCC 7.1, первый значительный выпуск в новой ветке GCC 7.x. Релиз приурочен к 30-летию с момента формирования первого выпуска GCC 1.0. В соответствии с новой схемой нумерации выпусков, версия 7.0 использовалась в процессе разработки, а незадолго до выхода GCC 7.1 уже ответвилась ветка GCC 8.0, на базе которой будет сформирован следующий значительный релиз GCC 8.1.
Источник: http://www.opennet.ru/opennews/art.shtml?num=46487
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;
- Расширены средства диагностики ошибок, добавлены новые предупреждения, улучшено отслеживание местоположения переменных и вхождения в диапазон допустимых значений. Добавлены новые диагностические опции: "-Wimplicit-fallthrough", "-Wpointer-compare", "-Wduplicated-branches", "-Wrestrict", "-Wmemset-elt-size", "-Wmemset-elt-size", "-Wint-in-bool-context", "-Wswitch-unreachable", "-Wexpansion-to-defined", "-Wregister", "-Wvla-larger-than=N", "-Wduplicate-decl-specifier";
- Существенно расширена система рекомендации по устранению проблем (например, GCC предупредит о "%s" в printf, если значение "i + j") и предложений по замене опечаток в идентификаторах (gtk_widget_showall => gtk_widget_show_all), типах (singed => signed), макросах (array[MAX_ITEM] => array[MAX_ITEMS]), директивах препроцессора endfi => endif) и даже опциях командной строки ("-ftls-model=global-dinamic" => global-dynamic)
- Добавлена опция "-fdiagnostics-generate-patch" позволяющая сформировать заготовку патча на основе выявленных компилятором диагностических рекомендаций. Также добавлена опция "-fdiagnostics-parseable-fixits" для автоматизации передачи диагностики в интегрированные среды разработки;
--- spellcheck-fields.cc +++ spellcheck-fields.cc @@ -49,5 +49,5 @@ color get_color(struct s *ptr) { - return ptr->colour; + return ptr->color; } fix-it:"spellcheck-fields.cc":{52:13-52:19}:"color"
- Представлена большая порция новых режимов для выявления переполнений буфера и различных форм некорректной работы с памятью.
- Добавлена опция "-Walloc-size-larger-than=size", выводящая предупреждение при попытках выделения блоков памяти, превышающих заданный лимит (полезно для отлавливания обращений к malloc с отрицательными значениями аргументов).
- Опция "-Wnonnull" нацелена на выявление передачи нулевых указателей в функциях, ожидающих поступления не-null аргументов.
- Опция "-Wstringop-overflow=type" выявляет типовые переполнения при использовании функций, подобных memcpy и strcpy.
- Опция "-Wformat-overflow=level" даёт возможность выявить выходы за границу буфера при использовании функций форматирования строки, таких как sprintf;
void* f (int mday) { char *buf = malloc (3); sprintf (buf, "%02i", mday % 100); return buf; } warning: 'sprintf may write a terminating nul past the end of the destination [-Wformat-overflow=] note: 'sprintf' output between 3 and 4 bytes into a destination of size 3
- Многочисленные улучшения в области оптимизации: добавлены новые оптимизации во время динамического связывания, межпроцедурные и внутрепроцедурные оптимизации. Реализованы дополнительные стадии слияния областей хранения констант ("-fstore-merging"), выноса операций за пределы циклов и разбиения циклов на части (например, когда для одной части итераций условие всегда принимает значение true, а для другой - false). Обеспечена возможность определения возвращаемого значения или диапазона возвращаемых значений для некоторых вызовов sprintf и использования данной информации на других стадиях оптимизации (например, вызов snprintf с аргументом нулевой длины может быть преобразован в константу);
- В Address Sanitizer добавлен режим "-fsanitize-address-use-after-scope" для проверки переменных, адрес которых сохранятся и затем используется вне области видимости этой переменной;
int main (int argc, char **argv) { char *ptr; { char my_char; ptr = &my_char; } *ptr = 123; return *ptr; } ==28882==ERROR: AddressSanitizer: stack-use-after-scope on address
- Добавлена возможность использования OpenMP 4.5 для ускорения вычислений за счёт выноса операций (offloading) на специализированные процессоры NVIDIA PTX;
- При использовании опции "-fverbose-asm" в комментариях к ассемблерному коду теперь приводятся ссылки на строки в файле и куски Си-кода из которых были сгенерированы данные ассемблерные выражения;
# example.c:7: total += i * i; movl %edx, %ecx # i, tmp92 imull %edx, %ecx # i, tmp92
- Поддержка развиваемого компанией Google языка программирования Go обновлена до версии 1.8.1;
- Для новых целевых платформ (PowerPC, SPARC ) задействован по умолчанию новый механизм распределения регистров LRA (Local Register Allocator), реализующий метод рематериализации, при котором вместо сохранения значения регистра при необходимости используется его повторное вычисление;
- Добавлена поддержка обработки файлов в бинарном формате 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;
- Добавлена поддержка формата отладочной информации DWARF 5 (опция -gdwarf-5). По умолчанию по-прежнему используется DWARF 4;
- Из состава GCC удалены все компоненты компилятора GCJ (GNU Compiler For Java). Инициатива по удалению GCJ стартовала ещё в 2013 году и связана с запущенным состоянием GCJ, который много лет не развивается (полностью поддерживается только Java 1.2) и содержит ряд проблем, мешающих применению GCJ на практике. Кроме того, смысл существования GCJ стал неоправдан после сосредоточения разработки открытых компонентов Java в проекте OpenJDK, который также распространяется под лицензией GPL;
- Режим профилирования libstdc++ объявлен устаревшим и будет удалён в будущих выпусках;
- Объявлен устаревшим Cilk+, набор расширений для языков Си и Си++ с реализацией предложенной компанией Intel методики параллельного программирования.
Источник: http://www.opennet.ru/opennews/art.shtml?num=46487
|
0 | Tweet | Нравится |
|