Spec-Zone.ru › GCC 15

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_call
near
far

Эти атрибуты задают способ вызова конкретной функции в 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API