6.4.1.20 Атрибуты функций 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также являются синонимами, но имеют противоположный эффект: они указывают, что вызовы без PIC следует выполнять с помощью более эффективной инструкцииjal. -
mips16 nomips16-
Для целевых платформ MIPS можно использовать атрибуты функций
mips16иnomips16, чтобы локально включать или отключать генерацию кода MIPS16. Функция с атрибутомmips16генерируется в виде кода MIPS16, а для функций с атрибутомnomips16генерация кода MIPS16 отключается. Эти атрибуты переопределяют параметры командной строки -mips16 и -mno-mips16 (см. Параметры MIPS).При компиляции файлов, содержащих смешанный код MIPS16 и не-MIPS16, символ препроцессора
__mips16отражает настройку командной строки, а не настройку отдельных функций. Смешанный код MIPS16 и не-MIPS16 может некорректно взаимодействовать с некоторыми расширениями GCC, такими как__builtin_apply(см. Формирование вызовов функций). -
micromips, MIPS nomicromips, MIPS-
Для целевых платформ MIPS можно использовать атрибуты функций
micromipsиnomicromips, чтобы локально включать или отключать генерацию кода microMIPS. Функция с атрибутомmicromipsгенерируется в виде кода microMIPS, а для функций с атрибутомnomicromipsгенерация кода microMIPS отключается. Эти атрибуты переопределяют параметры командной строки -mmicromips и -mno-micromips (см. Параметры MIPS).При компиляции файлов, содержащих смешанный код microMIPS и не-microMIPS, символ препроцессора
__mips_micromipsотражает настройку командной строки, а не настройку отдельных функций. Смешанный код microMIPS и не-microMIPS может некорректно взаимодействовать с некоторыми расширениями GCC, такими как__builtin_apply(см. Формирование вызовов функций). -
nocompression -
Для целевых платформ MIPS можно использовать атрибут функции
nocompression, чтобы локально отключать генерацию кода MIPS16 и microMIPS. Этот атрибут переопределяет параметры командной строки -mips16 и -mmicromips (см. Параметры MIPS). -
use_hazard_barrier_return -
Этот атрибут функции указывает компилятору генерировать при возврате барьерный возврат, который устраняет все исполнительные и командные опасности, вместо обычной инструкции возврата.
code_readable-
Для целевых платформ MIPS, поддерживающих режимы адресации относительно счётчика команд, этот атрибут позволяет управлять способом адресации объекта. Атрибут принимает один необязательный аргумент:
- ‘no’
Функция не должна читать поток инструкций как данные.
- ‘yes’
Функция может читать поток инструкций как данные.
- ‘pcrel’
Функция может читать поток инструкций в режиме адресации относительно счётчика команд.
Если аргумент не указан, используется значение по умолчанию
"yes".
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/MIPS-Function-Attributes.html