Наиболее важные изменения при переходе от 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__’ы функций, на которые их следует заменить):

    • #pragma unknown_control_flow (func_name) [ __attribute__((returns_twice)) ]

    • #pragma no_instrument_function (func_name) [ __attribute__((no_instrument_function)) ]

    • #pragma no_profile_instrument_function (func_name) [ __attribute__((no_profile_instrument_function)) ]

    • #pragma no_inline (func_list) [ __attribute__((noinline)) ]

    • #pragma hot (func_list) [ __attribute__((hot)) ]

    • #pragma no_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