6.33.35 Атрибуты функций x86 ¶
Эти атрибуты функций поддерживаются бэкендом x86:
cdecl-
На x86-32 целевых платформах атрибут
cdeclзаставляет компилятор предполагать, что вызывающая функция удаляет из стека пространство, используемое для передачи аргументов. Это полезно для отмены эффекта ключа -mrtd. fastcall-
На x86-32 целевых платформах атрибут
fastcallзаставляет компилятор передавать первый аргумент (если он целого типа) в регистр ECX, а второй аргумент (если он целого типа) — в регистр EDX. Последующие и другие аргументы передаются в стеке. Вызываемая функция удаляет аргументы из стека. Если число аргументов является переменным, все аргументы помещаются в стек. thiscall-
На x86-32 целевых платформах атрибут
thiscallзаставляет компилятор передавать первый аргумент (если он целого типа) в регистр ECX. Последующие и другие аргументы передаются в стеке. Вызываемая функция удаляет аргументы из стека. Если число аргументов является переменным, все аргументы помещаются в стек. Атрибутthiscallпредназначен для нестатических методов C++ классов. Как расширение GCC, данная соглашение о вызовах может использоваться для C-функций и статических методов. ms_abisysv_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-
Этот атрибут позволяет компилятору создать необходимое объявление функции, позволяя содержать тело функции в ассемблерном коде. Указанная функция не будет иметь пролога/эпилога, сгенерированных компилятором. В функциях `naked` безопасно включать только базовые
asmоператоры (см. Основные операторы ассемблера без операндов). Хотя использование расширенныхasmили сочетание базовыхasmи C-кода может, кажется, работать, их нельзя использовать надежно и они не поддерживаются. regparm (number)-
На x86-32 целевых платформах атрибут
regparmзаставляет компилятор передавать аргументы с номерами от единицы до number (если они имеют целочисленный тип) в регистры EAX, EDX и ECX вместо стека. Функции, принимающие переменное число аргументов, по-прежнему передают все свои аргументы в стеке.Обратите внимание, что в некоторых системах ELF этот атрибут непригоден для глобальных функций в динамических библиотеках с отложенной привязкой (по умолчанию). Отложенная привязка отправляет первый вызов через код разрешения в загрузчике, который может предположить, что EAX, EDX и ECX могут быть изменены в соответствии со стандартными соглашениями о вызовах. Система Solaris 8 затронута этим. Предполагается, что системы с GNU C Library версии 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, для компиляции функций с атрибутом
no_caller_saved_registersследует использовать опцию GCC -mgeneral-regs-only. 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.
- ‘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’ преобразует косвенный вызов и переход в вызов и возврат туннеля. ‘thunk-inline’ преобразует косвенный вызов и переход во встроенный вызов и возврат туннеля. ‘thunk-extern’ преобразует косвенный вызов и переход во внешний вызов и возврат туннеля, предоставленный в отдельном объектом файле. function_return("choice")-
На x86-целевых платформах атрибут
function_returnзаставляет компилятор преобразовывать возврат функции с choice. ‘keep’ сохраняет возврат функции без изменений. ‘thunk’ преобразует возврат функции в вызов и возврат туннеля. ‘thunk-inline’ преобразует возврат функции во встроенный вызов и возврат туннеля. ‘thunk-extern’ преобразует возврат функции во внешний вызов и возврат туннеля, предоставленный в отдельном объектом файле. 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, генерируется последовательность nop длиной 5 байт. fentry_section("name")-
На x86-целевых платформах атрибут
fentry_sectionзадаёт имя секции для записи вызовов инструментации входа в функцию при включении с помощью опции -pg -mrecord-mcount
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/x86-Function-Attributes.html