6.4.1.5 Атрибуты функций ARM
Для целевых платформ ARM поддерживаются следующие атрибуты функций:
-
general-regs-only -
Указывает, что при генерации кода для этой функции не следует использовать регистры с плавающей точкой или Advanced SIMD. Если функция явно использует код с плавающей точкой, компилятор выдаёт ошибку. Это поведение совпадает с поведением параметра командной строки -mgeneral-regs-only.
-
interrupt -
Используйте этот атрибут, чтобы указать, что заданная функция является обработчиком прерываний. Если задан этот атрибут, компилятор генерирует последовательности входа в функцию и выхода из неё, подходящие для использования в обработчике прерываний.
Можно указать тип обрабатываемого прерывания, добавив необязательный параметр к атрибуту interrupt, например:
void f () __attribute__ ((interrupt ("IRQ")));Допустимые значения этого параметра:
IRQ,FIQ,SWI,ABORTиUNDEF.В ARMv7-M тип прерывания игнорируется, а атрибут означает, что функция может вызываться с указателем стека, выровненным по границе слова.
-
isr -
Используйте этот атрибут в ARM для написания обработчиков прерываний. Это псевдоним атрибута
interrupt, описанного выше. -
long_call short_call-
Эти атрибуты задают способ вызова конкретной функции. Они переопределяют параметр командной строки -mlong-calls (см. Параметры ARM) и настройки
#pragma long_calls. В ARM атрибутlong_callуказывает, что функция может находиться далеко от места вызова и для её вызова может потребоваться другая (более затратная) последовательность. Атрибутshort_callвсегда помещает смещение от места вызова до функции непосредственно в инструкцию ‘BL’. -
naked -
Этот атрибут позволяет компилятору создать необходимое объявление функции, оставляя при этом возможность задать тело функции на ассемблере. Для заданной функции компилятор не генерирует последовательности пролога и эпилога. В функциях без пролога и эпилога безопасно использовать только базовые инструкции
asm(см. Базовый Asm — инструкции ассемблера без операндов). Расширенныйasmили сочетание базовогоasmи кода на C могут показаться работоспособными, однако на их надёжную работу нельзя рассчитывать, и они не поддерживаются. -
pcs -
Атрибут
pcsпозволяет управлять соглашением о вызовах, используемым для функции в ARM. Аргумент атрибута задаёт соглашение о вызовах.При компиляции с ABI AAPCS (или его вариантом) допустимыми значениями аргумента являются
"aapcs"и"aapcs-vfp". Чтобы использовать вариант, отличный от"aapcs", компилятору необходимо разрешить использовать соответствующие регистры сопроцессора (то есть для использования"aapcs-vfp"должны быть доступны регистры VFP). Например:/* Argument passed in r0, and result returned in r0+r1. */ double f2d (float) __attribute__((pcs("aapcs")));Функции с переменным числом аргументов всегда используют соглашение о вызовах
"aapcs", и компилятор отклоняет попытки указать другое соглашение. -
target (options) -
Как описано в разделе Общие атрибуты функций, этот атрибут позволяет задавать параметры компиляции, специфичные для целевой платформы.
В ARM допустимы следующие параметры:
- ‘thumb’
-
Принудительно генерировать код в ISA Thumb (T16/T32) в зависимости от уровня архитектуры.
- ‘arm’
-
Принудительно генерировать код в ISA ARM (A32).
Функции из разных режимов могут встраиваться в вызывающий код, использующий режим вызывающей стороны.
- ‘fpu=’
-
Задаёт FPU, для которого оптимизируется производительность этой функции. Поведение и допустимые аргументы совпадают с таковыми для параметра командной строки -mfpu=.
- ‘arch=’
-
Задаёт версию архитектуры и архитектурные расширения, используемые для этой функции. Поведение и допустимые аргументы совпадают с таковыми для параметра командной строки -march=.
Указанные выше атрибуты целевой платформы можно задавать следующим образом:
__attribute__((target("arch=armv8-a+crc"))) int f (int a) { return a + 5; }Кроме того, строку архитектурных расширений можно указать отдельно. Это позволяет включать и отключать отдельные архитектурные расширения без указания конкретной версии архитектуры или ядра. Пример:
__attribute__((target("+crc+nocrypto"))) int foo (int a) { return a + 5; }В этом примере
target("+crc+nocrypto")включает расширениеcrcи отключает расширениеcryptoдля функцииfoo, не изменяя существующий параметр -march= или -mcpu.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/ARM-Function-Attributes.html