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_callshort_call-
Эти атрибуты определяют, как вызывается конкретная функция. Эти атрибуты переопределяют переключатель командной строки -mlong-calls (см. Опции ARM) и
#pragma long_callsнастройки. Для ARM атрибутlong_callуказывает, что функция может находиться далеко от места вызова и требует другой (более дорогостоящей) последовательности вызова. Атрибутshort_callвсегда помещает смещение функции от места вызова непосредственно в инструкцию ‘BL’. naked-
Этот атрибут позволяет компилятору построить необходимое объявление функции, позволяя при этом использовать в теле функции ассемблерный код. Указанная функция не будет иметь пролога/эпилога, генерируемых компилятором. В голой функции могут безопасно включаться только базовые
asmоператоры (см. Basic 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-9.5.0/gcc/ARM-Function-Attributes.html