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, опуская скрытые аргументы длины символов, как описано в см. Соглашения о передаче аргументов. Это может привести к сбоям, потому что при подталкивании аргументов для хвостовых вызовов стек может переполниться.
Для обеспечения обходного решения для существующих бинарных пакетов эта опция отключает оптимизацию хвостовых вызовов для процедур 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), для получения информации о дополнительных параметрах, предлагаемых общим интерфейсом gfortran, gcc, и другими компиляторами GNU.
Далее: Параметры взаимодействия, Предыдущий: Параметры времени выполнения, Вверх: Вызов GNU Fortran [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gfortran/Code-Gen-Options.html