Spec-Zone.ru › GCC 15

6.4.1.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.

indirect_return

Атрибут indirect_return можно применить к типу функции, чтобы указать, что функция может возвращаться через косвенное ветвление, а не обычной инструкцией возврата. Например, это может быть верно для функций, реализующих ручное переключение контекста между потоками пользовательского пространства, таких как функция POSIX swapcontext. Этот атрибут добавляет инструкцию BTI J, если включён BTI, например с помощью -mbranch-protection.

Указанные выше целевые атрибуты можно задать следующим образом:

__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.

Правила встраивания

Указание целевых атрибутов для отдельных функций или выполнение оптимизации при компоновке для единиц трансляции, скомпилированных с разными целевыми параметрами, может повлиять на правила встраивания функций:

В частности, функция-вызыватель может встроить вызываемую функцию, только если архитектурные возможности, доступные вызываемой функции, являются подмножеством возможностей, доступных функции-вызывателю. Например, функция 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-15.3.0/gcc/AArch64-Function-Attributes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API