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 ABI предполагает, что вызываемая функция удаляет из стека скрытый указатель. Однако на x86-32 целевых платформах Microsoft Windows компилятор предполагает, что вызывающая функция удаляет из стека скрытый указатель.
-
ms_hook_prologue -
На 32- и 64-битных x86 целевых платформах вы можете использовать этот атрибут функции, чтобы GCC генерировал префикс функции «hot-patching», используемый в функциях API Win32 в Microsoft Windows XP Service Pack 2 и более новых версиях.
-
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_callee_saved_registers -
Используйте этот атрибут, чтобы указать, что указанная функция не имеет регистров, сохраняемых вызываемой функцией. То есть, все регистры могут использоваться в качестве регистров-временных переменных. Например, этот атрибут можно использовать для функции, вызываемой из ассемблерной заглушки обработчика прерываний, которая сохранит все регистры и вернётся из прерывания.
-
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.
- ‘avxvnniint16’
- ‘no-avxvnniint16’
-
Включить/выключить генерацию инструкций AVXVNNIINT16.
- ‘sm3’
- ‘no-sm3’
-
Включить/выключить генерацию инструкций SM3.
- ‘sha512’
- ‘no-sha512’
-
Включить/выключить генерацию инструкций SHA512.
- ‘sm4’
- ‘no-sm4’
-
Включить/выключить генерацию инструкций SM4.
- ‘usermsr’
- ‘no-usermsr’
-
Включить/выключить генерацию инструкций USER_MSR.
- ‘apxf’
- ‘no-apxf’
-
Включить/выключить генерацию функций APX, включая EGPR, PUSH2POP2, NDD и PPX.
- ‘avx10.1’
- ‘no-avx10.1’
-
Включить/выключить генерацию инструкций AVX10.1.
- ‘avx10.1-256’
- ‘no-avx10.1-256’
-
Включить/выключить генерацию инструкций AVX10.1.
- ‘avx10.1-512’
- ‘no-avx10.1-512’
-
Включить/выключить генерацию 512-битных инструкций AVX10.1.
- ‘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-битную ширину вектора для инструкций.
-
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.
6.33.33.1 Правила встраивания
На x86, встраиватель не встраивает функцию, у которой другие целевые параметры, чем у вызывающей функции, если у вызываемой функции нет подмножества целевых параметров вызывающей функции. Например, функция, объявленная с target("sse3"), может встроить функцию с target("sse2"), так как -msse3 подразумевает -msse2.
Помимо базового правила, когда функция указывает атрибут target("arch=ARCH") или target("tune=TUNE"), правило встраивания будет отличаться. Это позволяет встраивать функцию с указанными по умолчанию -march=x86-64 и -mtune=generic или функцию, имеющую подмножество функций ISA и помеченную как always_inline.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/x86-Function-Attributes.html