Следующие опции, которые начинаются с префикса '-m', определены для порта ARM компилятора GCC:
-mabi=name
Генерирует код для указанного ABI [2]. Резрешенные значения для name: apcs-gnu, atpcs, aapcs, aapcs-linux и iwmmxt.
-mapcs-frame
Генерирует фрейм стека, своместимый с ARM Procedure Call Standard для всех функций, даже если для этого нет обязательной необходимости, чтобы код выполнялся корректно. Указание -fomit-frame-pointer с этой опцией приводит к тому, что для leaf-функций [8] фреймы стека не генерируются. По умолчанию используется -mno-apcs-frame. Эта опция является устаревшей.
-mapcs
Это синоним -mapcs-frame, и является устаревшей опцией.
-mthumb-interwork
Генерирует код, который поддерживает вызовы между наборами инструкций ARM и Thumb. Без этой опции на архитектурах до ARMv5 два набора инструкций ARM и Thumb нельзя надежно использовать внутри одной программы. По умолчанию используется -mno-thumb-interwork, что дает несколько больший объем кода в сравнении с использованием -mthumb-interwork. В конфигурациях AAPCS эта опция не имеет смысла.
-mno-sched-prolog
Предотвращает переупорядочивание инструкций в прологе функции, или объединение этих инструкций с инструкциями тела функции. Это означает, что все функции начинаются с распознаваемого набора инструкций (или фактически начинаются с одного из небольшого количества вариантов набора инструкций), и эта информация может использоваться для определения начала функций внутри исполняемой области кода. По умолчанию используется -msched-prolog.
-mfloat-abi=name
Указывает, какой использовать ABI для операций с плавающей запятой (floating-point). Возможные значения: soft, softfp и hard.
Указание soft заставляет GCC генерировать вывод, содержащий вызовы библиотеки для операций с плавающей запятой. Вариант softfp позволяет генерацию кода, использующего аппаратные инструкции плавающей точки, но все еще используя соглашения о вызовах soft-float. Вариант hard позволяет генерировать инструкции floating-point, и использовать соглашения о вызовах, специфичные для конкретной реализации FPU.
Умолчание здесь зависит от определенной конфигурации target (целевой архитектуры процессора). Имейте в виду, что hard-float и soft-float ABI не совместимы на уровне линковки; вы должны компилировать всю программу с одним и тем же ABI, и линковать свой код с совместимым набором библиотек.
-mgeneral-regs-only
Генерировать код, который использует только регистры общего назначения (general-purpose registers). Это не даст компилятору использовать регистры floating-point и Advanced SIMD, но не накладывает никакие подобные ограничения на код ассемблера.
-mlittle-endian
Генерирует код ля процессора, работающий в режиме little-endian [3]. Это умолчание для всех стандартных конфигураций.
-mbig-endian
Генерирует код ля процессора, работающий в режиме big-endian [3]. По умолчанию код компилируется для режима little-endian процессора.
-mbe8 -mbe32
Когда линкуется образ big-endian, делает выбор между форматами BE8 и BE32 [3]. Эта опция не дает никакого эффекта для образов little-endian, и для таких образов игнорируется. Умолчание зависит от выбранной целевой архитектуры. Для ARMv6 и более свежих архитектур по умолчанию используется BE8, для более старых архитектур умолчание BE32. Формат BE32 для ARM считается устаревшим.
-march=name[+extension…]
Задает имя (name) для целевой архитектуры ARM. GCC использует это имя для определения вида инструкций кода ассемблера, которые нужно генерировать. Эта опция может использоваться вместе с опцией -mcpu= или вместо неё.
Дополнительно распознаются следующие архитектуры, в которых отсутствует поддержка состояния выполнения кода Thumb, однако их поддержка устаревает: armv4.
Многие архитектуры поддерживают расширения. Они могут быть добавлены присоединением +extension (опция расширения) к имени архитектуры. Опции расширения обрабатываются по порядку, и их возможности накапливаются. Расширение будет также разрешать любые необходимые базовые расширения, от которых оно зависит. Например, расширение +crypto всегда разрешит расширение +simd.
Имеется исключение их аддитивной конструкции для расширений с префиксом +no...: эти расширения запрещают указанную опцию расширения и любые другие расширения, от которых может зависеть присутствие этой опции расширения. Например, -march=armv7-a+simd+nofp+vfpv4 является эквивалентом -march=armv7-a+vfpv4, поскольку опция +simd полностью запрещена следующей за ней опцией +nofp.
Большинство имен расширений традиционные и одинаковые, однако их эффект зависит от архитектуры, к которой расширение применяется. Например, опция +simd может быть применена к обоим архитектурам armv7-a и armv8-a, но для armv7-a будут разрешены оригинальный вариант расширений ARMv7-A Advanced SIMD (Neon), а для armv8-a вариант расширений ARMv8-A.
Ниже во врезке перечислены поддерживаемые расширения для каждой архитектуры. Не упомянутые архитектуры не поддерживают какие-либо расширения.
+fp Инструкции плавающей точки VFPv2. Для расширения +fp может использоваться псевдоним +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 регистрами двойной точности и операциями преобразования половинной точности (half-precision floating-point conversion).
+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 Инструкции плавающей точки VFPv4 и Advanced SIMD (Neon) v2. Для этого расширения может использоваться псевдоним +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 Инструкции плавающей точки VFPv3 и Advanced SIMD (Neon) v1. Для этого расширения может использоваться псевдоним +neon-vfpv3.
+neon-fp16 Инструкции плавающей точки VFPv3 и Advanced SIMD (Neon) v1, с операциями преобразования половинной точности плавающей точки.
+nosimd Запрет инструкций Advanced SIMD (не запрещает поддержку плавающей точки).
+nofp Запрет инструкций плавающей точки и инструкций Advanced SIMD.
+predres Инструкции по ограничению выполнения и прогнозирования данных.
armv8.2-a armv8.3-a
+fp16 Инструкции обработки данных плавающей точки половинной точности. Это также разрешает инструкции плавающей точки и Advanced SIMD.
+fp16fml Расширение fmla плавающей точки половинной точности. Это также разрешает расширение плавающей точки половинной точности и инструкции Advanced SIMD.
+simd Инструкции плавающей точки и ARMv8.1-A Advanced SIMD.
+crypto Инструкции криптографии. Это также разрешает инструкции плавающей точки и Advanced SIMD.
+dotprod Разрешает расширение Dot Product. Это также разрешает инструкции Advanced SIMD.
+nocrypto Запрет инструкций криптографии.
+nofp Запрет инструкций плавающей точки, Advanced SIMD и криптографии.
+predres Инструкции по ограничению выполнения и прогнозирования данных.
+i8mm Инструкции 8-битного целочисленного матричного умножения. Это также разрешает инструкции плавающей точки и Advanced SIMD.
+bf16 Инструкции Brain плавающей точки половинной точности. Это также разрешает инструкции плавающей точки и Advanced SIMD.
armv8.4-a
+fp16 Инструкции обработки данных плавающей точки половинной точности. Это также разрешает инструкции плавающей точки и Advanced SIMD, как и расширение Dot Product и расширение fmla плавающей точки половинной точности.
+simd Разрешает инструкции плавающей точки и ARMv8.3-A Advanced SIMD, а также расширение Dot Product.
+crypto Инструкции криптографии. Это также разрешает инструкции плавающей точки и Advanced SIMD, а также расширение Dot Product.
+nocrypto Запрет инструкций криптографии.
+nofp Запрет инструкций плавающей точки, Advanced SIMD и криптографии.
+predres Инструкции по ограничению выполнения и прогнозирования данных.
+i8mm Инструкции 8-битного целочисленного матричного умножения. Это также разрешает инструкции плавающей точки и Advanced SIMD.
+bf16 Инструкции Brain плавающей точки половинной точности. Это также разрешает инструкции плавающей точки и Advanced SIMD.
armv8.5-a armv8.6-a
+fp16 Инструкции обработки данных плавающей точки половинной точности. Это также разрешает инструкции плавающей точки и Advanced SIMD, как и расширение Dot Product и расширение fmla плавающей точки половинной точности.
+simd Разрешает инструкции плавающей точки и ARMv8.3-A Advanced SIMD, а также расширение Dot Product.
+crypto Инструкции криптографии. Это также разрешает инструкции плавающей точки и Advanced SIMD, а также расширение Dot Product.
+nocrypto Запрет инструкций криптографии.
+nofp Запрет инструкций плавающей точки, Advanced SIMD и криптографии.
+i8mm Инструкции 8-битного целочисленного матричного умножения. Это также разрешает инструкции плавающей точки и Advanced SIMD.
+bf16 Инструкции Brain плавающей точки половинной точности. Это также разрешает инструкции плавающей точки и Advanced SIMD.
armv7-r
+fp.sp Инструкции плавающей точки VFPv3 одинарной точности. Для этого расширения может использоваться псевдоним +vfpv3xd.
+fp Инструкции плавающей точки VFPv3 с 16 регистрами двойной точности. Для этого расширения может использоваться псевдоним +vfpv3-d16.
+vfpv3xd-d16-fp16 Инструкции плавающей точки VFPv3 одинарной точности с 16 регистрами двойной точности и операциями преобразования плавающей точки половинной точности.
+vfpv3-d16-fp16 Инструкции плавающей точки VFPv3 с 16 регистрами двойной точности и операциями преобразования плавающей точки половинной точности.
+mve.fp Расширение целочисленных инструкций M-Profile Vector Extension (MVE) и плавающей точки одинарной точности.
+fp Инструкции плавающей точки одинарной точности.
+fp.dp Инструкции плавающей точки одинарной и двойной точности.
+nofp Запрет расширения плавающей точки.
+cdecp0, +cdecp1, ... , +cdecp7
Разрешение расширения Custom Datapath Extension (CDE) на выбранных сопроцессорах в соответствии с числами в опциях диапазона 0 .. 7.
armv8-m.main
+dsp Инструкции цифровой обработки сигналов (DSP).
+nodsp Запрет инструкций DSP.
+fp Инструкции плавающей точки одинарной точности.
+fp.dp Инструкции плавающей точки одинарной и двойной точности.
+nofp Запрет расширения плавающей точки.
+cdecp0, +cdecp1, ... , +cdecp7 Разрешение расширения Custom Datapath Extension (CDE) на выбранных сопроцессорах в соответствии с числами в опциях диапазона 0 .. 7.
+fp.sp Инструкции плавающей точки FPv5 одинарной точности.
+simd Инструкции плавающей точки и ARMv8-A Advanced SIMD.
+crypto Инструкции криптографии.
+nocrypto Запрет инструкций криптографии.
+nofp Запрет инструкций плавающей точки, Advanced SIMD и криптографии.
-march=native
Заставляет компилятор автоматически определять архитектуру компьютера сборки. В настоящее время эта функция поддерживается только на GNU/Linux, и распознаются не все архитектуры. Если автодетект прошел неудачно, то эта опция не дает эффекта.
-mtune=name
Эта опция указывает имя целевого процессора (target), для которого 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-m55, 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. Назначение опции состоит в том, чтобы генерировать код, который хорошо работает на текущих самых популярных процессорах с балансом между оптимизациями, которые приносят выгоду некоторым процессорам в диапазоне, и избегая подводных камней снижения производительности других CPU. Эффекты этой опции могут поменяться в будущих версиях GCC по мере появления новых моделей CPU.
-mtune
Разрешает те же опции расширения, что и -mcpu, однако опции расширения не влияют на настройку генерируемого кода.
-mtune=native
Заставляет компилятор автоматически детектировать CPU компьютера сборки. В настоящее время эта функция поддерживается только на GNU/Linux, и распознаются не все архитектуры. Если автодетект прошел неудачно, то эта опция не дает эффекта.
-mcpu=name[+extension…]
Указывает имя name целевого процессора (target ARM). GCC использует это name, чтобы определить имя целевой архитектуры ARM (как если бы она была указана опцией -march) и тип процессора ARM, чтобы настроить для него производительность (как если бы была указана опция -mtune). Там, где эта опция используется вместе с опциями -march или -mtune, эти опции имеют преимущество над соответствующей частью этой опции.
Многие поддерживаемые CPU реализуют опциональные архитектурные расширения. В этом случае архитектурные расширения обычно активируются по умолчанию. Если существуют реализации без расширения, то может использоваться синтаксис расширения для запрета этих расширений, которые отсутствуют. Для инструкций плавающей точки и Advanced SIMD (Neon) также должны учитываться установки опций -mfloat-abi и -mfpu: инструкции плавающей точки и Advanced SIMD будут использоваться только если опция -mfloat-abi не установлена в 'soft'; и любая установка -mfpu, отличная от 'auto', переназначит доступные инструкции расширения инструкций плавающей точки и SIMD.
Например cortex-a9 можно найти в трех основных конфигурациях: только целые числа (integer only), только с блоком плавающей точки (floating-point unit), или с плавающей точкой и Advanced SIMD. Умолчание разрешает все инструкции, но могут использоваться расширения +nosimd и +nofp, чтобы соответственно запретить только инструкции SIMD, либо и SIMD, и инструкции плавающей точки.
Разрешенные имена для этой опции те же самые, что и для -mtune.
Для перечисленных CPU общими являются опции:
+nodsp Запрет инструкций DSP на cortex-m33, cortex-m35p и cortex-m55. Также запрещает расширение целых чисел M-Profile Vector Extension (MVE) и инструкции плавающей точки одинарной точности на cortex-m55.
+nomve Запрещает расширение целых чисел M-Profile Vector Extension (MVE) и инструкции плавающей точки одинарной точности на cortex-m55.
+nomve.fp Запрещает расширение M-Profile Vector Extension (MVE) и инструкции плавающей точки одинарной точности на 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-m55. Запрещает инструкции плавающей точки и инструкции 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.
Дополнительно generic-armv7-a pseudo target по умолчанию 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
Заставляет компилятор автоматически определять CPU компьютера сборки. В настоящее время эта функция поддерживается только на GNU/Linux, и распознаются не все архитектуры. Если автодетект прошел неудачно, то эта опция не дает эффекта.
-mfpu=name
Указывает, что на target имеется аппаратура плавающей точки (или аппаратная эмуляция плавающей точки). Разрешены имена 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 для арифметики плавающей точки (в частности, нестандартные значения рассматриваются как 0), так что использование инструкций NEON может привести к потере точности.
Вы можете также установить fpu name на уровне функции, используя атрибуты функции target("fpu=") [5], или директивы #pragma [6].
-mfp16-format=name
Указывает формат типа __fp16 плавающей запятой половинной точности. Для name разрешены имена none, ieee и alternative. По умолчанию используется none, в этом случае тип __fp16 не определен. Для дополнительной информации см. описание плавающей точки половинной точности [7].
-mstructure-size-boundary=n
Размеры всех структур и объединений округляются вверх, чтобы нацело делиться на количество бит, установленных этой опцией (выравнивание). Разрешены значения 8 (выравнивание отсутствует), 32 (выравнивание на границу слова) и 64 (выравнивание на границу двойного слова). Значение по умолчанию зависит от используемого тулчейна. Для тулчейнов, нацеленных на COFF, значение по умолчанию 8. Значение 64 разрешено только если нижележащий ABI [2] это поддерживает.
Указание большего значения может дать быстрый, более эффективный код, однако может также увеличить размер программы. Различные значения потенциально несовместимы. Код, скомпилированный с одним значением, необязательно будет работать с кодом или библиотекой, скомпилированными с другим значением, если имеется обмен используемыми структурами или объединениями.
Эта опция устарела.
-mabort-on-noreturn
Генерирует вызов функции abort в конце функции с атрибутом noreturn. Функция abort будет выполнена, если будет сделана попытка возврата из noreturn-функции.
-mlong-calls -mno-long-calls
Говорит компилятору производить вызовы функции предварительной загрузкой адреса функции в регистр, и затем выполнять вызов подпрограммы на этом регистре (long call). Этот ключ нужен, если целевая функция лежит в памяти вне 64-мегабайтного диапазона адресов для версии инструкции вызова подпрограммы, основанной на смещении.
Даже если этот ключ разрешен, не все вызовы функций будут превращены в дальние вызовы. На превращаются в дальние вызовы static-функции, функции с атрибутом short_call, функции в пределах действия директивы #pragma no_long_calls, и функции, определения которых уже были скомпилированы в рамках текущей единицы компиляции и не превращены в вызовы long call. Исключения из этого правила составляют определения weak-функций, функции с атрибутом long_call или атрибутом section, и функции, которые находятся в пределах действия директивы #pragma long_calls: во всех этих случаях вызовы превращаются в дальние.
По умолчанию действие этой опции не разрешено. Указание -mno-long-calls восстанавливает поведение по умолчанию, а также помещает вызовы функций в область действия директивы #pragma long_calls_off. Обратите внимание, что эти ключи не влияют на то, как компилятор генерирует код для обработки вызовов функций через указатели на функцию.
-msingle-pic-base
Рассматривает регистр, используемый для адресации PIC, как read-only, вместо загрузки его в пролог для каждой функции. Система времени выполнения (runtime) отвечает за инициализацию этого регистра походящим значением перед тем, как начнется выполнение.
-mpic-register=reg
Указывает регистр, который должен использоваться для адресации PIC (Program Instruction Counter). Для стандартного базового варианта PIC по умолчанию используется любой подходящий регистр, определенный компилятором. Для одного базового варианта PIC умолчанием является R9, если target основана на EABI, или разрешена проверка стека, иначе умолчанием будет R10.
-mpic-data-is-text-relative
Предполагается, что смещение между сегментами text (код программы) и data (данные программы) фиксировано во время выполнения статической линковки. Это разрешает операции адресации относительно PC для доступа к данным, находящихся в сегменте data. Для target-ов non-VxWorks RTP эта опция разрешена по умолчанию. Когда это поведение запрещено для таких target, оно будет по умолчанию разрешено использованием -msingle-pic-base.
-mpoke-function-name
Записывает имя каждой функции в секцию text, непосредственно перед прологом функции. Получается код наподобие следующего:
При выполнении обратной трассировки стека код может проверять значение PC, сохраненное в ячейку fp + 0. Если функция трассировки затем посмотрит на ячейку PC - 12, и старшие 8 установлены, то мы знаем, что это имя функции, встроенное непосредственно перед этим местом, и длина у имени ((pc[-3]) & 0xff000000).
-mthumb -marm
Выбирает между генерацией кода, выполняемого в состояниях ARM и Thumb. Умолчание для большинства конфигураций - генерировать код, который выполняется в состоянии ARM, но это умолчание может быть изменено конфигурированием GCC опцией --with-mode=state.
Вы также можете отменить режим ARM и Thumb для каждой функции, используя атрибуты функции target("thumb") и target("arm"), см. описание атрибутов функций [5], или используя директивы #pragma, см. [6].
-mflip-thumb
Переключает режимы ARM/Thumb на чередующихся функциях. Эта опция предоставлена для тестирования регрессии генерации смешанного кода Thumb/ARM, и она не предназначена для обычного использования скомпилированного кода.
-mtpcs-frame
Генерирует стек фрейма, совместимый со спецификацией Thumb Procedure Call Standard для всех non-leaf функций (leaf-функция это такая функция, которая не вызывает никакие другие функции [8]. По умолчанию используется -mno-tpcs-frame.
-mtpcs-leaf-frame
Генерирует стек фрейма, совместимый со спецификацией Thumb Procedure Call Standard для всех leaf функций. По умолчанию используется -mno-apcs-leaf-frame.
-mcallee-super-interworking
Предоставляет всем видимым снаружи функциям в файле, который компилируется, заголовок набора инструкций ARM, который переключает выполнение в режим Thumb перед выполнением остальной части функции. Это дает возможность этим функциям выполняться в режиме non-interworking. Эта опция недопустима в конфигурациях AAPCS, потому что по умолчанию разрешен смешанный код interworking.
-mcaller-super-interworking
Позволяет вызовам через указатели на функцию (включая virtual-функции) выполняться корректно несмотря на то, был ли скомпилирован target-код для interworking, или нет. Это приводит к небольшим накладным расходам на выполнение через указатель на функцию, если эта опция разрешена. Эта опция недопустима в конфигурациях AAPCS, потому что по умолчанию разрешен смешанный код interworking.
-mtp=name
Указывает модель доступа для указателя на локальное хранилище потока (Thread Local Storage, TLS). Допустимы модели:
soft Генерирует вызовы для __aeabi_read_tp. cp15 Извлекает указатель потока из cp15 напрямую (поддерживается в архитектуре arm6k). auto Использует лучший доступный метод для выбранного процессора. По умолчанию выбрано auto.
-mtls-dialect=dialect
Указывает используемый диалект для доступа к локальному хранилищу потока (TLS). Поддерживаются два диалекта: gnu и gnu2. Диалект gnu выбирает оригинальную схему GNU для поддержки local и global dynamic моделей TLS. Диалект gnu2 выбирает схему дескриптора GNU, которая предоставляет лучшее быстродействие для общих (shared) библиотек. Схема GNU descriptor совместима с оригинальной схемой, но требует поддержки нового ассемблера, линкера и библиотеки. На initial и local exec TLS модели эта опция не влияет, и всегда используется оригинальная схема.
-mword-relocations
Генерировать абсолютные релокации только по значениям размера слова (например R_ARM_ABS32). Это разрешено по умолчанию на target-ах (uClinux, SymbianOS), где runtime-загрузчик накладывает это ограничение, и когда указано -fpic или -fPIC. Эта опция конфликтует с -mslow-flash-data.
-mfix-cortex-m3-ldrd
Некоторые ядра Cortex-M3 могут приводить к повреждению данных, когда используются инструкции ldrd с перекрывающимися адресатами и базовыми регистрами. Эта опция предотвращает генерацию таких инструкций. По умолчанию эта опция разрешена, когда указана опция -mcpu=cortex-m3.
Разрешает (или запрещает) смягчение erratum на Cortex-A57 и Cortex-A72, которое влияет на инструкции криптографии AES. Эта опция по умолчанию разрешена, когда указана либо опция -mcpu=cortex-a57, либо опция -mcpu=cortex-a72.
-munaligned-access -mno-unaligned-access
Разрешает (или запрещает) чтение и запись 16- и 32-битных значений из адресов, которые не выровнены на 16 или 32 бита. По умолчанию невыровненный доступ запрещен для архитектур pre-ARMv6, ARMv6-M и ARMv8-M Baseline, и разрешен для всех других архитектур. Если невыровненный доступ не разрешен, то к словам в упакованных структурах данных осуществляется доступ по одному байту.
В зависимости от этой опции ARM-атрибут Tag_CPU_unaligned_access установливается в сгенерированном файле в значение true или false. Если невыровненный доступ разрешен, то также определяется символ препроцессора __ARM_FEATURE_UNALIGNED.
-mneon-for-64bits
Эта опция устарела и не дает никакого эффекта.
-mslow-flash-data
Предполагается загрузка данных из flash медленнее, чем выборка инструкции. Таким образом, литеральная загрузка минимизируется с целью повышения производительности. Эта опция по умолчанию выключена, и поддерживается только когда компиляция происходит для ARMv7 M-profile. Эта опция конфликтует с -mword-relocations.
-masm-syntax-unified
Предполагается, что inline-ассемблер использует унифицированный синтаксис (unified asm). По умолчанию в настоящий момент выключено, что подразумевает divided-синтаксис. Эта опция не влияет на Thumb2. Однако поведение опции может поменяться в будущих релизах GCC. Divided-синтаксис должен считаться устаревшим.
-mrestrict-it
Ограничивает генерацию IT блоков, чтобы удовлетворять правилам ARMv8-A. IT-блоки могут содержать только 16-битную инструкцию из выбранного набора инструкций. Эта опция по умолчанию включена для режима ARMv8-A Thumb.
-mprint-tune-info
Печатает информацию настройки CPU в виде комментария в файле ассемблера. Эта опция используется только для теста регрессии компилятора, и не предназначена для компиляции обычного рабочего кода. По умолчанию эта опция запрещена.
-mverbose-cost-dump
Разрешает подробную модель дампа (verbose cost model dumping) в файлах отладки (debug dump files). Эта опция предоставлена для отладки компилятора.
-mpure-code
Не позволяет данным констант размещаться в секциях кода. Дополнительно, когда компиляция происходит для объектного формата ELF, все специфичные для процессора text-секции ELF получают атрибут SHF_ARM_PURECODE. Эта опция доступа только когда генерируется non-pic код для target-ов M-profile.
-mcmse
Генерирует безопасный код, как описано в спецификации расширений безопасности ARMv8-M [9].
-mfix-cmse-cve-2021-35465
Смягчает потенциальную проблему безопасности, связанную с инструкцией VLLDM на некоторых M-profile устройствах, когда используется CMSE (CVE-2021-365465). Эта опция разрешена по умолчанию, когда используется опция -mcpu= с именами cortex-m33, cortex-m35p, cortex-m55 и star-mc1. Для запрета этого смягчения может использоваться опция -mno-fix-cmse-cve-2021-35465.
Генерирует "канареечный" (предупреждающий) код защиты от переполнения стека (canary at guard). Поддерживаются области 'global' для global canary или 'tls' для canary-кода, доступного через регистр TLS. Опция -mstack-protector-guard-offset= предназначена для использования с -fstack-protector-guard=tls, и не предназначена для использования в коде user-land.
-mfdpic -mno-fdpic
Выбирает FDPIC ABI, который использует 64-разрядные дескрипторы функций для представления указателей на функции. Когда компилятор сконфигурирован для target-ов arm-*-uclinuxfdpiceabi, эта опция по умолчанию включена, и подразумевает -fPIE, если не предоставлена ни одна из опций, связанных с PIC/PIE. На других target, эта опция только разрешает генерацию специфичного для FDPIC кода, и пользователь должен явно предоставить опции PIC/PIE по мере необходимости.
Обратите внимание, что статическая линковка не поддерживается, поскольку это все еще вовлекает динамический линкер, когда программа использует самостоятельное перемещение по адресному пространству (self-relocates). Если такое поведение допустимо, используйте опции -static и -Wl,-dynamic-linker.
Полезна (и необходима) противоположная опция -mno-fdpic для сборки ядра Linux, с использованием того же самого (arm-*-uclinuxfdpiceabi) тулчейна как тот, который использовался для сборки userland-программ.
[Ссылки]
1. GCC ARM Options site:gcc.gnu.org. 2. Что означают аббревиатуры ABI и EABI? 3. Порядок следования байт (endianness). 4. Vector Floating Point Instruction Set Quick Reference Card site:documentation-service.arm.com. 5. ARM Function Attributes site:gcc.gnu.org. 6. Function Specific Option Pragmas site:gcc.gnu.org. 7. Half-Precision Floating Point site:gcc.gnu.org. 8. Что означает "leaf" и "non-leaf" для функций? 9. ARMv8-M Security Extensions Requirements on Development Tools Engineering Specification site:developer.arm.com.