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сообщает компилятору использовать соглашение 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инструкции (см. Базовый ассемблер — ассемблерные инструкции без операндов). Использование расширенных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, следует использовать опцию GCC -mgeneral-regs-only для компиляции функций с атрибутом
no_caller_saved_registers. interrupt-
Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерывания или обработчиком исключений (в зависимости от параметров, передаваемых функции, подробно описанных ниже). При наличии этого атрибута компилятор генерирует вводные и выходные последовательности функции, подходящие для использования в обработчике прерывания. Вместо инструкции
RETиспользуется инструкцияIRETдля возврата из обработчиков прерываний. Все регистры, кроме регистра 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.
- ‘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.
- ‘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-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, генерируется последовательность из 5 байт nop. - ‘fentry_section("name")’
-
На x86-целевых платформах атрибут
fentry_sectionустанавливает имя секции для записи вызовов инструментации входа в функцию при включении с помощью -pg -mrecord-mcount.
На x86-платформах встроенный механизм не встраивает функцию, которая имеет разные целевые опции, чем вызывающая функция, если только функция вызываемого объекта не имеет подмножества целевых опций вызывающей функции. Например, функция, объявленная с
target("sse3"), может встраивать функцию сtarget("sse2"), так как-msse3подразумевает-msse2.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/x86-Function-Attributes.html