Spec-Zone.ru › GCC 10

Следующее: Атрибуты функций AVR, Предыдущее: Атрибуты функций ARC, Вверх: Объявление атрибутов функций [Оглавление][Индекс]

6.33.5 Атрибуты функций ARM ¶

Эти атрибуты функций поддерживаются для целей ARM:

general-regs-only

Указывает, что при генерации кода для этой функции не следует использовать регистры с плавающей точкой или Advanced SIMD. Если функция явно использует код с плавающей точкой, компилятор выдаст ошибку. Это поведение такое же, как у командной строки -mgeneral-regs-only.

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 и C-кода может показаться работающим, нельзя гарантировать его надёжную работу, и он не поддерживается.

pcs

Атрибут pcs может использоваться для управления соглашением о вызовах функций на ARM. Атрибут принимает аргумент, указывающий соглашение о вызовах, которое следует использовать.

При компиляции с помощью ABI AAPCS (или его варианта) допустимыми значениями для аргумента являются "aapcs" и "aapcs-vfp". Чтобы использовать другой вариант, кроме "aapcs", компилятор должен иметь разрешение на использование соответствующих регистров сопроцессоров (то есть регистры VFP должны быть доступны для использования "aapcs-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.

Следующее: Атрибуты функций AVR, Предыдущее: Атрибуты функций ARC, Вверх: Объявление атрибутов функций [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/ARM-Function-Attributes.html

Spec-Zone.ru

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