6.4.1.25 Атрибуты функций RISC-V
В бэкенде RISC-V поддерживаются следующие атрибуты функций:
-
naked -
Этот атрибут позволяет компилятору создать необходимое объявление функции, оставляя тело функции написанным на языке ассемблера. Для указанной функции компилятор не генерирует последовательности пролога и эпилога. В функциях без пролога и эпилога безопасно использовать только операторы базового
asm(см. Базовый Asm — инструкции ассемблера без операндов). Хотя использование расширенногоasmили сочетание базовогоasmс кодом C может казаться работоспособным, полагаться на их надёжную работу нельзя, и они не поддерживаются. -
interrupt -
Используйте этот атрибут, чтобы указать, что заданная функция является обработчиком прерывания. При наличии этого атрибута компилятор генерирует последовательности входа в функцию и выхода из неё, подходящие для обработчика прерывания.
Можно указать тип обрабатываемого прерывания, добавив необязательный параметр к атрибуту interrupt, например:
void f (void) __attribute__ ((interrupt ("user")));Допустимые значения этого параметра:
user,supervisorиmachine. Если параметр не указан, по умолчанию используетсяmachine. -
riscv_vector_cc -
Используйте этот атрибут, чтобы принудительно задать для функции вариант соглашения о вызовах для векторных функций.
void foo() __attribute__((riscv_vector_cc)); [[riscv::vector_cc]] void foo(); // For C++11 and C23
Для целевой архитектуры RISC-V доступны следующие специфичные для целевой платформы атрибуты функций. В основном эти параметры повторяют поведение соответствующих параметров командной строки (см. Параметры RISC-V), но применяются отдельно к каждой функции.
-
arch= -
Задаёт версию архитектуры и архитектурные расширения, используемые этой функцией. Поведение и допустимые аргументы те же, что и у параметра командной строки -march=; кроме того, поддерживается список включаемых расширений — список имён расширений с префиксом
+; например,arch=+zbaозначает включение расширенияzba. Можно включить несколько расширений, разделив их запятыми. Например:arch=+zba,+zbb. -
tune= -
Задаёт ядро, для которого оптимизируется производительность этой функции. Поведение и допустимые аргументы те же, что и у параметра командной строки -mtune=.
-
cpu= -
Задаёт ядро, для которого оптимизируется производительность этой функции, а также архитектурные возможности которого используются. Поведение и допустимые аргументы те же, что и у параметра командной строки -mcpu=.
Указанные выше атрибуты целевой платформы можно задать следующим образом:
__attribute__((target("attr-string")))
int
f (int a)
{
return a + 5;
}
где attr-string — одна из указанных выше строк атрибутов.
Несколько атрибутов целевой платформы для функции можно указать, разделив их точками с запятой. Например:
__attribute__((target("arch=+zba,+zbb;tune=rocket")))
int
foo (int a)
{
return a + 5;
}
Это допустимо: функция foo будет скомпилирована с расширениями zba и zbb, а её производительность будет оптимизирована для rocket.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/RISC_002dV-Function-Attributes.html