Наиболее важные изменения при переходе от lcc-1.27 к lcc-1.28 (changelog)¶
Изменения, затрагивающие совместимость¶
По аналогии с gcc-11 теперь по умолчанию включен режим
-fno-common. Это может приводить к ошибкам линковки при работе со старыми исходниками на языке C. Подробнее см. статью Несовместимое изменение настройки по умолчанию при работе с tentative definition в lcc-1.28У встроенных функций
__builtin_e2k_get_ap_sizeи__builtin_e2k_get_ap_curptrтип возвращаемого значения изменён сuint32наuint64. Это связано с расширением адресного пространства дескриптора для процессоров elbrus-v7 и выше. Для elbrus-v6 и ниже возвращаемое этими функциями значение в реальности остаётся 32-битным, просто оно представлено в виде 64-битного типаУ встроенной функции
__builtin_e2k_create_ap_subarrayтип параметровoffsetиsizeизменён сuint32наuint64. Это связано с расширением адресного пространства дескриптора для процессоров elbrus-v7 и выше. Для elbrus-v6 и ниже используются только младшие 32 бита этих параметровУ встроенной функции
__builtin_e2k_create_ap_subarrayизменилась семантика. Старая реализация содержала ошибку, из-за которой смещение отсчитывалось от AP.base (т.е. от начала дескриптора). Теперь ошибка исправлена и смещение для elbrus-v6 и ниже отсчитывается от точки AP.base + AP.curptr (т.е. от текущего положения внутри дескриптора), а для elbrus-v7 и выше - от точки, являющейся смысловым эквивалентом AP.base + AP.curptr. Изменение вступило в силу начиная с lcc-1.28.10Атрибут функций
no_instrument_functionболее не влияет на инструментирование в режиме-fprofile-generate. Теперь, по аналогии с gcc, атрибутno_instrument_functionотключает инструментирование в режиме-pg, атрибутno_profile_instrument_functionотключает инструментирование в режиме-fprofile-generate.Для GNU ассемблерных вставок использование constraint “r” для типов
long doubleи 16-байтный GNU-vector объявлено устаревшим (DEPRECATED). Подробнее см. статью Подготовка в lcc-1.28 для E2K к будущим несовместимым изменениям при работе с аргументами ассемблерных вставок, имеющих тип long double или 16-байтный GNU-vectorВ защищённом режиме для процессоров с системой команд elbrus-v7 и выше размер типа
intptr_tувеличен с 64 до 128 бит. В будущих версиях компилятора будет поддержан режим с возможностью передачи указателя через переменные типаintptr_tСледующие опции объявлены устаревшими (DEPRECATED) и будут удалены в будущих версиях компилятора:
-fno-loop-blocking-fno-loop-fill-objs-floop-nesting4swp-fno-ibranch-fno-tail-calls-fno-gcp(используйте-fno-gcse)-fsetjmp-opt-fblack-hole-fblack-hole=<f>-fcfetch-fcfetch=<dist>,<gap>[,<p>]--dwarf2-64bit(переименована в-gdwarf64для симметрии с gcc, в рекомендуется удалить, т.к. этот режим уже включен по умолчанию)--no-dwarf2-64bit(переименована в-gdwarf32для симметрии с gcc)-fprofile-strict-names(вместо неё используется-Wmissing-profile, включённая по умолчанию)
Следующие директивы #pragma объявлены устаревшими (DEPRECATED) и будут удалены в будущих версиях компилятора (в скобках указаны __attribute__’ы функций, на которые их следует заменить):
#pragmaunknown_control_flow(func_name)[__attribute__((returns_twice))]#pragmano_instrument_function(func_name)[__attribute__((no_instrument_function))]#pragmano_profile_instrument_function(func_name)[__attribute__((no_profile_instrument_function))]#pragmano_inline(func_list)[__attribute__((noinline))]#pragmahot(func_list)[__attribute__((hot))]#pragmano_side_effect(func_list)[ директива игнорируется, поэтому замена не требуется ]
Общие улучшения¶
Переход на совместимость с gcc-11.3.0. В lcc-1.27 была совместимость с gcc-9.3.0
В режиме языка C++ изменился стандарт по умолчанию. По умолчанию используется режим
-std=gnu++17. В lcc-1.27 по умолчанию использовался режим-std=gnu++14Добавлена минимальная поддержка C23
Добавлена поддержка процессоров с системой команд elbrus-v7
Добавлена поддержка атрибута функции
no_profile_instrument_function, отключающего инструментирование в режиме-fprofile-generate.Добавлена поддержка опции -fprofile-dir=<dir>
Добавлена поддержка подсказки
__builtin_assume_alignedдля оптимизацииapb, раньше она работала только для автоматической векторизации.Добавлена поддержка
__builtin_alloca_with_alignДоработка поддержки OpenMP:
Добавлена поддержка OpenMP в режиме
-mptr128Добавлена поддержка опции -fopenmp-simd
Добавлена поддержка выражений в clause’ах
ifиnum_threadsдля C/C++Добавлена поддержка конструкций отмены распараллеливания
Добавлена поддержка конструкции taskgroup
Добавлена поддержка clause simdlen и safelen в конструкции omp simd
В ассемблерных вставках добавлена поддержка параметров агрегатных типов
Доработана поддержка restrict-указателей - теперь они учитываются при раскрытии x86-интринсиков _mm_load* и _mm_store*. Это позволяет в ряде случаев значительно ускорить исполнение на Эльбрус кодов, оптимизированных вручную под архитектуру x86
Добавлена корректная обработка функции swapcontext как для setjmp, что позволяет теперь использовать эту функцию. Ранее использование функции swapcontext могло приводить к ошибкам исполнения, теперь эта проблема исправлена.
У встроенных функций
__builtin_e2k_load_gettagsи__builtin_e2k_load_gettagdчастично сняты ограничения реализации, теперь они могут работать в том числе и с памятью, в которой находится дескриптор. Добавлена встроенная функция__builtin_e2k_load_gettagq
