Spec-Zone.ru › GCC 15

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

Spec-Zone.ru

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