6.33.19 Атрибуты функций MIPS
Эти атрибуты функций поддерживаются бэкендом MIPS:
-
interrupt -
Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерываний. Компилятор генерирует последовательности входа и выхода из функции, подходящие для использования в обработчике прерываний, когда этот атрибут присутствует. Поддерживается необязательный аргумент для атрибута прерывания, который позволяет описать режим прерывания. По умолчанию GCC предполагает использование режима внешнего контроллера прерываний (EIC), это можно явно установить, используя
eic. Когда прерывания не замаскированы, запрашиваемый уровень приоритета прерываний (IPL) копируется в текущий IPL, что приводит к включению только прерываний более высокого приоритета. Для использования векторизованного режима прерываний используйте аргументvector=[sw0|sw1|hw0|hw1|hw2|hw3|hw4|hw5], это изменит поведение поддержки не замаскированных прерываний, и GCC обеспечит маскирование всех прерываний от sw0 до и включая указанный вектор прерывания.Вы можете использовать следующие атрибуты для изменения поведения обработчика прерываний:
-
use_shadow_register_set -
Предполагается, что обработчик использует набор теневых регистров вместо основных регистров общего назначения. Поддерживается необязательный аргумент
intstackдля указания того, что набор теневых регистров содержит действительный указатель стека. -
keep_interrupts_masked -
Поддерживать прерывания замаскированными для всей функции. Без этого атрибута GCC пытается повторно включить прерывания для как можно большей части функции.
-
use_debug_exception_return Возврат с использованием инструкции
deret. Обработчики прерываний, у которых нет этого атрибута, возвращаются с помощьюeretвместо этого.
Вы можете использовать любую комбинацию этих атрибутов, как показано ниже:
void __attribute__ ((interrupt)) v0 (); void __attribute__ ((interrupt, use_shadow_register_set)) v1 (); void __attribute__ ((interrupt, keep_interrupts_masked)) v2 (); void __attribute__ ((interrupt, use_debug_exception_return)) v3 (); void __attribute__ ((interrupt, use_shadow_register_set, keep_interrupts_masked)) v4 (); void __attribute__ ((interrupt, use_shadow_register_set, use_debug_exception_return)) v5 (); void __attribute__ ((interrupt, keep_interrupts_masked, use_debug_exception_return)) v6 (); void __attribute__ ((interrupt, use_shadow_register_set, keep_interrupts_masked, use_debug_exception_return)) v7 (); void __attribute__ ((interrupt("eic"))) v8 (); void __attribute__ ((interrupt("vector=hw3"))) v9 (); -
-
long_call short_callnearfar-
Эти атрибуты определяют, как вызывается определенная функция на MIPS. Атрибуты переопределяют переключатель командной строки -mlong-calls (см. Опции MIPS). Атрибуты
long_callиfarявляются синонимами и заставляют компилятор всегда вызывать функцию, сначала загрузив ее адрес в регистр, а затем используя содержимое этого регистра. Атрибутыshort_callиnearявляются синонимами и имеют обратный эффект; они указывают, что вызовы non-PIC должны выполняться с использованием более эффективной инструкцииjal. -
mips16 nomips16-
На MIPS-целевых платформах вы можете использовать атрибуты функций
mips16иnomips16для локального выбора или отключения генерации кода MIPS16. Функция с атрибутомmips16генерируется как код MIPS16, а генерация кода MIPS16 отключена для функций с атрибутомnomips16. Эти атрибуты переопределяют опции -mips16 и -mno-mips16 в командной строке (см. Опции MIPS).При компиляции файлов, содержащих смешанный код MIPS16 и non-MIPS16, препроцессорная переменная
__mips16отражает настройку в командной строке, а не в отдельных функциях. Смешанный код MIPS16 и non-MIPS16 может взаимодействовать некорректно с некоторыми расширениями GCC, такими как__builtin_apply(см. Создание вызовов функций). -
micromips, MIPS nomicromips, MIPS-
На MIPS-целевых платформах вы можете использовать атрибуты функций
micromipsиnomicromipsдля локального выбора или отключения генерации кода microMIPS. Функция с атрибутомmicromipsгенерируется как код microMIPS, а генерация кода microMIPS отключена для функций с атрибутомnomicromips. Эти атрибуты переопределяют опции -mmicromips и -mno-micromips в командной строке (см. Опции MIPS).При компиляции файлов, содержащих смешанный код microMIPS и non-microMIPS, препроцессорная переменная
__mips_micromipsотражает настройку в командной строке, а не в отдельных функциях. Смешанный код microMIPS и non-microMIPS может взаимодействовать некорректно с некоторыми расширениями GCC, такими как__builtin_apply(см. Создание вызовов функций). -
nocompression -
На MIPS-целевых платформах вы можете использовать атрибут функции
nocompressionдля локального отключения генерации кода MIPS16 и microMIPS. Этот атрибут переопределяет опции -mips16 и -mmicromips в командной строке (см. Опции MIPS). -
use_hazard_barrier_return -
Этот атрибут функции сообщает компилятору сгенерировать возврат барьера рисков, который очищает все риски выполнения и инструкций при возвращении, вместо генерации обычной инструкции возврата.
code_readable-
Для MIPS-целевых платформ, которые поддерживают режимы адресации относительно PC, этот атрибут можно использовать для управления способом адресации объекта. Атрибут принимает один необязательный аргумент:
- ‘no’
Функция не должна читать поток инструкций как данные.
- ‘yes’
Функция может читать поток инструкций как данные.
- ‘pcrel’
Функция может читать поток инструкций в режиме pc-relative.
Если аргумент не указан, применяется значение по умолчанию
"yes".
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/MIPS-Function-Attributes.html