2.9 Параметры для соглашений о генерации кода
Эти независимые от машины параметры контролируют соглашения об интерфейсе, используемые при генерации кода.
Большинство из них имеют как положительную, так и отрицательную форму; отрицательная форма -ffoo будет -fno-foo. В таблице ниже указана только одна из форм — та, которая не является по умолчанию. Вы можете определить другую форму, либо удалив no-, либо добавив её.
-fno-automatic-
Обращайтесь с каждой программой (кроме помеченных как RECURSIVE) так, как если бы утверждение
SAVEбыло указано для каждой локальной переменной и массива, на которые ссылается программа. Не влияет на общие блоки. (Некоторые компиляторы Fortran предоставляют этот вариант под названием -static или -save.) По умолчанию, -fautomatic, использует стек для локальных переменных, меньших значения, заданного -fmax-stack-var-size. Используйте опцию -frecursive, чтобы не использовать статическую память. -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’
-
Выводит предупреждение во время выполнения, когда для передачи фактического аргумента необходимо было сгенерировать временный массив. Информация, генерируемая этим предупреждением, иногда полезна для оптимизации, чтобы избежать таких временных массивов.
Примечание: Предупреждение выводится только один раз на местоположение.
- ‘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 может быть использована для генерации прототипов, соответствующих gfortran ABI, для включения в исходный код.
Поддержка этой опции, вероятно, будет удалена в будущих версиях 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 равно 32768.
-fstack-arrays-
Добавление этого параметра заставит компилятор Fortran помещать все массивы неизвестного размера и временные массивы в память стека. Если ваша программа использует очень большие локальные массивы, возможно, вам придётся увеличить пределы времени выполнения для памяти стека на некоторых операционных системах. Этот флаг включён по умолчанию на уровне оптимизации -Ofast, если не указан -fmax-stack-var-size.
-fpack-derived-
Этот параметр сообщает GNU Fortran упаковывать члены типа производного максимально плотно. Код, скомпилированный с этим параметром, вероятно, будет несовместим с кодом, скомпилированным без него, и может выполняться медленнее.
-frepack-arrays-
В некоторых случаях GNU Fortran может передавать секции массивов с заданной формой через дескриптор, описывающий несмежную область памяти. Этот параметр добавляет в пролог функции код для переупаковки данных в непрерывный блок во время выполнения.
Это должно привести к более быстрым обращениям к массиву. Однако это может ввести значительные накладные расходы на вызов функции, особенно когда передаваемые данные несмежные.
-fshort-enums-
Этот параметр предоставлен для взаимодействия с кодом C, скомпилированным с параметром -fshort-enums. Он заставит GNU Fortran выбрать наиболее компактный
INTEGERвид, в который можно поместить заданный набор перечислений, и присвоить всем перечислениям этот вид. -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-* отключит предупреждения, которые могли быть выпущены параметром -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. Оптимизации, включённые этим параметром, включают встраивание вызовов
MATMUL, исключение идентичных вызовов функций внутри выражений, удаление ненужных вызововTRIMв сравнениях и присваиваниях и заменуTRIM(a)наa(1:LEN_TRIM(a)). Его можно отключить, указав -fno-frontend-optimize. -ffrontend-loop-interchange-
Попытка перестановки циклов на этапе обработки Fortran, где это выгодно. Включено по умолчанию любым параметром -O. На данный момент этот параметр влияет только на
FORALLиDO CONCURRENTоператоры с несколькими тройками forall.
См. Параметры для генерации кода в Руководстве по использованию GNU компилятора (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-8.4.0/gfortran/Code-Gen-Options.html