Spec-Zone.ru › GCC 7

3.18.4 Параметры ARM

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

-mabi=name

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

-mapcs-frame

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

-mapcs

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

-mthumb-interwork

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

-mno-sched-prolog

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

-mfloat-abi=name

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

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

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

-mlittle-endian

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

-mbig-endian

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

-march=name

Указывает имя целевой архитектуры ARM. GCC использует это имя для определения типов инструкций, которые могут быть выпущены при генерации кода ассемблера. Этот параметр можно использовать вместе с или вместо параметра -mcpu=. Допустимые имена: «armv2», «armv2a», «armv3», «armv3m», «armv4», «armv4t», «armv5», «armv5e», «armv5t», «armv5te», «armv6», «armv6-m», «armv6j», «armv6k», «armv6kz», «armv6s-m», «armv6t2», «armv6z», «armv6zk», «armv7», «armv7-a», «armv7-m», «armv7-r», «armv7e-m», «armv7ve», «armv8-a», «armv8-a+crc», «armv8.1-a», «armv8.1-a+crc», «armv8-m.base», «armv8-m.main», «armv8-m.main+dsp», «iwmmxt», «iwmmxt2».

Архитектуры, более старые, чем «armv4t», устарели.

-march=armv6s-m — это архитектура «armv6-m» с поддержкой инструкции SVC (теперь обязательной).

-march=armv6zk — псевдоним для «armv6kz», существующий для обратной совместимости.

-march=armv7ve — архитектура «armv7-a» с расширениями виртуализации.

-march=armv8-a+crc включает генерацию кода для архитектуры ARMv8-A вместе с дополнительными расширениями CRC32.

-march=armv8.1-a включает поддержку компилятора для архитектуры ARMv8.1-A. Это также включает функции, предоставляемые -march=armv8-a+crc.

-march=armv8.2-a включает поддержку компилятора для архитектуры ARMv8.2-A. Это также включает функции, предоставляемые -march=armv8.1-a.

-march=armv8.2-a+fp16 включает поддержку компилятора для архитектуры ARMv8.2-A с дополнительным расширением инструкций FP16. Это также включает функции, предоставляемые -march=armv8.1-a, и подразумевает -mfp16-format=ieee.

-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-a57», «cortex-a72», «cortex-a73», «cortex-r4», «cortex-r4f», «cortex-r5», «cortex-r7», «cortex-r8», «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».

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

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

-mcpu=name

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

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

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

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

-mfpu=name

Это определяет, какое оборудование с плавающей запятой (или эмуляция оборудования) доступно на целевой платформе. Допустимые имена: ‘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’.

Если указано -msoft-float, это определяет формат значений с плавающей запятой.

Если выбранное оборудование с плавающей запятой включает расширение 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 base значение по умолчанию — любой подходящий регистр, определяемый компилятором. Для одиночного случая PIC base значение по умолчанию — ‘R9’, если цель основана на EABI или включена проверка стека; в противном случае значение по умолчанию — ‘R10’.

-mpic-data-is-text-relative

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

-mpoke-function-name

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

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

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

-mthumb
-marm

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

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

-mtpcs-frame

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

-mtpcs-leaf-frame

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

-mcallee-super-interworking

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

-mcaller-super-interworking

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

-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-profile и по умолчанию выключена.

-masm-syntax-unified

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

-mrestrict-it

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

-mprint-tune-info

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

-mpure-code

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

-mcmse

Генерирует защищённый код в соответствии с «Спецификацией требований к разработке инструментов ARMv8-M Security Extensions», доступной по адресу http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/ECM0359818_armv8m_security_extensions_reqs_on_dev_tools_1_0.pdf.

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

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

Spec-Zone.ru

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