Spec-Zone.ru › GCC 8

6.31.33 Атрибуты функций x86

Эти атрибуты функций поддерживаются бэкэндом x86:

cdecl

На x86-32 целевых платформах атрибут cdecl заставляет компилятор предполагать, что вызывающая функция удаляет из стека пространство, используемое для передачи аргументов. Это полезно для переопределения эффекта переключателя -mrtd.

fastcall

На x86-32 целевых платформах атрибут fastcall заставляет компилятор передавать первый аргумент (если он имеет целочисленный тип) в регистр ECX, а второй аргумент (если он имеет целочисленный тип) – в регистр EDX. Последующие и другие типизированные аргументы передаются по стеку. Вызываемая функция удаляет аргументы из стека. Если количество аргументов изменяется, все аргументы помещаются в стек.

thiscall

На x86-32 целевых платформах атрибут thiscall заставляет компилятор передавать первый аргумент (если он имеет целочисленный тип) в регистр ECX. Последующие и другие типизированные аргументы передаются по стеку. Вызываемая функция удаляет аргументы из стека. Если количество аргументов изменяется, все аргументы помещаются в стек. Атрибут thiscall предназначен для нестатических методов C++-классов. В качестве расширения GCC, эта соглашение о вызове может быть использована для функций C и для статических методов.

ms_abi
sysv_abi

На 32-разрядных и 64-разрядных x86 целевых платформах вы можете использовать атрибут ABI для указания соглашения о вызове, которое должно быть использовано для функции. Атрибут ms_abi сообщает компилятору использовать Microsoft ABI, а атрибут sysv_abi – использовать ABI, используемый в GNU/Linux и других системах. По умолчанию используется Microsoft ABI при нацеливании на Windows. На всех других системах по умолчанию используется x86/AMD ABI.

Обратите внимание, что атрибут ms_abi для 64-битных целевых платформ Microsoft Windows в настоящее время требует опцию -maccumulate-outgoing-args.

callee_pop_aggregate_return (number)

На x86-32 целевых платформах вы можете использовать этот атрибут для управления тем, как агрегаты возвращаются в памяти. Если вызывающая функция отвечает за удаление скрытого указателя вместе со всеми остальными аргументами, установите number равным нулю. Если вызываемая функция отвечает за удаление скрытого указателя, установите number равным единице.

Стандартное соглашение о вызове x86-32 предполагает, что вызываемая функция удаляет из стека скрытый указатель. Однако на x86-32 целевых платформах Microsoft Windows компилятор предполагает, что вызывающая функция удаляет из стека скрытый указатель.

ms_hook_prologue

На 32-битных и 64-битных x86 целевых платформах вы можете использовать этот атрибут функции, чтобы GCC генерировал пролог функции «горячей подмены», используемой в функциях Win32 API в Microsoft Windows XP Service Pack 2 и более поздних версиях.

naked

Этот атрибут позволяет компилятору создать необходимое объявление функции, но при этом позволить телу функции быть кодом ассемблера. Указанная функция не будет иметь пролога/эпилога, генерируемых компилятором. В функциях naked можно безопасно включать только базовые asm инструкции (см. Basic Asm). Использование расширенных asm инструкций или смешанного кода с базовыми asm инструкциями и C-кодом может работать, но не гарантирует надежной работы и не поддерживается.

regparm (number)

На x86-32 целевых платформах атрибут regparm заставляет компилятор передавать аргументы с номерами от одного до number (если они имеют целочисленный тип) в регистрах EAX, EDX и ECX вместо стека. Функции, принимающие переменное число аргументов, по-прежнему передают все свои аргументы по стеку.

Обратите внимание, что на некоторых системах ELF этот атрибут не подходит для глобальных функций в динамически подключаемых библиотеках с отложенной привязкой (по умолчанию). Отложенная привязка отправляет первый вызов через код разрешения в загрузчике, который может предположить, что EAX, EDX и ECX могут быть изменены, согласно стандартным соглашениям о вызове. Solaris 8 подвержен этому. Предполагается, что системы с библиотекой GNU C версии 2.1 или выше и FreeBSD безопасны, так как загрузчики там сохраняют EAX, EDX и ECX. (Отложенная привязка может быть отключена с помощью компоновщика или загрузчика, если это необходимо, чтобы избежать проблемы).

sseregparm

На x86-32 целевых платформах с поддержкой SSE атрибут sseregparm заставляет компилятор передавать до 3 аргументов с плавающей точкой в регистрах SSE вместо стека. Функции, принимающие переменное число аргументов, по-прежнему передают все свои аргументы с плавающей точкой по стеку.

force_align_arg_pointer

На x86 целевых платформах атрибут force_align_arg_pointer может быть применен к отдельным определениям функций, генерируя альтернативный пролог и эпилог, которые перевыравнивают стек во время выполнения при необходимости. Это позволяет смешивать устаревший код, работающий со стеком, выровненным по 4 байта, с современным кодом, использующим 16-байтовый стек для совместимости SSE.

stdcall

На x86-32 целевых платформах атрибут stdcall заставляет компилятор предполагать, что вызываемая функция удаляет из стека пространство, используемое для передачи аргументов, если она не принимает переменное количество аргументов.

no_caller_saved_registers

Используйте этот атрибут, чтобы указать, что указанная функция не имеет регистров, сохраняемых вызывающей стороной. То есть все регистры сохраняются вызываемой стороной. Например, этот атрибут может быть использован для функции, вызываемой из обработчика прерывания. Компилятор генерирует соответствующие последовательности входа и выхода в функцию для сохранения и восстановления любых изменённых регистров, за исключением регистра EFLAGS. Поскольку GCC не сохраняет состояние MPX, SSE, MMX или x87, следует использовать опцию GCC -mgeneral-regs-only для компиляции функций с атрибутом no_caller_saved_registers.

interrupt

Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерывания или обработчиком исключений (в зависимости от параметров, передаваемых функции, которые объяснены далее). При наличии этого атрибута компилятор генерирует последовательности входа и выхода в функцию, подходящие для использования в обработчике прерывания. Инструкцию IRET вместо инструкции RET используют для возврата из обработчиков прерываний. Все регистры, за исключением регистра EFLAGS, который восстанавливается инструкцией IRET, сохраняются компилятором. Поскольку GCC не сохраняет состояние MPX, SSE, MMX или x87, следует использовать опцию GCC -mgeneral-regs-only для компиляции обработчиков прерываний и исключений.

Любой код, который может прерываться без переключения стека, должен быть скомпилирован с -mno-red-zone, так как обработчики прерываний могут и будут, из-за архитектуры процессора, взаимодействовать с красной зоной.

Обработчик прерывания должен быть объявлен с обязательным аргументом-указателем:

struct interrupt_frame;

__attribute__ ((interrupt))
void
f (struct interrupt_frame *frame)
{
}

и вы должны определить struct interrupt_frame как описано в руководстве процессора.

Обработчики исключений отличаются от обработчиков прерываний тем, что система помещает код ошибки в стек. Объявление обработчика исключений аналогично обработчику прерываний, но с другой обязательной сигнатурой функции. Компилятор организует извлечение кода ошибки из стека перед инструкцией IRET.

#ifdef __x86_64__
typedef unsigned long long int uword_t;
#else
typedef unsigned int uword_t;
#endif

struct interrupt_frame;

__attribute__ ((interrupt))
void
f (struct interrupt_frame *frame, uword_t error_code)
{
  ...
}

Обработчики исключений должны использоваться только для исключений, которые помещают код ошибки в стек; в других случаях следует использовать обработчик прерываний. Система аварийно завершит работу, если будет использован неправильный тип обработчика.

target (options)

Как обсуждалось в Общие атрибуты функций, этот атрибут позволяет указать опции компиляции, специфичные для целевой платформы.

На x86 разрешены следующие опции:

‘3dnow’
‘no-3dnow’

Включить/выключить генерацию инструкций 3DNow!.

‘3dnowa’
‘no-3dnowa’

Включить/выключить генерацию расширенных инструкций 3DNow!.

‘abm’
‘no-abm’

Включить/выключить генерацию продвинутых битовых инструкций.

‘adx’
‘no-adx’

Включить/выключить генерацию инструкций ADX.

‘aes’
‘no-aes’

Включить/выключить генерацию инструкций AES.

‘avx’
‘no-avx’

Включить/выключить генерацию инструкций AVX.

‘avx2’
‘no-avx2’

Включить/выключить генерацию инструкций AVX2.

‘avx5124fmaps’
‘no-avx5124fmaps’

Включить/выключить генерацию инструкций AVX5124FMAPS.

‘avx5124vnniw’
‘no-avx5124vnniw’

Включить/выключить генерацию инструкций AVX5124VNNIW.

‘avx512bitalg’
‘no-avx512bitalg’

Включить/выключить генерацию инструкций AVX512BITALG.

‘avx512bw’
‘no-avx512bw’

Включить/выключить генерацию инструкций AVX512BW.

‘avx512cd’
‘no-avx512cd’

Включить/выключить генерацию инструкций AVX512CD.

‘avx512dq’
‘no-avx512dq’

Включить/выключить генерацию инструкций AVX512DQ.

‘avx512er’
‘no-avx512er’

Включить/выключить генерацию инструкций AVX512ER.

‘avx512f’
‘no-avx512f’

Включить/выключить генерацию инструкций AVX512F.

‘avx512ifma’
‘no-avx512ifma’

Включить/выключить генерацию инструкций AVX512IFMA.

‘avx512pf’
‘no-avx512pf’

Включить/выключить генерацию инструкций AVX512PF.

‘avx512vbmi’
‘no-avx512vbmi’

Включить/выключить генерацию инструкций AVX512VBMI.

‘avx512vbmi2’
‘no-avx512vbmi2’

Включить/выключить генерацию инструкций AVX512VBMI2.

‘avx512vl’
‘no-avx512vl’

Включить/выключить генерацию инструкций AVX512VL.

‘avx512vnni’
‘no-avx512vnni’

Включить/выключить генерацию инструкций AVX512VNNI.

‘avx512vpopcntdq’
‘no-avx512vpopcntdq’

Включить/выключить генерацию инструкций AVX512VPOPCNTDQ.

‘bmi’
‘no-bmi’

Включить/выключить генерацию инструкций BMI.

‘bmi2’
‘no-bmi2’

Включить/выключить генерацию инструкций BMI2.

‘clflushopt’
‘no-clflushopt’

Включить/выключить генерацию инструкций CLFLUSHOPT.

‘clwb’
‘no-clwb’

Включить/выключить генерацию инструкций CLWB.

‘clzero’
‘no-clzero’

Включить/выключить генерацию инструкций CLZERO.

‘crc32’
‘no-crc32’

Включить/выключить генерацию инструкций CRC32.

‘cx16’
‘no-cx16’

Включить/выключить генерацию инструкций CMPXCHG16B.

‘default’

См. Функциональное многоверсионирование, где оно используется для указания значения по умолчанию для версии функции.

‘f16c’
‘no-f16c’

Включить/выключить генерацию инструкций F16C.

‘fma’
‘no-fma’

Включить/выключить генерацию инструкций FMA.

‘fma4’
‘no-fma4’

Включить/выключить генерацию инструкций FMA4.

‘fsgsbase’
‘no-fsgsbase’

Включить/выключить генерацию инструкций FSGSBASE.

‘fxsr’
‘no-fxsr’

Включить/выключить генерацию инструкций FXSR.

‘gfni’
‘no-gfni’

Включить/выключить генерацию инструкций GFNI.

‘hle’
‘no-hle’

Включить/выключить генерацию префиксов инструкций HLE.

‘lwp’
‘no-lwp’

Включить/выключить генерацию инструкций LWP.

‘lzcnt’
‘no-lzcnt’

Включить/выключить генерацию инструкций LZCNT.

‘mmx’
‘no-mmx’

Включить/выключить генерацию инструкций MMX.

‘movbe’
‘no-movbe’

Включить/выключить генерацию инструкций MOVBE.

‘movdir64b’
‘no-movdir64b’

Включить/выключить генерацию инструкций MOVDIR64B.

‘movdiri’
‘no-movdiri’

Включить/выключить генерацию инструкций MOVDIRI.

‘mwaitx’
‘no-mwaitx’

Включить/выключить генерацию инструкций MWAITX.

‘pclmul’
‘no-pclmul’

Включить/выключить генерацию инструкций PCLMUL.

‘pconfig’
‘no-pconfig’

Включить/выключить генерацию инструкций PCONFIG.

‘pku’
‘no-pku’

Включить/выключить генерацию инструкций PKU.

‘popcnt’
‘no-popcnt’

Включить/выключить генерацию инструкции POPCNT.

‘prefetchwt1’
‘no-prefetchwt1’

Включить/выключить генерацию инструкций PREFETCHWT1.

‘prfchw’
‘no-prfchw’

Включить/выключить генерацию инструкции PREFETCHW.

‘rdpid’
‘no-rdpid’

Включить/выключить генерацию инструкций RDPID.

‘rdrnd’
‘no-rdrnd’

Включить/выключить генерацию инструкций RDRND.

‘rdseed’
‘no-rdseed’

Включить/выключить генерацию инструкций RDSEED.

‘rtm’
‘no-rtm’

Включить/выключить генерацию инструкций RTM.

‘sahf’
‘no-sahf’

Включить/выключить генерацию инструкций SAHF.

‘sgx’
‘no-sgx’

Включить/выключить генерацию инструкций SGX.

‘sha’
‘no-sha’

Включить/выключить генерацию инструкций SHA.

‘shstk’
‘no-shstk’

Включить/выключить встроенные функции теневого стека из CET.

‘sse’
‘no-sse’

Включить/выключить генерацию инструкций SSE.

‘sse2’
‘no-sse2’

Включить/выключить генерацию инструкций SSE2.

‘sse3’
‘no-sse3’

Включить/выключить генерацию инструкций SSE3.

‘sse4’
‘no-sse4’

Включить/выключить генерацию инструкций SSE4 (SSE4.1 и SSE4.2).

‘sse4.1’
‘no-sse4.1’

Включить/выключить генерацию инструкций sse4.1.

‘sse4.2’
‘no-sse4.2’

Включить/выключить генерацию инструкций sse4.2.

‘sse4a’
‘no-sse4a’

Включить/выключить генерацию инструкций SSE4A.

‘ssse3’
‘no-ssse3’

Включить/выключить генерацию инструкций SSSE3.

‘tbm’
‘no-tbm’

Включить/выключить генерацию инструкций TBM.

‘vaes’
‘no-vaes’

Включить/выключить генерацию инструкций VAES.

‘vpclmulqdq’
‘no-vpclmulqdq’

Включить/выключить генерацию инструкций VPCLMULQDQ.

‘wbnoinvd’
‘no-wbnoinvd’

Включить/выключить генерацию инструкций WBNOINVD.

‘xop’
‘no-xop’

Включить/выключить генерацию инструкций XOP.

‘xsave’
‘no-xsave’

Включить/выключить генерацию инструкций XSAVE.

‘xsavec’
‘no-xsavec’

Включить/выключить генерацию инструкций XSAVEC.

‘xsaveopt’
‘no-xsaveopt’

Включить/выключить генерацию инструкций XSAVEOPT.

‘xsaves’
‘no-xsaves’

Включить/выключить генерацию инструкций XSAVES.

‘cld’
‘no-cld’

Включить/выключить генерацию CLD перед операциями перемещения строк.

‘fancy-math-387’
‘no-fancy-math-387’

Включить/выключить генерацию инструкций sin, cos, и sqrt на 387-ом блоке плавающей точки.

‘ieee-fp’
‘no-ieee-fp’

Включить/выключить генерацию инструкций плавающей точки, зависящих от арифметики IEEE.

‘inline-all-stringops’
‘no-inline-all-stringops’

Включить/выключить встраивание операций со строками.

‘inline-stringops-dynamically’
‘no-inline-stringops-dynamically’

Включить/выключить генерацию встроенного кода для небольших операций со строками и вызов библиотечных функций для больших операций.

‘align-stringops’
‘no-align-stringops’

Выровнять/не выравнивать место назначения встроенных операций со строками.

‘recip’
‘no-recip’

Включить/выключить генерацию инструкций RCPSS, RCPPS, RSQRTSS и RSQRTPS, за которыми следует дополнительный шаг Ньютона-Рафсона вместо выполнения деления с плавающей точкой.

‘arch=ARCH’

Указать архитектуру для генерации кода при компиляции функции.

‘tune=TUNE’

Указать архитектуру для настройки при компиляции функции.

‘fpmath=FPMATH’

Указать, какой блок плавающей точки использовать. Вы должны указать опцию target("fpmath=sse,387") как target("fpmath=sse+387"), так как запятая будет разделять различные опции.

‘indirect_branch("choice")’

На x86-целевых платформах атрибут indirect_branch заставляет компилятор преобразовывать косвенный вызов и переход с choice. ‘keep’ сохраняет косвенный вызов и переход без изменений. ‘thunk’ преобразует косвенный вызов и переход в вызов и возврат thunk. ‘thunk-inline’ преобразует косвенный вызов и переход в встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует косвенный вызов и переход во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле.

‘function_return("choice")’

На x86-целевых платформах атрибут function_return заставляет компилятор преобразовывать возвращение функции с choice. ‘keep’ сохраняет возвращение функции без изменений. ‘thunk’ преобразует возвращение функции в вызов и возврат thunk. ‘thunk-inline’ преобразует возвращение функции во встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует возвращение функции во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле.

‘nocf_check’

Атрибут nocf_check для функции сообщает компилятору, что пролог функции не должен быть инструментирован при компиляции с опцией -fcf-protection=branch. Компилятор предполагает, что адрес функции является допустимой целью передачи управления.

Атрибут nocf_check для типа указателя на функцию сообщает компилятору, что вызов через указатель не должен быть инструментирован при компиляции с опцией -fcf-protection=branch. Компилятор предполагает, что адрес функции из указателя является допустимой целью передачи управления. Прямой вызов функции через имя функции предполагается безопасным, поэтому прямые вызовы не инструментируются компилятором.

Атрибут nocf_check применяется к типу объекта. В случае присваивания адреса функции или указателя на функцию другому указателю атрибут не переносится с типа объекта справа; тип объекта слева остается неизменным. Компилятор проверяет несоответствие атрибутов nocf_check и сообщает об ошибке в случае несоответствия.

{
int foo (void) __attribute__(nocf_check);
void (*foo1)(void) __attribute__(nocf_check);
void (*foo2)(void);

/* foo's address is assumed to be valid.  */
int
foo (void) 

  /* This call site is not checked for control-flow 
     validity.  */
  (*foo1)();

  /* A warning is issued about attribute mismatch.  */
  foo1 = foo2; 

  /* This call site is still not checked.  */
  (*foo1)();

  /* This call site is checked.  */
  (*foo2)();

  /* A warning is issued about attribute mismatch.  */
  foo2 = foo1; 

  /* This call site is still checked.  */
  (*foo2)();

  return 0;
}

На x86-платформе встраиватель не встраивает функцию, которая имеет разные целевые параметры, чем вызывающая функция, если только функция-получатель не имеет подмножества целевых параметров вызывающей функции. Например, функция, объявленная с target("sse3"), может встроить функцию с target("sse2"), так как -msse3 подразумевает -msse2.

Далее: Атрибуты функций Xstormy16, Предыдущее: Атрибуты функций Visium, Наверх: Атрибуты функций [Оглавление][Индекс]

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

Spec-Zone.ru

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