Spec-Zone.ru › GCC 6

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

Spec-Zone.ru

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