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 ABI предполагает, что функция-получатель удаляет из стека скрытый указатель. Однако на x86-32 целевых платформах Microsoft Windows компилятор предполагает, что вызывающая функция удаляет из стека скрытый указатель.
ms_hook_prologue-
На 32-битных и 64-битных x86 целевых платформах вы можете использовать этот атрибут функции, чтобы заставить GCC сгенерировать «пролог для горячей корректировки» функции, используемый в функциях 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. ‘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; } 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.
Далее: Атрибуты функций Xstormy16, Предыдущее: Атрибуты функций Visium, Вверх: Атрибуты функций [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/x86-Function-Attributes.html