Программирование ARM Опции ARM компилятора GCC Fri, April 19 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Опции ARM компилятора GCC Печать
Добавил(а) microsin   

Следующие опции, которые начинаются с префикса '-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= или вместо неё.

Возможны следующие имена: 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.

Многие архитектуры поддерживают расширения. Они могут быть добавлены присоединением +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.

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

armv5te, armv6, armv6j, armv6k, armv6kz, armv6t2, armv6z, armv6zk

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

armv8-a

    +crc
        Инструкции контрольной суммы CRC (Cyclic Redundancy Check).

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

    +crypto
        Инструкции криптографии.

    +nocrypto
        Запрет инструкций криптографии.

    +nofp
        Запрет инструкций плавающей точки, Advanced SIMD и криптографии.

    +sb
        Инструкции спекулятивного барьера (Speculation Barrier Instruction, SBI).

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

armv8.1-a

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

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

    +nocrypto
        Запрет инструкций криптографии.

    +nofp
        Запрет инструкций плавающей точки, Advanced SIMD и криптографии.

    +sb
        Инструкции спекулятивного барьера (Speculation Barrier Instruction, SBI).

    +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 и криптографии.

    +sb
        Инструкции спекулятивного барьера (Speculation Barrier Instruction, SBI).

    +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 и криптографии.

    +sb
        Инструкции спекулятивного барьера (Speculation Barrier Instruction, SBI).

    +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 регистрами двойной точности и операциями преобразования плавающей точки половинной точности.

    +nofp
        Запрет расширения плавающей точки.

    +idiv
        Инструкции целочисленного деления ARM-state.

    +noidiv
        Запрет расширения целочисленного деления ARM-state.

armv7e-m

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

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

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

    +nofp
        Запрет расширений плавающей точки.

armv8.1-m.main

    +dsp
        Инструкции цифровой обработки сигналов (DSP).

    +mve
        Целочисленные инструкции M-Profile Vector Extension (MVE).

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

armv8-r

    +crc
        Инструкции контрольной суммы CRC (Cyclic Redundancy Check).

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

+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 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, непосредственно перед прологом функции. Получается код наподобие следующего:

     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"), см. описание атрибутов функций [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.

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

Разрешает (или запрещает) смягчение 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.

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

Генерирует "канареечный" (предупреждающий) код защиты от переполнения стека (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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page