Spec-Zone.ru › GCC 6

6.31.32 Атрибуты функций 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 сообщает компилятору использовать соглашение 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 равным единице.

По умолчанию ABI x86-32 предполагает, что вызываемая функция удаляет из стека скрытый указатель. Однако на целевых платформах x86-32 Microsoft Windows компилятор предполагает, что вызывающая функция удаляет из стека скрытый указатель.

ms_hook_prologue

На 32-битных и 64-битных целевых платформах x86 вы можете использовать этот атрибут функции, чтобы заставить GCC генерировать пролог функции «горячего исправления», используемый в функциях Win32 API в Microsoft Windows XP Service Pack 2 и более поздних версиях.

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 заставляет компилятор предполагать, что вызываемая функция удаляет из стека место, используемое для передачи аргументов, если только она не принимает переменное количество аргументов.

target (options)
END_OF_DOCUMENT_MARKER

Как обсуждалось в Общие атрибуты функций, этот атрибут позволяет указать опции компиляции, специфичные для целевой платформы.

На x86 разрешены следующие опции:

‘abm’
‘no-abm’

Включить/выключить генерацию инструкций расширенных битовых операций.

‘aes’
‘no-aes’

Включить/выключить генерацию инструкций AES.

‘default’

См. Мультиверсионирование функций, где он используется для указания версии функции по умолчанию.

‘mmx’
‘no-mmx’

Включить/выключить генерацию инструкций MMX.

‘pclmul’
‘no-pclmul’

Включить/выключить генерацию инструкций PCLMUL.

‘popcnt’
‘no-popcnt’

Включить/выключить генерацию инструкции POPCNT.

‘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.

‘fma4’
‘no-fma4’

Включить/выключить генерацию инструкций FMA4.

‘xop’
‘no-xop’

Включить/выключить генерацию инструкций XOP.

‘lwp’
‘no-lwp’

Включить/выключить генерацию инструкций LWP.

‘ssse3’
‘no-ssse3’

Включить/выключить генерацию инструкций SSSE3.

‘cld’
‘no-cld’

Включить/выключить генерацию CLD перед операциями перемещения строк.

‘fancy-math-387’
‘no-fancy-math-387’

Включить/выключить генерацию инструкций sin, cos, и sqrt на 387-ом блоке обработки чисел с плавающей запятой.

‘fused-madd’
‘no-fused-madd’

Включить/выключить генерацию инструкций сложения/умножения.

‘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. ‘thunk-inline’ преобразует косвенный вызов и переход во встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует косвенный вызов и переход во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле.

‘function_return("choice")’

На x86-целевых платформах атрибут function_return заставляет компилятор преобразовывать возврат функции с помощью choice. ‘keep’ оставляет возврат функции без изменений. ‘thunk’ преобразует возврат функции в вызов и возврат thunk. ‘thunk-inline’ преобразует возврат функции во встроенный вызов и возврат thunk. ‘thunk-extern’ преобразует возврат функции во внешний вызов и возврат thunk, предоставленный в отдельном объектом файле.

На 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-6.5.0/gcc/x86-Function-Attributes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API