Spec-Zone.ru › GCC 6

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

Указывает, что компилятор не должен предполагать, что система обрабатывает невыровненные обращения к памяти. Поведение такое же, как для параметра командной строки -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=.

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

__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-6.5.0/gcc/AArch64-Function-Attributes.html

Spec-Zone.ru

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