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 для плавающей точки в жестком и мягком режиме несовместимы с точки зрения компоновки; необходимо скомпилировать всю программу с одним и тем же ABI и скомпоновать с соответствующим набором библиотек.
-mlittle-endian-
Генерировать код для процессора, работающего в режиме little-endian. Это значение по умолчанию для всех стандартных конфигураций.
-mbig-endian-
Генерировать код для процессора, работающего в режиме big-endian; по умолчанию код компилируется для процессора в режиме little-endian.
-march=name-
Указывает имя целевой ARM архитектуры. GCC использует это имя, чтобы определить, какие инструкции могут быть выведены при генерации кода ассемблера. Этот параметр может использоваться совместно или вместо параметра -mcpu=. Допустимые имена: ‘armv2’, ‘armv2a’, ‘armv3’, ‘armv3m’, ‘armv4’, ‘armv4t’, ‘armv5’, ‘armv5t’, ‘armv5e’, ‘armv5te’, ‘armv6’, ‘armv6j’, ‘armv6t2’, ‘armv6z’, ‘armv6kz’, ‘armv6-m’, ‘armv7’, ‘armv7-a’, ‘armv7-r’, ‘armv7-m’, ‘armv7e-m’, ‘armv7ve’, ‘armv8-a’, ‘armv8-a+crc’, ‘armv8.1-a’, ‘armv8.1-a+crc’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’.
Архитектуры, более старые, чем armv4t, устарели.
-march=armv7ve — это архитектура armv7-a с расширениями виртуализации.
-march=armv8-a+crc включает генерацию кода для архитектуры ARMv8-A вместе с необязательными расширениями CRC32.
-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-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘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’, ‘qdf24xx’, ‘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’.
-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-
Указывает, какое аппаратное обеспечение для плавающей точки (или эмуляция аппаратного обеспечения) доступно на целевой платформе. Допустимые имена: ‘vfp’, ‘vfpv3’, ‘vfpv3-fp16’, ‘vfpv3-d16’, ‘vfpv3-d16-fp16’, ‘vfpv3xd’, ‘vfpv3xd-fp16’, ‘neon’, ‘neon-fp16’, ‘vfpv4’, ‘vfpv4-d16’, ‘fpv4-sp-d16’, ‘neon-vfpv4’, ‘fpv5-d16’, ‘fpv5-sp-d16’, ‘fp-armv8’, ‘neon-fp-armv8’ и ‘crypto-neon-fp-armv8’.
Если указан -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 по умолчанию используется любой подходящий регистр, определяемый компилятором. Для случая single PIC base значение по умолчанию равно ‘R9’, если целевой ABI основан на EABI или включена проверка стека, в противном случае значение по умолчанию равно ‘R10’.
-mpic-data-is-text-relative-
Предполагается, что каждый сегмент данных относительны к сегменту текста во время загрузки. Поэтому это позволяет адресовать данные с помощью операций PC-относительных операций. Этот параметр включен по умолчанию для целей, отличных от VxWorks RTP.
-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, для всех функций, не являющихся листовыми. (Функция-лист — это функция, которая не вызывает другие функции). Значение по умолчанию — -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, и включен для всех других архитектур. Если невыровненный доступ отключен, слова в упакованных структурах данных считываются побайтно.
Атрибут 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-
Печать информации о настройке процессора как комментарий в файле ассемблера. Это опция, используемая только для регрессионного тестирования компилятора, и не предназначена для обычного использования при компиляции кода. Эта опция отключена по умолчанию.
Далее: Опции AVR, Предыдущее: Опции ARC, Вверх: Опции подмодели [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/ARM-Options.html