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-
На целевых платформах x86-32 и x86-64 можно использовать атрибут ABI, чтобы указать соглашение о вызовах для функции. Атрибут
ms_abiуказывает компилятору использовать ABI Microsoft, а атрибутsysv_abi— ABI System V ELF, применяемый в GNU/Linux и других системах. При компиляции для Windows по умолчанию используется ABI Microsoft. Во всех остальных системах по умолчанию используется ABI System V ELF.Обратите внимание: для атрибута
ms_abiна целевых 64-разрядных платформах Microsoft Windows в настоящее время требуется параметр -maccumulate-outgoing-args. -
callee_pop_aggregate_return (number) -
На целевых платформах x86-32 этот атрибут позволяет управлять тем, как агрегатные типы возвращаются через память. Если за удаление скрытого указателя вместе с остальными аргументами отвечает вызывающая функция, укажите для number значение ноль. Если за удаление скрытого указателя отвечает вызываемая функция, укажите для number значение один.
ABI x86-32 по умолчанию предполагает, что вызываемая функция удаляет из стека скрытый указатель. Однако на целевых платформах Microsoft Windows x86-32 компилятор предполагает, что скрытый указатель удаляет из стека вызывающая функция.
-
ms_hook_prologue -
На целевых платформах x86-32 и x86-64 этот атрибут функции позволяет заставить GCC генерировать пролог функции с «горячей заплаткой», используемый в функциях Win32 API в Microsoft Windows XP Service Pack 2 и более поздних версиях.
-
naked -
Этот атрибут позволяет компилятору создать необходимое объявление функции, оставляя при этом тело функции на языке ассемблера. Для указанной функции компилятор не генерирует последовательности пролога и эпилога. В функции без пролога и эпилога безопасно использовать только базовые инструкции
asm(см. Базовый 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заставляет компилятор передавать до трех аргументов с плавающей точкой в регистрах SSE, а не через стек. Функции с переменным числом аргументов по-прежнему передают все аргументы с плавающей точкой через стек. -
force_align_arg_pointer -
На целевых платформах x86 атрибут
force_align_arg_pointerможно применять к отдельным определениям функций. При необходимости он генерирует альтернативные пролог и эпилог, выравнивающие стек во время выполнения. Это позволяет сочетать старый код, работающий с выравниванием стека на 4 байта, с современным кодом, в котором для совместимости с SSE используется выравнивание стека на 16 байт. -
stdcall -
На целевых платформах x86-32 атрибут
stdcallзаставляет компилятор предполагать, что вызываемая функция удаляет из стека область, использованную для передачи аргументов, если только она не принимает переменное число аргументов. -
no_callee_saved_registers -
Используйте этот атрибут, чтобы указать, что у заданной функции нет регистров, сохраняемых вызываемой функцией. То есть все регистры можно использовать как временные. Например, этот атрибут можно использовать для функции, вызываемой из ассемблерной заглушки обработчика прерываний, которая сохраняет все регистры и возвращается из прерывания.
-
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.
- ‘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-256’
- ‘no-avx10.1-256’
-
Включить генерацию инструкций AVX10.1 с поддержкой 256 бит. Отключить генерацию инструкций AVX10.1.
- ‘avx10.1-512’
- ‘no-avx10.1-512’
-
Включить генерацию инструкций AVX10.1 с поддержкой 512 бит. Отключить генерацию инструкций AVX10.1.
- ‘avx10.1’
- ‘no-avx10.1’
-
Включить генерацию инструкций AVX10.1 с поддержкой 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-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функции используется для уведомления компилятора о том, что при включённом параметре -fcf-protection=branch в точке входа функции следует разместить инструкцию ENDBR. -
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.4.0/gcc/x86-Function-Attributes.html