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) требуют, чтобы функции, возвращающие тип defaultREAL, фактически возвращали тип Cdouble, а функции, возвращающие типCOMPLEX, возвращали значения через дополнительный аргумент в последовательности вызовов, указывающий место для хранения возвращаемого значения. В соответствии с умолчанием GNU правил вызовов, такие функции просто возвращают результаты так, как это делалось бы в GNU C—функции с типом defaultREALвозвращают тип Cfloat, а функцииCOMPLEXвозвращают тип GNU Ccomplex. Кроме того, эта опция подразумевает опцию -fsecond-underscore, если явно не запрошена -fno-second-underscore.Это не влияет на генерацию кода, который взаимодействует с библиотекой
libgfortran.Внимание: Не следует смешивать код Fortran, скомпилированный с -ff2c, с кодом, скомпилированным с умолчанием -fno-f2c правил вызова, так как вызов функций
COMPLEXили defaultREALмежду частями программы, скомпилированными с различными правилами вызова, приведёт к ошибке во время выполнения.Внимание: Это нарушит код, который передаёт внутренние функции типа default
REALилиCOMPLEXкак фактические аргументы, так как библиотечные реализации используют правила вызова -fno-f2c. -
-fno-underscoring -
Не преобразовывать имена сущностей, указанные в исходном файле Fortran, добавляя к ним подчеркивания.
При использовании -funderscoring GNU Fortran добавляет один символ подчеркивания к внешним именам. Это делается для обеспечения совместимости с кодом, сгенерированным многими UNIX компиляторами Fortran.
Внимание: По умолчанию поведение 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’
-
Отключить поддержку coarray; использование объявлений coarray и операторов управления изображениями вызовет ошибку компиляции. (По умолчанию)
- ‘single’
-
Режим одного изображения, то есть
num_images()всегда равно одному. - ‘lib’
Параллелизация coarray на основе библиотек; необходимо связать подходящую библиотеку coarray GNU Fortran.
-
-fcheck=<keyword> -
Включить генерацию проверок во время выполнения; аргумент должен быть списком, разделённым запятыми, следующих ключевых слов. Добавление no- перед проверкой отключает её, если она была включена предыдущей спецификацией.
- ‘all’
-
Включить все проверки во время выполнения с -fcheck.
- ‘array-temps’
-
Выводит предупреждение во время выполнения, когда для передачи фактического аргумента необходимо было сгенерировать временный массив. Информация, сгенерированная этим предупреждением, иногда полезна при оптимизации, чтобы избежать таких временных массивов.
Примечание: Предупреждение выводится только один раз на местоположение.
- ‘bits’
-
Включить генерацию проверок во время выполнения для недопустимых аргументов битовых манипуляций.
- ‘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 нарушают ABI gfortran, опускают скрытые аргументы длины символов, как описано в Справочнике по правилам передачи аргументов. Это может привести к ошибкам, потому что загрузка аргументов для хвостовых вызовов может переполнить стек.
Чтобы обойти существующие двоичные пакеты, эта опция отключает оптимизацию хвостовых вызовов для процедур 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 равно 65536.
-
-fstack-arrays -
Добавление этого параметра заставит компилятор Fortran помещать все массивы неизвестного размера и временные массивы в память стека. Если ваша программа использует очень большие локальные массивы, возможно, вам придётся расширить лимиты времени выполнения для памяти стека на некоторых операционных системах. Этот флаг включён по умолчанию на уровне оптимизации -Ofast, если не указан -fmax-stack-var-size.
-
-fpack-derived -
Этот параметр сообщает GNU Fortran упаковывать члены типа производного как можно плотнее. Код, скомпилированный с этим параметром, вероятно, будет несовместим с кодом, скомпилированным без него, и может выполняться медленнее.
-
-frepack-arrays -
В некоторых случаях GNU Fortran может передавать секции массивов с предполагаемой формой через дескриптор, описывающий несмежный участок памяти. Этот параметр добавляет код в предикат функции, чтобы переупаковать данные в непрерывный блок во время выполнения.
Это должно привести к более быстрым обращениям к массиву. Однако это может ввести значительные накладные расходы на вызов функции, особенно когда передаваемые данные несмежные.
-
-fshort-enums -
Этот параметр предоставляется для взаимодействия с кодом C, скомпилированным с параметром -fshort-enums. Он заставит GNU Fortran выбрать наименьший
INTEGERвид, в который поместится заданный набор перечислителей, и присвоить всем его перечислителям этот вид. -
-finline-arg-packing -
При передаче аргумента с предполагаемой формой процедуры в качестве фактического аргумента предполагаемого размера или явного размера, или в качестве аргумента процедуре, которая не имеет явного интерфейса, аргумент может потребоваться упаковать, то есть поместить в непрерывную память. Примером является вызов
fooвsubroutine foo(a) real, dimension(*) :: a end subroutine foo subroutine bar(b) real, dimension(:) :: b call foo(b) end subroutine bar
Когда -finline-arg-packing активен, это упаковывание будет выполнено встроенным кодом. Это позволяет увеличить оптимизацию, увеличивая размер кода.
-finline-arg-packing подразумевается любым из параметров -O, за исключением оптимизации размера через -Os. Если код содержит очень большое количество аргументов, которые необходимо упаковать, размер кода, а также время компиляции могут стать чрезмерными. В таком случае может быть лучше отключить этот параметр. Примеры упаковывания можно найти, используя -Warray-temporaries.
-
-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 -
Аллокабельный левосторонний операнд выражения intrinsic assignment автоматически (пере)выделяется, если он либо не выделен, либо имеет другую форму. Параметр включён по умолчанию, за исключением случая, когда указан -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 компилятора (GCC), чтобы получить информацию о дополнительных параметрах, предлагаемых совместно библиотекой GBE gfortran, gcc, и другими GNU компиляторами.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gfortran/Code-Gen-Options.html