Spec-Zone.ru › GCC 13

6.33.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 сообщает компилятору использовать соглашение System V ELF ABI, используемое в GNU/Linux и других системах. По умолчанию используется Microsoft ABI при нацеливании на Windows. На всех других системах по умолчанию используется System V ELF 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 генерировать префикс функции «hot-patching», используемый в функциях Win32 API в Microsoft Windows XP Service Pack 2 и более поздних версиях.

naked

Этот атрибут позволяет компилятору создать необходимое объявление функции, при этом позволяя телу функции быть кодом ассемблера. Указанная функция не будет иметь префиксов/постфиксов, сгенерированных компилятором. Только базовые asm инструкции могут безопасно включаться в функции naked (см. Основные ассемблерные инструкции без операндов). Использование расширенных 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 не сохраняет состояния SSE, MMX и x87, следует использовать опцию GCC -mgeneral-regs-only для компиляции функций с атрибутом no_caller_saved_registers.

interrupt

Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерываний или обработчиком исключений (в зависимости от параметров, передаваемых функции, которые будут объяснены далее). При наличии этого атрибута компилятор генерирует последовательности входа и выхода функции, подходящие для использования в обработчике прерываний. Инструкцию IRET вместо инструкции RET используется для возвращения из обработчиков прерываний. Все регистры, за исключением регистра EFLAGS, который восстанавливается инструкцией IRET, сохраняются компилятором. Поскольку GCC не сохраняет состояния 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.

‘cldemote’
‘no-cldemote’

Включить/отключить генерацию инструкций CLDEMOTE.

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

‘mwait’
‘no-mwait’

Включить/отключить генерацию инструкций MWAIT и MONITOR.

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

‘ptwrite’
‘no-ptwrite’

Включить/отключить генерацию инструкций PTWRITE.

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

‘waitpkg’
‘no-waitpkg’

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

‘wbnoinvd’
‘no-wbnoinvd’

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

‘xop’
‘no-xop’

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

‘xsave’
‘no-xsave’

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

‘xsavec’
‘no-xsavec’

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

‘xsaveopt’
‘no-xsaveopt’

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

‘xsaves’
‘no-xsaves’

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

‘amx-tile’
‘no-amx-tile’

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

‘amx-int8’
‘no-amx-int8’

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

‘amx-bf16’
‘no-amx-bf16’

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

‘uintr’
‘no-uintr’

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

‘hreset’
‘no-hreset’

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

‘kl’
‘no-kl’

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

‘widekl’
‘no-widekl’

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

‘avxvnni’
‘no-avxvnni’

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

‘avxifma’
‘no-avxifma’

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

‘avxvnniint8’
‘no-avxvnniint8’

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

‘avxneconvert’
‘no-avxneconvert’

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

‘cmpccxadd’
‘no-cmpccxadd’

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

‘amx-fp16’
‘no-amx-fp16’

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

‘prefetchi’
‘no-prefetchi’

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

‘raoint’
‘no-raoint’

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

‘amx-complex’
‘no-amx-complex’

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

‘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, за которыми следует дополнительный шаг Ньютона-Рафсона вместо выполнения деления с плавающей точкой.

‘general-regs-only’

Генерировать код, использующий только регистры общего назначения.

‘arch=ARCH’

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

‘tune=TUNE’

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

‘fpmath=FPMATH’

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

‘prefer-vector-width=OPT’

На x86-целевых платформах атрибут prefer-vector-width информирует компилятор использовать векторную ширину OPT бит в инструкциях вместо значения по умолчанию на выбранной платформе.

Допустимые значения для OPT:

‘none’

Для GCC не применяются дополнительные ограничения, кроме определенных на выбранной платформе.

‘128’

Предпочитать векторную ширину 128 бит для инструкций.

‘256’

Предпочитать векторную ширину 256 бит для инструкций.

‘512’

Предпочитать векторную ширину 512 бит для инструкций.

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

indirect_branch("choice")

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

function_return("choice")

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

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;
}
cf_check

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

indirect_return

Атрибут indirect_return может быть применён к функции, а также переменной или типу указателя на функцию, чтобы сообщить компилятору, что функция может возвращаться через косвенное ветвление.

fentry_name("name")

На x86-целевых платформах атрибут fentry_name устанавливает функцию для вызова при входе в функцию, когда включена инструментация функций с опцией -pg -mfentry. Если name является nop, то генерируется последовательность из 5 байтов nop.

fentry_section("name")

На x86-целевых платформах атрибут fentry_section задаёт имя секции для записи вызовов инструментации входа в функцию, когда включена опция -pg -mrecord-mcount.

nodirect_extern_access

Этот атрибут, прикреплённый к глобальной переменной или функции, является аналогом опции -mno-direct-extern-access.

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

Spec-Zone.ru

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