2.10 Параметры для соглашений о генерации кода
Эти независимые от машины параметры управляют соглашениями интерфейса, используемыми при генерации кода.
Большинство из них имеют как положительную, так и отрицательную формы; отрицательная форма -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 — функции по умолчаниюREALвозвращают тип 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’
-
Отключить поддержку 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 -
Оперативное левое операнд присваивания по умолчанию (пере)выделяется, если он не выделен или имеет другую форму. Параметр включён по умолчанию, за исключением случаев, когда задан параметр -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-14.2.0/gfortran/Code-Gen-Options.html