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_abisysv_abiНа целевых платформах x86 с 32- и 64-битными архитектурами вы можете использовать атрибут 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 ABI предполагает, что вызываемая сторона удаляет из стека скрытый указатель. Однако на x86-32 целевых платформах Microsoft Windows компилятор предполагает, что вызывающая сторона удаляет из стека скрытый указатель.
ms_hook_prologueНа целевых платформах x86 с 32- и 64-битными архитектурами вы можете использовать этот атрибут функции, чтобы заставить 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 версии 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 не сохраняет состояния MPX, SSE, MMX и x87, для компиляции функций с атрибутом
no_caller_saved_registersдолжна использоваться опция GCC -mgeneral-regs-only.interruptИспользуйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерывания или обработчиком исключений (в зависимости от параметров, переданных в функцию, что объясняется далее). Когда этот атрибут присутствует, компилятор генерирует последовательности входа и выхода из функции, подходящие для использования в обработчике прерывания. Инструкции
IRET, а неRET, используются для возвращения из обработчиков прерываний. Все регистры, кроме регистра EFLAGS, который восстанавливается инструкциейIRET, сохраняются компилятором. Поскольку GCC не сохраняет состояния MPX, 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 разрешены следующие опции:
- ‘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-ом блоке обработки чисел с плавающей точкой. - ‘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’ преобразует возврат из функции во внешний вызов и возврат тхунк, предоставленный в отдельном объектом файле.
На 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-7.5.0/gcc/x86-Function-Attributes.html