Spec-Zone.ru › GCC 14

3.19.5 Параметры ARM

Эти параметры ‘-m’ определены для порта ARM:

-mabi=name

Генерировать код для указанного ABI. Допустимые значения: ‘apcs-gnu’, ‘atpcs’, ‘aapcs’, ‘aapcs-linux’ и ‘iwmmxt’.

-mapcs-frame

Генерировать кадр стека, совместимый со стандартом вызовов процедур ARM для всех функций, даже если это не строго необходимо для корректной работы кода. Указание -fomit-frame-pointer с этим параметром приводит к тому, что кадры стека не генерируются для функций-листьев. По умолчанию используется -mno-apcs-frame. Этот параметр устарел.

-mapcs

Это синоним для -mapcs-frame и устарел.

-mthumb-interwork

Генерировать код, поддерживающий вызовы между наборами команд ARM и Thumb. Без этого параметра на архитектурах до v5 два набора команд не могут надёжно использоваться внутри одной программы. По умолчанию используется -mno-thumb-interwork, так как при указании -mthumb-interwork генерируется немного больший код. В конфигурациях AAPCS этот параметр бессмысленен.

-mno-sched-prolog

Препятствовать переупорядочению инструкций в прологе функции или слиянию этих инструкций с инструкциями в теле функции. Это означает, что все функции начинаются с узнаваемого набора инструкций (или, фактически, с одного из небольшого набора различных прологов функций), и эта информация может быть использована для нахождения начала функций внутри исполняемого фрагмента кода. По умолчанию используется -msched-prolog.

-mfloat-abi=name

Указывает, какой ABI для операций с плавающей точкой использовать. Допустимые значения: ‘soft’, ‘softfp’ и ‘hard’.

Указание ‘soft’ заставляет GCC генерировать вывод, содержащий вызовы библиотек для операций с плавающей точкой. ‘softfp’ позволяет генерировать код с использованием аппаратных инструкций для плавающей точки, но при этом использует соглашения о вызовах для soft-float. ‘hard’ позволяет генерировать инструкции с плавающей точкой и использует соглашения о вызовах, специфичные для FPU.

Значение по умолчанию зависит от конкретной конфигурации целевой системы. Обратите внимание, что ABI hard-float и soft-float не совместимы при линковке; вы должны скомпилировать всю программу с одинаковым ABI и связать её с соответствующим набором библиотек.

-mgeneral-regs-only

Генерировать код, использующий только регистры общего назначения. Это предотвратит использование компилятором регистров для плавающей точки и Advanced SIMD, но не наложит никаких ограничений на ассемблер.

-mlittle-endian

Генерировать код для процессора, работающего в режиме little-endian. Это значение по умолчанию для всех стандартных конфигураций.

-mbig-endian

Генерировать код для процессора, работающего в режиме big-endian; по умолчанию код компилируется для процессора little-endian.

-mbe8
-mbe32

При линковке big-endian изображения выбирайте между форматами BE8 и BE32. Параметр не оказывает влияния на little-endian изображения и игнорируется. По умолчанию зависит от выбранной целевой архитектуры. Для архитектур ARMv6 и более поздних значение по умолчанию BE8, для более старых архитектур — BE32. Формат BE32 устарел ARM.

-march=name[+extension…]

Это определяет имя целевой архитектуры ARM. GCC использует это имя для определения типа инструкций, которые могут быть выпущены при генерации ассемблерного кода. Этот параметр может быть использован вместе с или вместо параметра -mcpu=.

Допустимые имена: ‘armv4t’, ‘armv5t’, ‘armv5te’, ‘armv6’, ‘armv6j’, ‘armv6k’, ‘armv6kz’, ‘armv6t2’, ‘armv6z’, ‘armv6zk’, ‘armv7’, ‘armv7-a’, ‘armv7ve’, ‘armv8-a’, ‘armv8.1-a’, ‘armv8.2-a’, ‘armv8.3-a’, ‘armv8.4-a’, ‘armv8.5-a’, ‘armv8.6-a’, ‘armv9-a’, ‘armv7-r’, ‘armv8-r’, ‘armv6-m’, ‘armv6s-m’, ‘armv7-m’, ‘armv7e-m’, ‘armv8-m.base’, ‘armv8-m.main’, ‘armv8.1-m.main’, ‘armv9-a’, ‘iwmmxt’ и ‘iwmmxt2’.

Кроме того, следующие архитектуры, не поддерживающие состояние выполнения Thumb, распознаются, но поддержка устарела: ‘armv4’.

Многие архитектуры поддерживают расширения. Их можно добавить, добавив ‘+расширение’ к имени архитектуры. Параметры расширений обрабатываются в порядке следования, и возможности накапливаются. Расширение также включит все необходимые базовые расширения, от которых оно зависит. Например, расширение ‘+crypto’ всегда включит расширение ‘+simd’. Исключением из аддитивного построения являются расширения, которые имеют префикс ‘+no…’: эти расширения отключают указанный параметр и любые другие расширения, которые могут зависеть от наличия этого расширения.

Например, ‘-march=armv7-a+simd+nofp+vfpv4’ эквивалентно написанию ‘-march=armv7-a+vfpv4’, так как параметр ‘+simd’ полностью отключён параметром ‘+nofp’, который следует за ним.

Большинство имён расширений имеют общее название, но имеют действие, зависящее от архитектуры, к которой они применяются. Например, параметр ‘+simd’ может быть применён как к архитектуре ‘armv7-a’, так и к архитектуре ‘armv8-a’, но включит исходные расширения Advanced SIMD (Neon) ARMv7-A для ‘armv7-a’ и вариант ARMv8-A для ‘armv8-a’.

В таблице ниже перечислены поддерживаемые расширения для каждой архитектуры. Архитектуры, не указанные в таблице, не поддерживают никаких расширений.

END_OF_DOCUMENT_MARKER
‘armv5te’
‘armv6’
‘armv6j’
‘armv6k’
‘armv6kz’
‘armv6t2’
‘armv6z’
‘armv6zk’
‘+fp’

Инструкции с плавающей запятой VFPv2. Расширение ‘+vfpv2’ может использоваться как псевдоним для этого расширения.

‘+nofp’

Отключение инструкций с плавающей запятой.

‘armv7’

Общий подмножество архитектур ARMv7-A, ARMv7-R и ARMv7-M.

‘+fp’

Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности. Расширение ‘+vfpv3-d16’ может использоваться как псевдоним для этого расширения. Обратите внимание, что плавающая запятая не поддерживается базовой архитектурой ARMv7-M, но совместима с архитектурами ARMv7-A и ARMv7-R.

‘+nofp’

Отключение инструкций с плавающей запятой.

‘armv7-a’
‘+mp’

Расширение для многопроцессорных систем.

‘+sec’

Расширение безопасности.

‘+fp’

Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности. Расширение ‘+vfpv3-d16’ может использоваться как псевдоним для этого расширения.

‘+simd’

Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3. Расширения ‘+neon’ и ‘+neon-vfpv3’ могут использоваться как псевдонимы для этого расширения.

‘+vfpv3’

Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности.

‘+vfpv3-d16-fp16’

Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv3-fp16’

Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv4-d16’

Инструкции с плавающей запятой VFPv4, с 16 регистрами двойной точности.

‘+vfpv4’

Инструкции с плавающей запятой VFPv4, с 32 регистрами двойной точности.

‘+neon-fp16’

Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3, с операциями преобразования чисел с плавающей запятой полуточной точности.

‘+neon-vfpv4’

Расширенные инструкции SIMD (Neon) v2 и инструкции с плавающей запятой VFPv4.

‘+nosimd’

Отключение инструкций Advanced SIMD (не отключает плавающую запятую).

‘+nofp’

Отключение инструкций с плавающей запятой и Advanced SIMD.

‘armv7ve’

Расширенная версия архитектуры ARMv7-A с поддержкой виртуализации.

‘+fp’

Инструкции с плавающей запятой VFPv4, с 16 регистрами двойной точности. Расширение ‘+vfpv4-d16’ может использоваться как псевдоним для этого расширения.

‘+simd’

Расширенные инструкции SIMD (Neon) v2 и инструкции с плавающей запятой VFPv4. Расширение ‘+neon-vfpv4’ может использоваться как псевдоним для этого расширения.

‘+vfpv3-d16’

Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности.

‘+vfpv3’

Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности.

‘+vfpv3-d16-fp16’

Инструкции с плавающей запятой VFPv3, с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv3-fp16’

Инструкции с плавающей запятой VFPv3, с 32 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv4-d16’

Инструкции с плавающей запятой VFPv4, с 16 регистрами двойной точности.

‘+vfpv4’

Инструкции с плавающей запятой VFPv4, с 32 регистрами двойной точности.

‘+neon’

Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3. Расширение ‘+neon-vfpv3’ может использоваться как псевдоним для этого расширения.

‘+neon-fp16’

Расширенные инструкции SIMD (Neon) v1 и инструкции с плавающей запятой VFPv3, с операциями преобразования чисел с плавающей запятой полуточной точности.

‘+nosimd’

Отключение инструкций Advanced SIMD (не отключает плавающую запятую).

‘+nofp’

Отключение инструкций с плавающей запятой и Advanced SIMD.

‘armv8-a’
‘+crc’

Инструкции проверки циклического избытка (CRC).

‘+simd’

Расширенные инструкции SIMD и с плавающей запятой ARMv8-A.

‘+crypto’

Криптографические инструкции.

‘+nocrypto’

Отключение криптографических инструкций.

‘+nofp’

Отключение инструкций с плавающей запятой, Advanced SIMD и криптографических инструкций.

‘+sb’

Инструкция барьера упреждения.

‘+predres’

Инструкции ограничения предсказания выполнения и данных.

‘armv8.1-a’
‘+simd’

Расширенные инструкции SIMD и с плавающей запятой ARMv8.1-A.

‘+crypto’

Криптографические инструкции. Это также включает расширенные инструкции SIMD и с плавающей запятой.

‘+nocrypto’

Отключение криптографических инструкций.

‘+nofp’

Отключение инструкций с плавающей запятой, Advanced SIMD и криптографических инструкций.

‘+sb’

Инструкция барьера упреждения.

‘+predres’

Инструкции ограничения предсказания выполнения и данных.

‘armv8.2-a’
‘armv8.3-a’
‘+fp16’

Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой.

‘+fp16fml’

Расширение fmla для чисел с плавающей запятой полуточной точности. Это также включает расширение чисел с плавающей запятой полуточной точности, Advanced SIMD и инструкции с плавающей запятой.

‘+simd’

Расширенные инструкции SIMD и с плавающей запятой ARMv8.1-A.

‘+crypto’

Криптографические инструкции. Это также включает расширенные инструкции SIMD и с плавающей запятой.

‘+dotprod’

Включить расширение Dot Product. Это также включает расширенные инструкции SIMD.

‘+nocrypto’

Отключить криптографическое расширение.

‘+nofp’

Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.

‘+sb’

Инструкция барьера упреждения.

‘+predres’

Инструкции ограничения предсказания выполнения и данных.

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битного размера. Это также включает расширенные инструкции SIMD и с плавающей запятой.

‘+bf16’

Инструкции с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой.

‘armv8.4-a’
‘+fp16’

Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для чисел с плавающей запятой полуточной точности.

‘+simd’

Расширенные инструкции SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.

‘+crypto’

Криптографические инструкции. Это также включает расширенные инструкции SIMD и с плавающей запятой, а также расширение Dot Product.

‘+nocrypto’

Отключение криптографического расширения.

‘+nofp’

Отключение инструкций с плавающей запятой, Advanced SIMD и криптографических инструкций.

‘+sb’

Инструкция барьера упреждения.

‘+predres’

Инструкции ограничения предсказания выполнения и данных.

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битного размера. Это также включает расширенные инструкции SIMD и с плавающей запятой.

‘+bf16’

Инструкции с плавающей запятой полуточной точности. Это также включает расширенные инструкции SIMD и с плавающей запятой.

‘armv8.5-a’
‘+fp16’

Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для чисел с плавающей запятой полуточной точности.

‘+simd’

Инструкции Advanced SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.

‘+crypto’

Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.

‘+nocrypto’

Отключить криптографическое расширение.

‘+nofp’

Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.

‘+bf16’

Инструкции с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.

‘armv8.6-a’
‘+fp16’

Инструкции обработки данных с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product и расширение fmla для чисел с плавающей запятой полуточной точности.

‘+simd’

Инструкции Advanced SIMD и с плавающей запятой ARMv8.3-A, а также расширение Dot Product.

‘+crypto’

Криптографические инструкции. Это также включает инструкции Advanced SIMD и с плавающей запятой, а также расширение Dot Product.

‘+nocrypto’

Отключить криптографическое расширение.

‘+nofp’

Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.

‘+i8mm’

Инструкции умножения матриц целых чисел 8-битной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.

‘+bf16’

Инструкции с плавающей запятой полуточной точности. Это также включает инструкции Advanced SIMD и с плавающей запятой.

‘armv7-r’
‘+fp.sp’

Инструкции с плавающей запятой VFPv3 одинарной точности. Расширение ‘+vfpv3xd’ может использоваться как псевдоним для этого расширения.

‘+fp’

Инструкции с плавающей запятой VFPv3 двойной точности с 16 регистрами двойной точности. Расширение +vfpv3-d16 может использоваться как псевдоним для этого расширения.

‘+vfpv3xd-d16-fp16’

Инструкции с плавающей запятой VFPv3 одинарной точности с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+vfpv3-d16-fp16’

Инструкции с плавающей запятой VFPv3 двойной точности с 16 регистрами двойной точности и операциями преобразования чисел с плавающей запятой полуточной точности.

‘+nofp’

Отключить расширение с плавающей запятой.

‘+idiv’

Инструкции целочисленного деления в состоянии ARM.

‘+noidiv’

Отключить расширение целочисленного деления в состоянии ARM.

‘armv7e-m’
‘+fp’

Инструкции с плавающей запятой VFPv4 одинарной точности.

‘+fpv5’

Инструкции с плавающей запятой FPv5 одинарной точности.

‘+fp.dp’

Инструкции с плавающей запятой FPv5 одинарной и двойной точности.

‘+nofp’

Отключить расширения с плавающей запятой.

‘armv8.1-m.main’
‘+dsp’

Инструкции DSP.

‘+mve’

Инструкции целочисленного расширения вектора профиля M (MVE).

‘+mve.fp’

Инструкции целочисленного расширения вектора профиля M (MVE) и инструкции с плавающей запятой одинарной точности.

‘+fp’

Инструкции с плавающей запятой одинарной точности.

‘+fp.dp’

Инструкции с плавающей запятой одинарной и двойной точности.

‘+nofp’

Отключить расширение с плавающей запятой.

‘+cdecp0, +cdecp1, ... , +cdecp7’

Включить расширение Custom Datapath Extension (CDE) для выбранных сопроцессоров в соответствии с номерами в опциях в диапазоне от 0 до 7.

‘+pacbti’

Включить расширение Pointer Authentication and Branch Target Identification.

‘armv8-m.main’
‘+dsp’

Инструкции DSP.

‘+nodsp’

Отключить расширение DSP.

‘+fp’

Инструкции с плавающей запятой одинарной точности.

‘+fp.dp’

Инструкции с плавающей запятой одинарной и двойной точности.

‘+nofp’

Отключить расширение с плавающей запятой.

‘+cdecp0, +cdecp1, ... , +cdecp7’

Включить расширение Custom Datapath Extension (CDE) для выбранных сопроцессоров в соответствии с номерами в опциях в диапазоне от 0 до 7.

‘armv8-r’
‘+crc’

Инструкции Cyclic Redundancy Check (CRC).

‘+fp.sp’

Инструкции с плавающей запятой FPv5 одинарной точности.

‘+simd’

Инструкции Advanced SIMD и с плавающей запятой ARMv8-A.

‘+crypto’

Криптографические инструкции.

‘+nocrypto’

Отключить криптографические инструкции.

‘+nofp’

Отключить инструкции с плавающей запятой, Advanced SIMD и криптографические инструкции.

-march=native заставляет компилятор автоматически определять архитектуру компьютера сборки. В настоящее время эта функция поддерживается только в GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не выполняется, опция не оказывает никакого эффекта.

-mtune=name

Этот параметр указывает имя целевого процессора ARM, для которого GCC должен настраивать производительность кода. Для некоторых реализаций ARM можно получить лучшую производительность, используя этот параметр. Допустимые имена: ‘arm7tdmi’, ‘arm7tdmi-s’, ‘arm710t’, ‘arm720t’, ‘arm740t’, ‘strongarm’, ‘strongarm110’, ‘strongarm1100’, ‘strongarm1110’, ‘arm8’, ‘arm810’, ‘arm9’, ‘arm9e’, ‘arm920’, ‘arm920t’, ‘arm922t’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm926ej-s’, ‘arm940t’, ‘arm9tdmi’, ‘arm10tdmi’, ‘arm1020t’, ‘arm1026ej-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm1136j-s’, ‘arm1136jf-s’, ‘mpcore’, ‘mpcorenovfp’, ‘arm1156t2-s’, ‘arm1156t2f-s’, ‘arm1176jz-s’, ‘arm1176jzf-s’, ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘cortex-a76’, ‘cortex-a76ae’, ‘cortex-a77’, ‘cortex-a78’, ‘cortex-a78ae’, ‘cortex-a78c’, ‘cortex-a710’, ‘ares’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-r52plus’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1’, ‘cortex-m3’, ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m23’, ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m52’, ‘cortex-m55’, ‘cortex-m85’, ‘cortex-x1’, ‘cortex-x1c’, ‘cortex-m1.small-multiply’, ‘cortex-m0.small-multiply’, ‘cortex-m0plus.small-multiply’, ‘exynos-m1’, ‘marvell-pj4’, ‘neoverse-n1’, ‘neoverse-n2’, ‘neoverse-v1’, ‘xscale’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’, ‘fa526’, ‘fa626’, ‘fa606te’, ‘fa626te’, ‘fmp626’, ‘fa726te’, ‘star-mc1’, ‘xgene1’.

Кроме того, этот параметр может указать, что GCC должен настраивать производительность кода для системы big.LITTLE. Допустимые имена: ‘cortex-a15.cortex-a7’, ‘cortex-a17.cortex-a7’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a72.cortex-a35’, ‘cortex-a73.cortex-a53’, ‘cortex-a75.cortex-a55’, ‘cortex-a76.cortex-a55’.

-mtune=generic-arch указывает, что GCC должен настроить производительность для сочетания процессоров в архитектуре arch. Цель состоит в генерации кода, который будет хорошо работать на современных наиболее популярных процессорах, балансируя оптимизации, выгодные некоторым процессорам в этом диапазоне, и избегая проблем с производительностью других процессоров. Эффекты этого параметра могут меняться в будущих версиях GCC по мере появления и исчезновения моделей процессоров.

-mtune допускает те же расширенные параметры, что и -mcpu, но расширенные параметры не влияют на настройку сгенерированного кода.

-mtune=native заставляет компилятор автоматически определять процессор компьютера сборки. В настоящее время эта функция поддерживается только в GNU/Linux и не все архитектуры распознаются. Если автоматическое определение не удается, параметр не имеет эффекта.

-mcpu=name[+extension…]

Это указывает имя целевого процессора ARM. GCC использует это имя для вывода имени целевой архитектуры ARM (как если бы было указано с помощью -march) и типа процессора ARM, для которого настраивается производительность (как если бы было указано с помощью -mtune). Где этот параметр используется совместно с -march или -mtune, эти параметры имеют приоритет над соответствующей частью этого параметра.

Многие поддерживаемые процессоры реализуют необязательные архитектурные расширения. В таких случаях архитектурные расширения обычно включены по умолчанию. Если существуют реализации, которым не хватает расширения, то синтаксис расширения можно использовать для отключения тех расширений, которые отсутствуют. Для операций с плавающей запятой и расширенной SIMD (NEON) инструкций также необходимо учитывать настройки параметров -mfloat-abi и -mfpu: инструкции с плавающей запятой и расширенной SIMD будут использоваться только в том случае, если -mfloat-abi не задан как ‘soft’; а любая установка -mfpu отличная от ‘auto’ переопределит доступные инструкции с плавающей запятой и SIMD-расширения.

Например, ‘cortex-a9’ можно найти в трёх основных конфигурациях: только целые числа, только с блоком обработки с плавающей запятой или с блоком обработки с плавающей запятой и расширенной SIMD. По умолчанию все инструкции включены, но расширения ‘+nosimd’ и ‘+nofp’ можно использовать для отключения только SIMD-инструкций или как SIMD- так и инструкций с плавающей запятой соответственно.

Допустимые имена для этого параметра такие же, как и для -mtune.

Следующие параметры расширения являются общими для перечисленных процессоров:

‘+nodsp’

Отключить DSP-инструкции на ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’. Также отключить целочисленные и одноточные инструкции с плавающей запятой расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.

‘+nopacbti’

Отключить расширение аутентификации указателей и идентификации целевого адреса ветвления на ‘cortex-m52’ и ‘cortex-m85’.

‘+nomve’

Отключить целочисленные и одноточные инструкции с плавающей запятой расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.

‘+nomve.fp’

Отключить инструкции с плавающей запятой одинарной точности расширения M-Profile Vector Extension (MVE) на ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’.

‘+cdecp0, +cdecp1, ... , +cdecp7’

Включить расширение Custom Datapath Extension (CDE) на выбранных сопроцессорах в соответствии с номерами, заданными в параметрах в диапазоне от 0 до 7 на ‘cortex-m52’ и ‘cortex-m55’.

‘+nofp’

Отключает инструкции с плавающей запятой на ‘arm9e’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm926ej-s’, ‘arm1026ej-s’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-m4’, ‘cortex-m7’, ‘cortex-m33’, ‘cortex-m35p’, ‘cortex-m52’, ‘cortex-m55’ и ‘cortex-m85’. Отключает инструкции с плавающей запятой и SIMD на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a15.cortex-a7’, ‘cortex-a17.cortex-a7’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’ и ‘cortex-a55’.

‘+nofp.dp’

Отключает компонент двойной точности инструкций с плавающей запятой на ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-r52plus’ и ‘cortex-m7’.

‘+nosimd’

Отключает SIMD (но не инструкции с плавающей запятой) инструкции на ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’ и ‘cortex-a9’.

‘+crypto’

Включает криптографические инструкции на ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a55’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-a75’, ‘exynos-m1’, ‘xgene1’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a73.cortex-a35’, ‘cortex-a73.cortex-a53’ и ‘cortex-a75.cortex-a55’.

Кроме того, псевдоцелевой ‘generic-armv7-a’ по умолчанию использует VFPv3 с 16 регистрами двойной точности. Он поддерживает следующие параметры расширения: ‘mp’, ‘sec’, ‘vfpv3-d16’, ‘vfpv3’, ‘vfpv3-d16-fp16’, ‘vfpv3-fp16’, ‘vfpv4-d16’, ‘vfpv4’, ‘neon’, ‘neon-vfpv3’, ‘neon-fp16’, ‘neon-vfpv4’. Значения такие же, как и для расширений -march=armv7-a.

-mcpu=generic-arch также допустимо и эквивалентно -march=arch -mtune=generic-arch. Смотрите -mtune для получения дополнительной информации.

-mcpu=native заставляет компилятор автоматически определить процессор машины сборки. В настоящее время эта функция поддерживается только в GNU/Linux, и не все архитектуры распознаются. Если автоматическое определение не удается, параметр не оказывает влияния.

-mfpu=name

Это указывает, какое аппаратное обеспечение с плавающей запятой (или эмуляция аппаратного обеспечения) доступно на целевой системе. Допустимые имена: ‘auto’, ‘vfpv2’, ‘vfpv3’, ‘vfpv3-fp16’, ‘vfpv3-d16’, ‘vfpv3-d16-fp16’, ‘vfpv3xd’, ‘vfpv3xd-fp16’, ‘neon-vfpv3’, ‘neon-fp16’, ‘vfpv4’, ‘vfpv4-d16’, ‘fpv4-sp-d16’, ‘neon-vfpv4’, ‘fpv5-d16’, ‘fpv5-sp-d16’, ‘fp-armv8’, ‘neon-fp-armv8’ и ‘crypto-neon-fp-armv8’. Обратите внимание, что ‘neon’ является псевдонимом для ‘neon-vfpv3’ и ‘vfp’ является псевдонимом для ‘vfpv2’.

Настройка ‘auto’ является значением по умолчанию и является специальной. Она заставляет компилятор выбирать инструкции с плавающей запятой и расширенной SIMD на основе настроек -mcpu и -march.

Если выбранное аппаратное обеспечение с плавающей запятой включает расширение NEON (например, -mfpu=neon), обратите внимание, что операции с плавающей запятой не генерируются проходом автоматизации векторизации GCC, если также не указан -funsafe-math-optimizations. Это связано с тем, что аппаратное обеспечение NEON не полностью реализует стандарт IEEE 754 для арифметики с плавающей запятой (в частности, значения с поднормальной величиной обрабатываются как ноль), поэтому использование NEON-инструкций может привести к потере точности.

Вы также можете установить имя fpu на уровне функции, используя target("fpu=") атрибуты функции (см. Атрибуты функции ARM) или директивы (см. Директивы специфичные для функции).

-mfp16-format=name

Укажите формат __fp16 типа с плавающей запятой половинной точности. Допустимые имена: ‘none’, ‘ieee’ и ‘alternative’; значение по умолчанию ‘none’, в этом случае тип __fp16 не определён. Смотрите Плавающая запятая половинной точности для получения дополнительной информации.

-mstructure-size-boundary=n

Размеры всех структур и объединений округляются до кратного числа битов, установленных этим параметром. Допустимые значения: 8, 32 и 64. Значение по умолчанию зависит от разных компиляторов. Для компилятора с целевым COFF значение по умолчанию равно 8. Значение 64 допускается только в том случае, если поддерживается базовая ABI.

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

Этот параметр устарел.

-mabort-on-noreturn

Сгенерировать вызов функции abort в конце noreturn функции. Она выполняется, если функция пытается вернуть значение.

-mlong-calls
-mno-long-calls

Указывает компилятору выполнять вызовы функций, сначала загрузив адрес функции в регистр, а затем выполнив вызов подпрограммы на этом регистре. Этот переключатель необходим, если целевая функция находится за пределами диапазона адресации 64 мегабайта в варианте вызова подпрограммы на основе смещения.

Даже если этот переключатель включен, не все вызовы функций преобразуются в длинные вызовы. Эвристика заключается в том, что статические функции, функции с атрибутом short_call, функции, находящиеся в области действия директивы #pragma no_long_calls, и функции, определения которых уже были скомпилированы в текущей единице компиляции, не преобразуются в длинные вызовы. Исключение составляют определения слабых функций, функции с атрибутом long_call или атрибутом section, и функции, которые находятся в области действия директивы #pragma long_calls. Они всегда преобразуются в длинные вызовы.

По умолчанию эта функция отключена. Указание -mno-long-calls восстанавливает поведение по умолчанию, как и размещение вызовов функций в области действия директивы #pragma long_calls_off. Обратите внимание, что эти переключатели не влияют на то, как компилятор генерирует код для обработки вызовов функций через указатели на функции.

-msingle-pic-base

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

-mpic-register=reg

Укажите регистр, который будет использоваться для адресации PIC. Для стандартного случая PIC по умолчанию используется любой подходящий регистр, определяемый компилятором. В случае одиночного PIC по умолчанию используется ‘R9’, если целевая система основана на EABI или включена проверка стека; в противном случае по умолчанию используется ‘R10’.

-mpic-data-is-text-relative

Предполагается, что смещение между текстовым и данными сегментами фиксируется во время статической компоновки. Это позволяет использовать операции адресации относительно PC для доступа к данным, которые, как известно, находятся в сегменте данных. Для целей не-VxWorks RTP этот параметр включен по умолчанию. При отключении на таких целях, он по умолчанию включит -msingle-pic-base.

-mpoke-function-name

Записать имя каждой функции в секцию текста, непосредственно перед прологом функции. Сгенерированный код похож на этот:

t0
    .ascii "arm_poke_function_name", 0
    .align
t1
    .word 0xff000000 + (t1 - t0)
arm_poke_function_name
    mov     ip, sp
    stmfd   sp!, {fp, ip, lr, pc}
    sub     fp, ip, #4

При выполнении трассировки стека код может проверить значение pc, хранящееся в fp + 0 . Если функция трассировки затем просмотрит расположение pc - 12 и самые старшие 8 бит установлены, то мы знаем, что имя функции встроено непосредственно перед этим расположением и имеет длину ((pc[-3]) & 0xff000000) .

-mthumb
-marm

Выбирайте между генерированием кода, который выполняется в состояниях ARM и Thumb. По умолчанию для большинства конфигураций генерируется код, который выполняется в состоянии ARM, но по умолчанию можно изменить, настроив GCC с опцией конфигурации --with-mode=state.

Вы также можете переопределить режим ARM и Thumb для каждой функции, используя атрибуты функций target("thumb") и target("arm") (см. Атрибуты функций ARM) или директивы (см. Директивы опций, специфичные для функции).

-mflip-thumb

Переключать режимы ARM/Thumb на чередующихся функциях. Эта опция предоставлена для тестирования регрессии смешанного кода Thumb/ARM, и не предназначена для обычного использования при компиляции кода.

-mtpcs-frame

Создавать кадр стека, соответствующий Стандарту вызова подпрограмм Thumb, для всех нелистовых функций. (Листовая функция — это функция, которая не вызывает никаких других функций.) По умолчанию используется -mno-tpcs-frame.

-mtpcs-leaf-frame

Генерировать кадр стека, соответствующий Стандарту вызова подпрограмм Thumb, для всех листовых функций. (Листовая функция — это функция, которая не вызывает никаких других функций.) По умолчанию используется -mno-apcs-leaf-frame.

-mcallee-super-interworking

Присваивает всем внешне видимым функциям в компилируемом файле заголовок набора инструкций ARM, который переключается в режим Thumb перед выполнением остальной части функции. Это позволяет вызывать эти функции из кода без переключения. Эта опция недопустима в конфигурациях AAPCS, потому что межрабочие функции включены по умолчанию.

-mcaller-super-interworking

Разрешает вызовы через указатели на функции (включая виртуальные функции) для правильной работы независимо от того, был ли целевой код скомпилирован для межрабочего режима или нет. В случае включения данной опции, есть небольшая нагрузка при выполнении указателя на функцию. Эта опция недействительна в конфигурациях AAPCS, поскольку межрабочие функции включены по умолчанию.

-mtp=name

Укажите модель доступа для указателя на локальное хранилище потока. Модель ‘soft’ генерирует вызовы к __aeabi_read_tp. Другие поддерживаемые модели — ‘tpidrurw’, ‘tpidruro’ и ‘tpidrprw’, которые извлекают указатель потока из соответствующего системного регистра напрямую (поддерживается с архитектуры arm6k и новее). К этим системным регистрам осуществляется доступ через интерфейс сопроцессора CP15, а аргумент ‘cp15’ также принимается в качестве удобного псевдонима ‘tpidruro’. Аргумент ‘auto’ использует наилучший доступный метод для выбранного процессора. Значение по умолчанию — ‘auto’.

-mtls-dialect=dialect

Укажите диалект для доступа к локальному хранилищу потока. Поддерживаются два диалекта — ‘gnu’ и ‘gnu2’. Диалект ‘gnu’ выбирает исходную схему GNU для поддержки локальных и глобальных динамических моделей TLS. Диалект ‘gnu2’ выбирает схему описателей GNU, которая обеспечивает лучшую производительность для общих библиотек. Схема описателей GNU совместима с исходной схемой, но требует новой поддержки ассемблера, компоновщика и библиотек. Модели TLS для начального и локального выполнения остаются неизменными и всегда используют исходную схему.

-mword-relocations

Генерировать только абсолютные перемещения по значениям размера слова (т. е. R_ARM_ABS32). Это включено по умолчанию для целей (uClinux, SymbianOS), где загрузчик среды выполнения накладывает это ограничение, и когда указаны -fpic или -fPIC. Эта опция конфликтует с -mslow-flash-data.

-mfix-cortex-m3-ldrd

Некоторые ядра Cortex-M3 могут вызывать повреждение данных, когда инструкции ldrd с перекрывающимися регистрами назначения и базы используются. Эта опция избегает генерации этих инструкций. Эта опция включена по умолчанию, когда указана -mcpu=cortex-m3.

-mfix-cortex-a57-aes-1742098
-mno-fix-cortex-a57-aes-1742098
-mfix-cortex-a72-aes-1655431
-mno-fix-cortex-a72-aes-1655431

Включить (отключить) смягчение для ошибки в ядрах Cortex-A57 и Cortex-A72, которая затрагивает криптографические инструкции AES. Эта опция включена по умолчанию, когда указаны либо -mcpu=cortex-a57, либо -mcpu=cortex-a72.

-munaligned-access
-mno-unaligned-access

Включает (или отключает) чтение и запись значений 16 и 32 бит из адресов, которые не являются 16 или 32-битовыми выровненными. По умолчанию доступ к невыровненным адресам отключен для всех архитектур до ARMv6, всех ARMv6-M и ARMv8-M Baseline, и включен для всех остальных архитектур. Если доступ к невыровненным адресам не включен, то слова в упакованных структурах данных считываются по байтам.

Атрибут ARM Tag_CPU_unaligned_access в сгенерированном объекте файла устанавливается в true или false, в зависимости от настройки этой опции. Если доступ к невыровненным адресам включен, то препроцессорная переменная __ARM_FEATURE_UNALIGNED также определяется.

-mneon-for-64bits

Эта опция устарела и не имеет эффекта.

-mslow-flash-data

Предположим, что загрузка данных из флэш-памяти медленнее, чем загрузка инструкций. Поэтому загрузка литералов минимизируется для лучшей производительности. Эта опция поддерживается только при компиляции для ARMv7 M-profile и выключена по умолчанию. Она конфликтует с -mword-relocations.

-masm-syntax-unified

Предположим, что встроенный ассемблер использует унифицированный синтаксис asm. По умолчанию функция выключена, что подразумевает разделенный синтаксис. Эта опция не оказывает влияния на Thumb2. Однако это может измениться в будущих выпусках GCC. Разделенный синтаксис следует считать устаревшим.

-mrestrict-it

Ограничивает генерацию блоков IT, чтобы соответствовать правилам ARMv8-A. Блоки IT могут содержать только одну 16-битную инструкцию из выбранного набора инструкций. Эта опция включена по умолчанию для режима Thumb ARMv8-A.

-mprint-tune-info

Печатать информацию о настройке процессора в виде комментария в файле ассемблера. Эта опция используется только для регрессионного тестирования компилятора и не предназначена для обычного использования при компиляции кода. Эта опция отключена по умолчанию.

-mverbose-cost-dump

Включает подробный вывод модели стоимости в файлы отладки. Эта опция предоставляется для использования в отладке компилятора.

-mpure-code

Не разрешать размещение константных данных в секциях кода. Кроме того, при компиляции для формата ELF-объектов, присвойте всем секциям текста атрибут ELF, специфичный для процессора SHF_ARM_PURECODE. Эта опция доступна только при генерации кода без PIC для целей M-profile.

-mcmse

Генерировать защищенный код в соответствии со спецификацией «ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification», которая доступна по адресу https://developer.arm.com/documentation/ecm0359818/latest/.

-mfix-cmse-cve-2021-35465
END_OF_DOCUMENT_MARKER

Смягчить потенциальную проблему безопасности с инструкцией VLLDM в некоторых устройствах профиля M при использовании CMSE (CVE-2021-365465). Этот параметр включен по умолчанию при использовании параметра -mcpu= с cortex-m33, cortex-m35p, cortex-m52, cortex-m55, cortex-m85 или star-mc1. Параметр -mno-fix-cmse-cve-2021-35465 может быть использован для отключения смягчения.

-mstack-protector-guard=guard
-mstack-protector-guard-offset=offset

Генерировать код защиты стека, используя канадскую метку в guard. Поддерживаемые расположения — ‘global’ для глобальной канадской метки или ‘tls’ для канадской метки, доступной через регистр TLS. Параметр -mstack-protector-guard-offset= предназначен для использования с -fstack-protector-guard=tls и не предназначен для использования в коде пользовательского уровня.

-mfdpic
-mno-fdpic

Выбрать ABI FDPIC, который использует 64-битные описатели функций для представления указателей на функции. Когда компилятор настроен для arm-*-uclinuxfdpiceabi целей, этот параметр включен по умолчанию и подразумевает -fPIE, если ни один из параметров, связанных с PIC/PIE, не задан. В других случаях он только включает функции генерации кода, специфичные для FDPIC, и пользователь должен явно указать необходимые параметры, связанные с PIC/PIE.

Обратите внимание, что статическая линковка не поддерживается, так как она по-прежнему будет использовать динамический линковщик, когда программа выполняет самоперемещение. Если такое поведение приемлемо, используйте опции -static и -Wl,-dynamic-linker.

Противный параметр -mno-fdpic полезен (и необходим) для построения ядра Linux с использованием той же (arm-*-uclinuxfdpiceabi) инструментальной цепочки, что и для построения приложений пользовательского уровня.

-mbranch-protection=none|standard|pac-ret[+leaf][+bti]|bti[+pac-ret[+leaf]]

Включить функции защиты ветвлений (только armv8.1-m.main). ‘none’ генерирует код без защиты ветвлений или подписи адреса возврата. ‘standard[+leaf]’ генерирует код со всеми функциями защиты ветвлений, включенными на стандартном уровне. ‘pac-ret[+leaf]’ генерирует код с подписью адреса возврата на стандартном уровне, которая заключается в подписи всех функций, сохраняющих адрес возврата в памяти. ‘leaf’ При включенной подписи адреса возврата, подписывать также листовые функции, даже если они не записывают адрес возврата в память. +‘bti’ Добавить инструкции landing-pad в разрешённые целевые адреса инструкций косвенного ветвления.

Если расширение архитектуры ‘+pacbti’ не включено, все операции защиты ветвлений и подписи адреса возврата ограничены использованием только инструкций, определённых в пространстве архитектурных NOP. Сгенерированный код останется обратно совместимым с более ранними версиями архитектуры, но дополнительная безопасность может быть включена во время выполнения на процессорах, поддерживающих расширение ‘PACBTI’.

Принудительное выполнение цели ветвления с помощью BTI может быть включено только во время выполнения, если весь код приложения был скомпилирован как минимум с ‘-mbranch-protection=bti’.

Любое значение, отличное от ‘none’, поддерживается только на armv8-m.main или более поздних версиях.

По умолчанию генерируется код без защиты ветвлений или подписи адреса возврата.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/ARM-Options.html

Spec-Zone.ru

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