6.31.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-
Указывает, что компилятор не должен предполагать, что ссылки на невыровненные данные обрабатываются системой. Поведение аналогично опции командной строки -mstrict-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. 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.31.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= противоречит правилам архитектурных возможностей, указанным выше.
Далее: Атрибуты функций ARC, Предыдущий: Общие атрибуты функций, Вверх: Атрибуты функций [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/AArch64-Function-Attributes.html