Spec-Zone.ru › GCC 4

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

Spec-Zone.ru

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