6.33.2 Атрибуты функций AArch64
Для целевой архитектуры AArch64 доступны следующие специфичные атрибуты функций. В основном, эти параметры отражают поведение аналогичных командных параметров (см. Параметры AArch64), но на основе каждой функции.
general-regs-only-
Указывает, что при генерации кода для данной функции не следует использовать регистры с плавающей точкой или расширенного 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-alignno-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, разрешено.
Обратите внимание, что параметры настройки CPU и атрибуты, такие как -mcpu=, -mtune=, не препятствуют встраиванию, если процессор, указанный в параметре -mcpu= или атрибуте cpu=, не конфликтует с правилами архитектурных функций, указанными выше.
Далее: Атрибуты функций AMD GCN, Предыдущее: Общие атрибуты функций, Вверх: Атрибуты функций [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/AArch64-Function-Attributes.html