3.17.4 Параметры ARM
Эти ‘-m’ параметры определены для архитектур Advanced RISC Machines (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.
-mwords-little-endian- Этот параметр применяется только при генерации кода для big-endian процессоров. Генерировать код для little-endian порядка слов, но big-endian порядка байтов. То есть порядок байтов вида ‘
32107654’. Примечание: этот параметр следует использовать только если требуется совместимость с кодом для big-endian процессоров ARM, сгенерированным версиями компилятора до 2.8. Этот параметр устарел. -
-march=name - Указывает имя целевой архитектуры ARM. GCC использует это имя для определения типа инструкций, которые можно генерировать при генерации кода ассемблера. Этот параметр можно использовать в сочетании с параметром
-mcpu=или вместо него. Допустимые имена: ‘armv2’, ‘armv2a’, ‘armv3’, ‘armv3m’, ‘armv4’, ‘armv4t’, ‘armv5’, ‘armv5t’, ‘armv5e’, ‘armv5te’, ‘armv6’, ‘armv6j’, ‘armv6t2’, ‘armv6z’, ‘armv6zk’, ‘armv6-m’, ‘armv7’, ‘armv7-a’, ‘armv7-r’, ‘armv7-m’, ‘armv7e-m’, ‘armv7ve’, ‘armv8-a’, ‘armv8-a+crc’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’.-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’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a53’, ‘cortex-a57’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-m4’, ‘cortex-m3’, ‘cortex-m1’, ‘cortex-m0’, ‘cortex-m0plus’, ‘marvell-pj4’, ‘xscale’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’, ‘fa526’, ‘fa626’, ‘fa606te’, ‘fa626te’, ‘fmp626’, ‘fa726te’.Кроме того, этот параметр может указать, что GCC должен настраивать производительность кода для системы big.LITTLE. Допустимые имена: ‘
cortex-a15.cortex-a7’, ‘cortex-a57.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’, ‘fp-armv8’, ‘neon-fp-armv8’ и ‘crypto-neon-fp-armv8’.Если
-msoft-floatуказан, это задаёт формат значений с плавающей точкой.Если выбранное аппаратное обеспечение для плавающей точки включает расширение NEON (например,
-mfpu=‘neon’), обратите внимание, что операции с плавающей точкой не генерируются проходом автоматической векторизации GCC, если также не указан-funsafe-math-optimizations. Это связано с тем, что аппаратное обеспечение NEON не полностью реализует стандарт IEEE 754 для арифметики с плавающей точкой (в частности, значения с ненормализованной мантиссой обрабатываются как ноль), поэтому использование инструкций NEON может привести к потере точности. -
-mfp16-format=name - Указывает формат типа
__fp16полуточной плавающей точки. Допустимые имена: ‘none’, ‘ieee’ и ‘alternative’; значение по умолчанию — ‘none’, в этом случае тип__fp16не определён. См. Полуточная точность для получения дополнительной информации. -
-mstructure-size-boundary=n
- Размеры всех структур и объединений округляются до кратного числу битов, заданному этим параметром. Допустимые значения — 8, 32 и 64. Значение по умолчанию варьируется в зависимости от инструментальной цепочки. Для инструментальной цепочки, ориентированной на COFF, значение по умолчанию равно 8. Значение 64 допускается только в том случае, если это поддерживается базовой ABI.
Указание большего числа может привести к более быстрому и эффективному коду, но также может увеличить размер программы. Разные значения потенциально несовместимы. Код, скомпилированный с одним значением, не может гарантированно работать с кодом или библиотеками, скомпилированными с другим значением, если они обмениваются информацией с помощью структур или объединений.
-mabort-on-noreturn- Генерирует вызов функции
abortв конце функцииnoreturn. Выполняется, если функция пытается вернуть значение. -
-mlong-calls-mno-long-calls - Указывает компилятору выполнять вызовы функций путём предварительной загрузки адреса функции в регистр, а затем выполнения вызова подпрограммы для этого регистра. Этот переключатель необходим, если целевая функция находится за пределами диапазона адресации в 64 мегабайта, доступного в варианте вызова подпрограммы на основе смещения.
Даже если этот переключатель включён, не все вызовы функций преобразуются в длинные вызовы. Эвристика заключается в том, что статические функции, функции, имеющие атрибут ‘
short-call’, функции, находящиеся в области действия директивы ‘#pragma no_long_calls’, и функции, определения которых уже были скомпилированы в текущей единице компиляции, не преобразуются в длинные вызовы. Исключением из этого правила являются слабые определения функций, функции с атрибутом ‘long-call’ или атрибутом ‘section’, и функции, находящиеся в области действия директивы ‘#pragma long_calls’; они всегда преобразуются в длинные вызовы.Эта функция по умолчанию отключена. Указание
-mno-long-callsвосстанавливает поведение по умолчанию, так же как и размещение вызовов функций в области действия директивы ‘#pragma long_calls_off’. Обратите внимание, что эти переключатели не влияют на то, как компилятор генерирует код для обработки вызовов функций через указатели на функции. -msingle-pic-base- Обрабатывает регистр, используемый для PIC-адресации, как только для чтения, а не загружает его в прологе каждой функции. Система выполнения отвечает за инициализацию этого регистра соответствующим значением перед началом выполнения.
-
-mpic-register=reg - Указывает регистр, который следует использовать для PIC-адресации. В стандартном случае PIC-базы по умолчанию будет выбран любой подходящий регистр, определённый компилятором. В случае одиночной PIC-базы по умолчанию будет ‘
R9’, если целевая платформа основана на EABI или включено проверка стека, в противном случае по умолчанию будет ‘R10’. -mpic-data-is-text-relative- Предполагается, что каждый сегмент данных относится к сегменту текста во время загрузки. Поэтому это позволяет адресовать данные с помощью операций PC-относительных.
-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. -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-профиля и по умолчанию выключен.
-mrestrict-it- Ограничивает генерацию блоков IT, чтобы соответствовать правилам ARMv8. Блоки IT могут содержать только одну 16-битную инструкцию из набора выбранных инструкций. Этот параметр включён по умолчанию для режима Thumb ARMv8.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/ARM-Options.html