6.33.21 Атрибуты функций 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_callshort_callnearfar-
Эти атрибуты определяют, как конкретная функция вызывается на MIPS. Атрибуты переопределяют переключатель командной строки -mlong-calls (см. Параметры MIPS). Атрибуты
long_callиfarявляются синонимами и заставляют компилятор всегда вызывать функцию, сначала загрузив её адрес в регистр, а затем используя содержимое этого регистра. Атрибутыshort_callиnearявляются синонимами и имеют обратный эффект; они указывают, что вызовы не-PIC должны выполняться с использованием более эффективной инструкцииjal. mips16nomips16-
На целевых MIPS-платформах можно использовать атрибуты функций
mips16иnomips16, чтобы локально выбрать или отключить генерацию кода MIPS16. Функция с атрибутомmips16генерируется как код MIPS16, а генерация кода MIPS16 отключается для функций с атрибутомnomips16. Эти атрибуты переопределяют параметры -mips16 и -mno-mips16 в командной строке (см. Параметры MIPS).При компиляции файлов, содержащих смешанный код MIPS16 и не-MIPS16, препроцессорная переменная
__mips16отражает настройку в командной строке, а не в отдельных функциях. Смешанный код MIPS16 и не-MIPS16 может плохо взаимодействовать с некоторыми расширениями GCC, такими как__builtin_apply(см. Построение вызовов функций). micromips, MIPSnomicromips, MIPS-
На целевых MIPS-платформах вы можете использовать атрибуты функций
micromipsиnomicromips, чтобы локально выбрать или отключить генерацию кода microMIPS. Функция с атрибутомmicromipsгенерируется как код microMIPS, а генерация кода microMIPS отключается для функций с атрибутомnomicromips. Эти атрибуты переопределяют параметры -mmicromips и -mno-micromips в командной строке (см. Параметры MIPS).При компиляции файлов, содержащих смешанный код microMIPS и не-microMIPS, препроцессорная переменная
__mips_micromipsотражает настройку в командной строке, а не в отдельных функциях. Смешанный код microMIPS и не-microMIPS может плохо взаимодействовать с некоторыми расширениями GCC, такими как__builtin_apply(см. Построение вызовов функций). nocompression-
На целевых MIPS-платформах вы можете использовать атрибут функции
nocompression, чтобы локально отключить генерацию кода MIPS16 и microMIPS. Этот атрибут переопределяет параметры -mips16 и -mmicromips в командной строке (см. Параметры MIPS).
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/MIPS-Function-Attributes.html