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-
Этот атрибут позволяет компилятору создавать необходимое объявление функции, но при этом позволяя телу функции быть кодом ассемблера. Указанная функция не будет иметь генерируемых компилятором последовательностей пролога/эпилога. Только базовые
asmинструкции могут безопасно включаться в функции naked (см. Basic 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-
Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерываний или обработчиком исключений (в зависимости от параметров, передаваемых функции, которые поясняются далее). При наличии этого атрибута компилятор генерирует последовательности входа и выхода функции, подходящие для использования в обработчике прерываний. Инструкция
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.
- ‘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.
Далее: Атрибуты функций Xstormy16, Предыдущее: Атрибуты функций Visium, Вверх: Атрибуты функций [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/x86-Function-Attributes.html