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