6.33.2 Атрибуты функций AArch64
Для целевой архитектуры AArch64 доступны следующие специфичные атрибуты функций. В основном, эти параметры отражают поведение аналогичных командной строки (см. Параметры AArch64), но на основе каждой функции.
-
general-regs-only -
Указывает, что при генерации кода для этой функции не следует использовать регистры с плавающей точкой или Advanced SIMD. Если функция явно использует код с плавающей точкой, компилятор выдаст ошибку. Это поведение соответствует опции командной строки -mgeneral-regs-only.
-
fix-cortex-a53-835769 -
Указывает, что для этой функции должно быть применено решение для исправления ошибки Cortex-A53 835769. Для явного отключения решения для этой функции укажите инвертированную форму:
no-fix-cortex-a53-835769. Это соответствует поведению параметров командной строки -mfix-cortex-a53-835769 и -mno-fix-cortex-a53-835769. -
cmodel= -
Указывает, что для этой функции должен быть сгенерирован код для определенной модели кода. Поведение и допустимые аргументы такие же, как для опции командной строки -mcmodel=.
-
strict-align no-strict-align-
strict-alignуказывает, что компилятор не должен предполагать, что ссылки на невыровненную память обрабатываются системой. Чтобы позволить компилятору предположить, что ссылки на выровненную память обрабатываются системой, можно указать обратный атрибутno-strict-align. Поведение соответствует опциям командной строки -mstrict-align и -mno-strict-align. -
omit-leaf-frame-pointer -
Указывает, что указатель кадра должен быть опущен для вызова функции-листа. Для сохранения указателя кадра можно указать обратный атрибут
no-omit-leaf-frame-pointer. Эти атрибуты имеют то же поведение, что и опции командной строки -momit-leaf-frame-pointer и -mno-omit-leaf-frame-pointer. -
tls-dialect= -
Указывает диалект TLS, который необходимо использовать для этой функции. Поведение и допустимые аргументы такие же, как для опции командной строки -mtls-dialect=.
-
arch= -
Указывает версию архитектуры и архитектурные расширения, которые необходимо использовать для этой функции. Поведение и допустимые аргументы такие же, как для опции командной строки -march=.
-
tune= -
Указывает ядро, для которого нужно настроить производительность этой функции. Поведение и допустимые аргументы такие же, как для опции командной строки -mtune=.
-
cpu= -
Указывает ядро, для которого нужно настроить производительность этой функции, а также архитектурные особенности которого следует использовать. Поведение и допустимые аргументы такие же, как для опции командной строки -mcpu=.
-
sign-return-address -
Выбирает область действия функции, к которой будет применено подписание адреса возврата. Поведение и допустимые аргументы такие же, как для опции командной строки -msign-return-address=. Значение по умолчанию —
none. Этот атрибут устарел. Следует использовать атрибутbranch-protection. -
branch-protection -
Выбирает область действия функции, к которой будет применена защита ветвлений. Поведение и допустимые аргументы такие же, как для опции командной строки -mbranch-protection=. Значение по умолчанию —
none. -
outline-atomics -
Включает или отключает вызовы вспомогательных функций вне тела функции для реализации атомных операций. Это соответствует поведению параметров командной строки -moutline-atomics и -mno-outline-atomics.
Вышеперечисленные атрибуты целевой архитектуры можно указать следующим образом:
__attribute__((target("attr-string")))
int
f (int a)
{
return a + 5;
}
где attr-string — одна из указанных выше строк атрибутов.
Кроме того, строка архитектурного расширения может быть указана отдельно. Это позволяет включать и отключать определенные архитектурные расширения без необходимости указывать конкретную версию архитектуры или ядра. Пример:
__attribute__((target("+crc+nocrypto")))
int
foo (int a)
{
return a + 5;
}
В этом примере target("+crc+nocrypto") включает расширение crc и отключает расширение crypto для функции foo без изменения существующих опций -march= или -mcpu.
Несколько атрибутов функций целевой архитектуры можно указать, разделив их запятой. Например:
__attribute__((target("arch=armv8-a+crc+crypto,tune=cortex-a53")))
int
foo (int a)
{
return a + 5;
}
является допустимым и компилирует функцию foo для ARMv8-A с расширениями crc и crypto и настраивает ее для cortex-a53.
6.33.2.1 Правила встраивания
Указание атрибутов целевой архитектуры для отдельных функций или выполнение оптимизации в процессе компоновки для модулей перевода, скомпилированных с различными параметрами целевой архитектуры, может повлиять на правила встраивания функций:
В частности, функция-вызывающая может встроить функцию-вызываемую только в том случае, если архитектурные возможности, доступные функции-вызываемой, являются подмножеством возможностей, доступных функции-вызывающей. Например: функция foo скомпилированная с -march=armv8-a+crc, или помеченная эквивалентным атрибутом arch=armv8-a+crc, может встроить функцию bar скомпилированную с -march=armv8-a+nocrc, поскольку все архитектурные возможности, необходимые функции bar, доступны функции foo. Напротив, функция bar не может встроить функцию foo.
Кроме того, встраивание функции, скомпилированной с -mstrict-align, в функцию, скомпилированную без -mstrict-align, запрещено. Однако, встраивание функции, скомпилированной без -mstrict-align, в функцию, скомпилированную с -mstrict-align, разрешено.
Обратите внимание, что параметры настройки процессора и атрибуты, такие как -mcpu=, -mtune=, не препятствуют встраиванию, если процессор, указанный опцией -mcpu= или атрибутом cpu=, не конфликтует с правилами архитектурных возможностей, указанными выше.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/AArch64-Function-Attributes.html