2.9 Параметры для соглашений о генерации кода
Эти независимые от машины параметры контролируют соглашения об интерфейсе, используемые при генерации кода.
Большинство из них имеют как положительную, так и отрицательную форму; отрицательная форма -ffoo будет -fno-foo. В таблице ниже указана только одна из форм — та, которая не является по умолчанию. Вы можете определить другую форму, либо удалив no-, либо добавив её.
-fno-automatic-
Обращайтесь с каждой программой (кроме отмеченных как RECURSIVE) так, как если бы для каждой локальной переменной и массива, на которые в ней ссылаются, было указано оператор
SAVE. Не влияет на общие блоки. (Некоторые компиляторы Fortran предоставляют этот вариант под именем -static или -save.) По умолчанию, которое является -fautomatic, для локальных переменных меньше заданного значения -fmax-stack-var-size используется стек. Используйте опцию -frecursive, чтобы не использовать статическую память.Локальные переменные или массивы, имеющие явное атрибут
SAVE, молча игнорируются, если не добавлена опция -pedantic. -ff2c-
Генерировать код, предназначенный для совместимости с кодом, сгенерированным
g77иf2c.Вызовы, используемые
g77(первоначально реализованные вf2c), требуют, чтобы функции, возвращающие тип по умолчаниюREAL, фактически возвращали тип Cdouble, а функции, возвращающие типCOMPLEX, возвращали значения через дополнительный аргумент в последовательности вызовов, указывающий, куда сохранить возвращаемое значение. При использовании стандартных соглашений о вызовах GNU такие функции просто возвращают свои результаты так же, как и в GNU C — функции по умолчаниюREALвозвращают тип Cfloat, а функцииCOMPLEXвозвращают тип GNU Ccomplex. Кроме того, эта опция подразумевает опцию -fsecond-underscore, если явно не запрошена опция -fno-second-underscore.Это не влияет на генерацию кода, взаимодействующего с библиотекой
libgfortran.Предупреждение: Не рекомендуется смешивать код Fortran, скомпилированный с -ff2c, с кодом, скомпилированным со стандартными соглашениями о вызовах -fno-f2c, так как вызов
COMPLEXили стандартных функцийREALмежду частями программы, скомпилированными с различными соглашениями о вызовах, приведет к ошибке во время выполнения.Предупреждение: Это нарушит код, передающий встроенные функции типа по умолчанию
REALилиCOMPLEXв качестве фактических аргументов, так как реализации библиотек используют соглашения о вызовах -fno-f2c. -fno-underscoring-
Не преобразовывать имена сущностей, указанные в исходном файле Fortran, добавляя к ним нижние подчёркивания.
При использовании -funderscoring, GNU Fortran добавляет одно нижнее подчёркивание к внешним именам без нижних подчёркиваний. Это делается для обеспечения совместимости с кодом, созданным многими компиляторами Fortran для UNIX.
Предупреждение: По умолчанию поведение GNU Fortran несовместимо с
f2cиg77, пожалуйста, используйте опцию -ff2c, если вы хотите, чтобы объектные файлы, скомпилированные с помощью GNU Fortran, были совместимы с объектным кодом, созданным этими инструментами.Использование -fno-underscoring не рекомендуется, если вы не экспериментируете с проблемами интеграции GNU Fortran в существующие системные среды (взаимодействия с существующими библиотеками, инструментами и т. д.).
Например, при использовании -funderscoring, и предположим, что
j()иmax_count()являются внешними функциями, аmy_varиlvarявляются локальными переменными, операторI = J() + MAX_COUNT (MY_VAR, LVAR)
реализуется как что-то похожее на:
i = j_() + max_count__(&my_var__, &lvar);
При использовании -fno-underscoring, тот же оператор реализуется как:
i = j() + max_count(&my_var, &lvar);
Использование -fno-underscoring позволяет напрямую указывать пользовательские имена при отладке и при взаимодействии кода GNU Fortran с другими языками.
Обратите внимание, что совпадение имён не означает, что интерфейс, реализованный GNU Fortran для внешнего имени, соответствует интерфейсу, реализованному другим языком для этого же имени. То есть, добиться связывания кода, сгенерированного GNU Fortran, с кодом, сгенерированным другим компилятором, с помощью этого или любого другого метода, может быть лишь небольшой частью общего решения — добиться согласия сгенерированного кода обоих компиляторов по вопросам, помимо именования, может потребовать значительных усилий, и, в отличие от разногласий по именованию, линковщики обычно не могут обнаружить разногласия в этих других областях.
Также обратите внимание, что при использовании -fno-underscoring, отсутствие добавленных нижних подчёркиваний создаёт очень реальную возможность конфликта пользовательского внешнего имени с именем в системной библиотеке, что в некоторых случаях может затруднить поиск ошибок неопределенных ссылок — они могут возникнуть во время выполнения программы и проявляться только как некорректное поведение во время выполнения.
В будущих версиях GNU Fortran мы надеемся улучшить проблемы именования и связывания, чтобы отладка всегда включала использование имён, как они появляются в исходном коде, даже если имена, как их видит линковщик, искажаются для предотвращения случайного связывания процедур с несовместимыми интерфейсами.
-fsecond-underscore-
По умолчанию GNU Fortran добавляет нижнее подчёркивание к внешним именам. Если используется эта опция, GNU Fortran добавляет два нижних подчёркивания к именам с нижними подчёркиваниями и одно нижнее подчёркивание к внешним именам без нижних подчёркиваний. GNU Fortran также добавляет два нижних подчёркивания к внутренним именам с нижними подчёркиваниями, чтобы избежать столкновений имён с внешними именами.
Эта опция не имеет эффекта, если включена опция -fno-underscoring. Она подразумевается опцией -ff2c.
В противном случае, с этой опцией, внешнее имя, например
MAX_COUNT, реализуется как ссылка на внешнюю ссылку времени компоновкиmax_count__, а неmax_count_. Это необходимо для совместимости сg77иf2c, и подразумевается использованием опции -ff2c. -fcoarray=<keyword>-
- ‘none’
-
Отключить поддержку комассивов; использование деклараций комассивов и инструкций управления изображениями приведет к ошибке компиляции. (По умолчанию)
- ‘single’
-
Режим одного изображения, т. е.
num_images()всегда равно одному. - ‘lib’
Параллелизация комассивов на основе библиотек; необходимо связать подходящую библиотеку комассивов GNU Fortran.
-fcheck=<keyword>-
Включить генерацию проверок во время выполнения; аргумент должен быть список ключевых слов, разделённых запятыми. Предварительный префикс no- отключает его, если он был активирован предыдущим указанием.
- ‘all’
-
Включить все тесты во время выполнения -fcheck.
- ‘array-temps’
-
Выдаёт предупреждение во время выполнения, когда для передачи фактического аргумента необходимо сгенерировать временный массив. Информация, сгенерированная этим предупреждением, иногда полезна при оптимизации, чтобы избежать таких временных массивов.
Примечание: Предупреждение выводится только один раз на расположение.
- ‘bounds’
-
Включить генерацию проверок во время выполнения для индексов массивов и против указанных минимальных и максимальных значений. Также проверяет индексы массивов для массивов с предполагаемой и отложенной формой против фактических выделенных границ и гарантирует, что все длины строк равны для конструкторов массивов символов без явного типа.
Некоторые проверки требуют, чтобы -fcheck=bounds был задан для компиляции основной программы.
Примечание: В будущем это может также включать другие формы проверки, например, проверку ссылок на подстроки.
- ‘do’
-
Включить генерацию проверок во время выполнения для недопустимого изменения переменных итерации цикла.
- ‘mem’
-
Включить генерацию проверок во время выполнения для выделения памяти. Примечание: Эта опция не влияет на явные выделения с помощью оператора
ALLOCATE, которые всегда будут проверены. - ‘pointer’
-
Включить генерацию проверок во время выполнения для указателей и изменяемых массивов.
- ‘recursion’
Включить генерацию проверок во время выполнения для рекурсивно вызываемых подпрограмм и функций, которые не помечены как рекурсивные. См. также -frecursive. Примечание: Эта проверка не работает для программ OpenMP и отключена, если используется вместе с -frecursive и -fopenmp.
Пример: Предположим, у вас есть файл foo.f90, команда
gfortran -fcheck=all,no-array-temps foo.f90
скомпилирует файл со всеми включенными проверками, указанными выше, за исключением предупреждений о сгенерированных временных массивах.
-fbounds-check-
Устаревший псевдоним для -fcheck=bounds.
-ftail-call-workaround-ftail-call-workaround=n-
Некоторые C-интерфейсы к коду Fortran нарушают gfortran ABI, опуская скрытые аргументы длины символов, как описано в См. Соглашения о передаче аргументов. Это может привести к сбоям, потому что загрузка аргументов для хвостовых вызовов может переполнить стек.
Для обеспечения обходного пути для существующих бинарных пакетов эта опция отключает оптимизацию хвостовых вызовов для процедур gfortran с аргументами символьного типа. С -ftail-call-workaround=2 оптимизация хвостовых вызовов отключена для всех процедур gfortran с аргументами символьного типа, с -ftail-call-workaround=1 или эквивалентной -ftail-call-workaround только для процедур gfortran с аргументами символьного типа, которые вызывают неявно прописанные процедуры.
Использование этой опции может привести к проблемам, включая сбои из-за недостаточного места в стеке.
Сильно рекомендуется исправить проблемный код. Опция -fc-prototypes-external может использоваться для генерации прототипов, соответствующих ABI gfortran, для включения в исходный код.
Поддержка этой опции, вероятно, будет удалена в будущей версии gfortran.
Отрицательная форма -fno-tail-call-workaround или эквивалентная -ftail-call-workaround=0 может использоваться для отключения этой опции.
По умолчанию в настоящее время установлено -ftail-call-workaround, это изменится в будущих выпусках.
-fcheck-array-temporaries-
Устаревший псевдоним для -fcheck=array-temps.
-fmax-array-constructor=n-
Эту опцию можно использовать для увеличения максимального значения, разрешенного в конструкторах массивов. Приведенный ниже код требует этой опции для расширения массива во время компиляции.
program test implicit none integer j integer, parameter :: n = 100000 integer, parameter :: i(n) = (/ (2*j, j = 1, n) /) print '(10(I0,1X))', i end program test
Предупреждение: Эта опция может привести к длительному времени компиляции и чрезмерно большим объектным файлам.
Значение по умолчанию для n составляет 65535.
-fmax-stack-var-size=n
-
Этот параметр задаёт размер в байтах самого большого массива, который будет помещён в стек; если размер превышен, используется статическая память (за исключением процедур, помеченных как RECURSIVE). Используйте параметр -frecursive, чтобы разрешить рекурсивные процедуры, не имеющие атрибута RECURSIVE, или для параллельных программ. Используйте -fno-automatic, чтобы никогда не использовать стек.
В настоящее время этот параметр влияет только на локальные массивы, объявленные с постоянными границами, и может не применяться ко всем символьным переменным. Будущие версии GNU Fortran могут улучшить это поведение.
Значение по умолчанию для n равно 32768.
-fstack-arrays-
Добавление этого параметра заставит компилятор Fortran помещать все массивы неизвестного размера и временные массивы в память стека. Если ваша программа использует очень большие локальные массивы, возможно, вам придётся увеличить лимиты времени выполнения для памяти стека на некоторых операционных системах. Этот флаг включён по умолчанию на уровне оптимизации -Ofast, если не указан -fmax-stack-var-size.
-fpack-derived-
Этот параметр сообщает GNU Fortran упаковывать члены производных типов как можно более плотно. Код, скомпилированный с этим параметром, вероятно, будет несовместим с кодом, скомпилированным без него, и может работать медленнее.
-frepack-arrays-
В некоторых случаях GNU Fortran может передавать секции массивов с предполагаемой формой через дескриптор, описывающий несмежную область памяти. Этот параметр добавляет код в предикат функции для переупаковки данных в непрерывный блок во время выполнения.
Это должно привести к более быстрым обращениям к массиву. Однако это может привести к существенной дополнительной нагрузке на вызов функции, особенно когда передаваемые данные несмежные.
-fshort-enums-
Этот параметр предоставлен для взаимодействия с кодом C, скомпилированным с параметром -fshort-enums. Он заставит GNU Fortran выбрать наименьший
INTEGERвид, в который поместится заданный набор перечислителей, и присвоит всем его перечислителям этот вид. -fexternal-blas-
Этот параметр заставит
gfortranгенерировать вызовы функций BLAS для некоторых матричных операций, таких какMATMUL, вместо использования собственных алгоритмов, если размер вовлечённых матриц больше заданного предела (см. -fblas-matmul-limit). Это может быть выгодно, если доступна оптимизированная библиотека BLAS от поставщика. Библиотека BLAS должна быть указана во время компоновки. -fblas-matmul-limit=n-
Значимо только при использовании -fexternal-blas. Умножение матриц размером больше или равным n будет выполняться функциями BLAS, а остальные — внутренними алгоритмами
gfortran. Если матрицы не квадратные, сравнение размеров выполняется, используя геометрическое среднее измерений матрицы-аргумента и матрицы-результата.Значение по умолчанию для n равно 30.
-finline-matmul-limit=n-
При активной оптимизации на стадии передней части компиляции некоторые вызовы встроенной функции
MATMULбудут встроены. Это может привести к увеличению размера кода, если размер матрицы не может быть определён во время компиляции, так как генерируется код для обоих случаев. Установка-finline-matmul-limit=0отключит встраивание во всех случаях. Установка этого параметра со значением n создаст встроенный код для матриц размером до n. Если матрицы не квадратные, сравнение размеров выполняется, используя геометрическое среднее измерений матрицы-аргумента и матрицы-результата.Значение по умолчанию для n равно 30.
-fblas-matmul-limitможет быть использовано для изменения этого значения. -frecursive-
Разрешить косвенную рекурсию, принуждая все локальные массивы к выделению в стеке. Этот флаг нельзя использовать вместе с -fmax-stack-var-size= или -fno-automatic.
-finit-local-zero-finit-derived-finit-integer=n-finit-real=<zero|inf|-inf|nan|snan>-finit-logical=<true|false>-finit-character=n-
Параметр -finit-local-zero указывает компилятору инициализировать локальные
INTEGER,REAL, иCOMPLEXпеременные нулём,LOGICALпеременные ложью, иCHARACTERпеременные строкой нулевых байтов. Более точные параметры инициализации предоставляются параметрами -finit-integer=n, -finit-real=<zero|inf|-inf|nan|snan> (также инициализирует вещественную и мнимую части локальныхCOMPLEXпеременных), -finit-logical=<true|false> и -finit-character=n (где n — значение ASCII символа).С -finit-derived компоненты переменных производного типа будут инициализированы в соответствии с этими флагами. Компоненты, тип которых не покрыт явным флагом -finit-*, будут обрабатываться так же, как описано выше с -finit-local-zero.
Эти параметры не инициализируют
- объекты с атрибутом POINTER
- распределяемые массивы
- переменные, которые появляются в инструкции
EQUIVALENCE
(Эти ограничения могут быть сняты в будущих выпусках).
Обратите внимание, что параметр -finit-real=nan инициализирует
REALиCOMPLEXпеременные тихим NaN. Для сигнализирующего NaN используйте -finit-real=snan; однако имейте в виду, что оптимизации на этапе компиляции могут преобразовать их в тихие NaN, и необходимо включить обработку исключений (например, через -ffpe-trap).Параметр -finit-integer проанализирует значение в целое число типа
INTEGER(kind=C_LONG)на хост-машине. Это значение затем присваивается целочисленным переменным в коде Fortran, что может привести к переполнению, если значение слишком велико для заданного вида.Наконец, обратите внимание, что включение любого из параметров -finit-* отключит предупреждения, которые могли бы быть выведены параметром -Wuninitialized для соответствующих локальных переменных.
-falign-commons-
По умолчанию
gfortranобеспечивает правильное выравнивание всех переменных в блокеCOMMONпутем добавления необходимых дополнений. На некоторых платформах это обязательно, на других это повышает производительность. Если блокCOMMONне объявлен с согласованными типами данных повсюду, эта настройка может вызвать проблемы, и -fno-align-commons может быть использован для отключения автоматического выравнивания. Такой же параметр должен быть использован для всех файлов, которые используют блокCOMMON. Для избежания потенциальных проблем с выравниванием в блокахCOMMON, рекомендуется упорядочить объекты по убыванию размера. -fno-protect-parens-
По умолчанию скобки в выражениях учитываются для всех уровней оптимизации, так что компилятор не выполняет никакой перегруппировки. Использование -fno-protect-parens позволяет компилятору переупорядочивать
REALиCOMPLEXвыражения, чтобы получить более быстрый код. Обратите внимание, что для оптимизации перегруппировки должны быть активны параметры -fno-signed-zeros и -fno-trapping-math. Защита скобок включена по умолчанию, если не указан -Ofast. -frealloc-lhs-
Распределяемая левая часть в присваивании автоматически (пере)выделяется, если она не инициализирована или имеет другой размер. Параметр включён по умолчанию, за исключением случаев, когда указан -std=f95. См. также -Wrealloc-lhs.
-faggressive-function-elimination-
Функции с идентичными списками аргументов устраняются внутри операторов, независимо от того, помечены ли эти функции
PUREили нет. Например, вa = f(b,c) + f(b,c)
будет только один вызов
f. Этот параметр работает только при включенном -ffrontend-optimize. -ffrontend-optimize-
Этот параметр выполняет оптимизацию на стадии передней части компиляции, основанную на манипулировании частями дерева разбора Fortran. Включается по умолчанию любым параметром -O, кроме -O0 и -Og. Оптимизации, включённые этим параметром:
- встраивание вызовов
MATMUL, - устранение идентичных вызовов функций внутри выражений,
- удаление ненужных вызовов
TRIMв сравнениях и присваиваниях, - замена
TRIM(a)наa(1:LEN_TRIM(a))и - краткое замыкание логических операторов (
.AND.и.OR.).
Его можно отключить, указав -fno-frontend-optimize.
- встраивание вызовов
-ffrontend-loop-interchange-
Попытка перестановки циклов в передней части компилятора Fortran, где это выгодно. Включается по умолчанию любым параметром -O. В настоящее время этот параметр влияет только на операторы
FORALLиDO CONCURRENTс несколькими тройками forall.
См. Параметры для генерации кода в Руководстве по GNU компилятору C (GCC), для получения информации о дополнительных параметрах, предлагаемых общим кодом, используемым gfortran, gcc, и другими GNU компиляторами.
Далее: Параметры взаимодействия, Предыдущий: Параметры выполнения, Наверх: Использование GNU Fortran [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gfortran/Code-Gen-Options.html