Spec-Zone.ru › GCC 12

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-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=, не конфликтует с правилами архитектурных особенностей, указанными выше.

Далее: Атрибуты функций AMD GCN, Предыдущее: Общие атрибуты функций, Вверх: Атрибуты функций [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/AArch64-Function-Attributes.html

Spec-Zone.ru

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