6.4.1.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указывает компилятору использовать ABI Microsoft, а атрибутsysv_abi— использовать ABI System V ELF, применяемый в GNU/Linux и других системах. По умолчанию при компиляции для Windows используется ABI Microsoft. Во всех остальных системах по умолчанию используется ABI System V ELF.Обратите внимание: атрибут
ms_abiдля целевых платформ Microsoft Windows 64-bit в настоящее время требует параметра -maccumulate-outgoing-args. -
callee_pop_aggregate_return (number) -
На целевых платформах x86-32 этот атрибут можно использовать для управления тем, как структуры возвращаются в памяти. Если вызывающая сторона отвечает за удаление из стека скрытого указателя вместе с остальными аргументами, укажите для number значение ноль. Если за удаление скрытого указателя отвечает вызываемая сторона, укажите для number значение один.
В ABI x86-32 по умолчанию предполагается, что вызываемая сторона удаляет из стека скрытый указатель. Однако на целевых платформах x86-32 Microsoft Windows компилятор предполагает, что скрытый указатель удаляет из стека вызывающая сторона.
-
ms_hook_prologue -
На 32-разрядных и 64-разрядных целевых платформах x86 этот атрибут функции можно использовать, чтобы GCC генерировал пролог функции с поддержкой «горячей замены» (hot-patching), используемый в функциях Win32 API в Microsoft Windows XP Service Pack 2 и более новых версиях.
-
naked -
Этот атрибут позволяет компилятору сформировать необходимое объявление функции, оставляя возможность задать тело функции на ассемблере. Для указанной функции компилятор не генерирует последовательности пролога и эпилога. В функции без пролога (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 байтам, с современным кодом, использующим стек с выравниванием по 16 байтам для совместимости с SSE. -
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.
- ‘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.
- ‘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.
- ‘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’
- ‘no-avx10.1’
-
Включить генерацию инструкций AVX10.1 с поддержкой 512 бит. Отключить генерацию инструкций AVX10.1.
- ‘avx10.1-512’
- ‘no-avx10.1-512’
-
Включить генерацию инструкций AVX10.1 с поддержкой 512 бит. Отключить генерацию инструкций AVX10.1.
- ‘avx10.2’
- ‘no-avx10.2’
-
Включить или отключить генерацию инструкций AVX10.2.
- ‘amx-avx512’
- ‘no-amx-avx512’
-
Включить или отключить генерацию инструкций AMX-AVX512.
- ‘amx-tf32’
- ‘no-amx-tf32’
-
Включить или отключить генерацию инструкций AMX-TF32.
- ‘amx-transpose’
- ‘no-amx-transpose’
-
Включить или отключить генерацию инструкций AMX-TRANSPOSE.
- ‘amx-fp8’
- ‘no-amx-fp8’
-
Включить или отключить генерацию инструкций AMX-FP8.
- ‘movrs’
- ‘no-movrs’
-
Включить или отключить генерацию инструкций MOVRS.
- ‘amx-movrs’
- ‘no-amx-movrs’
-
Включить или отключить генерацию инструкций AMX-MOVRS.
- ‘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, генерируется последовательность NOP длиной 5 байт. -
fentry_section("name") -
На целевых платформах x86 атрибут
fentry_sectionзадает имя секции для записи вызовов инструментирования входа в функцию, если оно включено параметрами -pg -mrecord-mcount. -
nodirect_extern_access -
Этот атрибут, применяемый к глобальной переменной или функции, является аналогом параметра -mno-direct-extern-access.
Правила встраивания
В 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-15.3.0/gcc/x86-Function-Attributes.html