Spec-Zone.ru › GCC 8

3.18.4 Параметры ARM

Для порта ARM определены следующие параметры «-m»:

-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» позволяет генерировать код с использованием аппаратных инструкций для операций с плавающей запятой, но при этом применяются соглашения о вызовах для программной обработки плавающей запятой. «hard» позволяет генерировать инструкции для операций с плавающей запятой и использует соглашения о вызовах, специфичные для FPU.

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

-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», «armv7-r», «armv8-r», «armv6-m», «armv6s-m», «armv7-m», «armv7e-m», «armv8-m.base», «armv8-m.main», «iwmmxt» и «iwmmxt2».

Кроме того, распознаются следующие архитектуры, не поддерживающие состояние выполнения Thumb, однако их поддержка объявлена устаревшей: «armv2», «armv2a», «armv3», «armv3m», «armv4», «armv5» и «armv5e».

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

Например, «-march=armv7-a+simd+nofp+vfpv4» эквивалентно записи «-march=armv7-a+vfpv4», поскольку параметр «+simd» полностью отключается следующим за ним параметром «+nofp».

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

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

END_OF_DOCUMENT_MARKER
‘armv5e’
‘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’

Расширения Advanced 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’

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

‘+neon-vfpv4’

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

‘+nosimd’

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

‘+nofp’

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

‘armv7ve’

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

‘+fp’

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

‘+simd’

Расширения Advanced 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’

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

‘+neon-fp16’

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

‘+nosimd’

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

‘+nofp’

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

‘armv8-a’
‘+crc’

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

‘+simd’

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

‘+crypto’

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

‘+nocrypto’

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

‘+nofp’

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

‘armv8.1-a’
‘+simd’

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

‘+crypto’

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

‘+nocrypto’

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

‘+nofp’

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

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

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

‘+fp16fml’

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

‘+simd’

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

‘+crypto’

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

‘+dotprod’

Включить расширение Dot Product. Также включаются инструкции Advanced SIMD.

‘+nocrypto’

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

‘+nofp’

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

‘armv8.4-a’
‘+fp16’

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

‘+simd’

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

‘+crypto’

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

‘+nocrypto’

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

‘+nofp’

Отключить инструкции с плавающей запятой, 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-m.main’
‘+dsp’

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

‘+nodsp’

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

‘+fp’

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

‘+fp.dp’

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

‘+nofp’

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

‘armv8-r’
‘+crc’

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

‘+fp.sp’

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

‘+simd’

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

‘+crypto’

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

‘+nocrypto’

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

‘+nofp’

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

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

-mtune=name

Этот параметр задаёт имя целевого процессора ARM, для которого GCC должен настроить производительность кода. Для некоторых реализаций ARM лучшая производительность может быть достигнута с использованием этого параметра. Допустимые имена: ‘arm2’, ‘arm250’, ‘arm3’, ‘arm6’, ‘arm60’, ‘arm600’, ‘arm610’, ‘arm620’, ‘arm7’, ‘arm7m’, ‘arm7d’, ‘arm7dm’, ‘arm7di’, ‘arm7dmi’, ‘arm70’, ‘arm700’, ‘arm700i’, ‘arm710’, ‘arm710c’, ‘arm7100’, ‘arm720’, ‘arm7500’, ‘arm7500fe’, ‘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’, ‘neoverse-v1’, ‘neoverse-n2’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-r52’, ‘cortex-m33’, ‘cortex-m23’, ‘cortex-m7’, ‘cortex-m4’, ‘cortex-m3’, ‘cortex-m1’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1.small-multiply’, ‘cortex-m0.small-multiply’, ‘cortex-m0plus.small-multiply’, ‘exynos-m1’, ‘marvell-pj4’, ‘xscale’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’, ‘fa526’, ‘fa626’, ‘fa606te’, ‘fa626te’, ‘fmp626’, ‘fa726te’, ‘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’.

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

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

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

-mcpu=name[+extension…]

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

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

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

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

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

‘+nodsp’

Отключить инструкции DSP на ‘cortex-m33’.

‘+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’. Отключает инструкции с плавающей запятой и инструкции 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-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» используется по умолчанию и имеет специальное назначение. Оно заставляет компилятор выбирать инструкции для операций с плавающей запятой и инструкции Advanced 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

Предполагать, что смещение между текстовым и данными сегментами является постоянным на этапе статической компоновки. Это позволяет использовать операции адресации с относительным адресом ПК для доступа к данным, которые, как известно, находятся в сегменте данных. Для целей, не связанных с 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, ‘cp15’, которая извлекает указатель потока из cp15 непосредственно (поддерживается в архитектуре arm6k) и ‘auto’, которая использует наилучший доступный метод для выбранного процессора. Значение по умолчанию — ‘auto’.

-mtls-dialect=dialect

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

-mword-relocations

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

-mfix-cortex-m3-ldrd

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

-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

Включает использование Neon для обработки скалярных 64-битных операций. По умолчанию отключено, поскольку стоимость перемещения данных из регистров ядра в Neon высока.

-mslow-flash-data

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

-masm-syntax-unified

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

-mrestrict-it

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

-mprint-tune-info

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

-mverbose-cost-dump

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

-mpure-code

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

-mcmse

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

Далее: Параметры AVR, Предыдущее: Параметры ARC, Вверх: Параметры подмодели [Оглавление][Индекс]

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

Spec-Zone.ru

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