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 добавляет один подчеркивание к внешним именам без подчеркиваний. Это делается для обеспечения совместимости с кодом, сгенерированным многими компиляторами 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, реализуется как ссылка на внешнюю ссылку link-timemax_count__, а не наmax_count_. Это необходимо для совместимости сg77иf2c, и подразумевается при использовании опции -ff2c. -fcoarray=<keyword>-
- ‘none’
-
Отключить поддержку coarray; использование объявлений coarray и операторов управления изображением приведет к ошибке времени компиляции. (По умолчанию)
- ‘single’
-
Режим single-image, т.е.
num_images()всегда равно одному. - ‘lib’
Параллелизация coarray на основе библиотек; необходимо связать соответствующую библиотеку GNU Fortran coarray.
-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 нарушают 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 составляет 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-
Распределяемый левый член присваивания автоматически (пере)выделяется, если он не распределён или имеет другую форму. Параметр включен по умолчанию, за исключением случаев, когда указан -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), для получения информации о дополнительных параметрах, предлагаемых общим интерфейсом, используемым gfortran, gcc, и другими GNU компиляторами.
Далее: Варианты взаимодействия, Предыдущее: Параметры выполнения, Вернуться к: Вызов GNU Fortran [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gfortran/Code-Gen-Options.html