Spec-Zone.ru › GNU Fortran 7

2.9 Параметры для соглашений о генерации кода

Эти независимые от машины параметры контролируют соглашения об интерфейсе, используемые при генерации кода.

Большинство из них имеют как положительную, так и отрицательную форму; отрицательная форма -ffoo будет -fno-foo. В таблице ниже указана только одна из форм — та, которая не является по умолчанию. Вы можете определить другую форму, либо удалив no-, либо добавив её.

-fno-automatic

Обращайтесь с каждой программой (кроме помеченных как RECURSIVE) так, как будто инструкция SAVE была указана для каждой локальной переменной и массива, на которые в ней ссылаются. Не влияет на общие блоки. (Некоторые компиляторы Fortran предоставляют этот вариант под именем -static или -save.) По умолчанию, который является -fautomatic, используется стек для локальных переменных, меньших значения, заданного -fmax-stack-var-size. Используйте опцию -frecursive для неиспользования статической памяти.

-ff2c

Генерировать код, предназначенный для совместимости с кодом, сгенерированным g77 и f2c.

Вызывающие соглашения, используемые g77 (первоначально реализованные в f2c), требуют, чтобы функции, возвращающие тип по умолчанию REAL, фактически возвращали тип C double, а функции, возвращающие тип COMPLEX, возвращали значения через дополнительный аргумент в последовательности вызова, который указывает, куда сохранить возвращаемое значение. При использовании стандартных соглашений GNU для вызова такие функции просто возвращают свои результаты так, как это делается в GNU C — функции по умолчанию REAL возвращают тип C float, а функции COMPLEX возвращают тип GNU C complex. Кроме того, эта опция подразумевает опцию -fsecond-underscore, если явно не запрошена -fno-second-underscore.

Это не влияет на генерацию кода, взаимодействующего с библиотекой libgfortran.

Предупреждение: Не рекомендуется смешивать код Fortran, скомпилированный с -ff2c, с кодом, скомпилированным с помощью стандартных соглашений вызова -fno-f2c, так как вызов COMPLEX или функций по умолчанию REAL между частями программы, скомпилированными с разными соглашениями вызова, приведет к ошибке во время выполнения.

Предупреждение: Это нарушит код, который передает встроенные функции типа по умолчанию REAL или COMPLEX в качестве фактических аргументов, так как библиотечные реализации используют соглашения вызова -fno-f2c.

-fno-underscoring

Не преобразовывать имена сущностей, указанные в файле исходного кода Fortran, добавляя к ним подчеркивания.

При использовании -funderscoring в GNU Fortran к внешним именам без подчеркиваний добавляется один подчеркивание. Это делается для обеспечения совместимости с кодом, сгенерированным многими UNIX-компиляторами Fortran.

Предупреждение: Поведение по умолчанию 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.

-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.

-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. Эти параметры не инициализируют

  • распределяемые массивы
  • переменные, которые появляются в 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.

См. Параметры для правил генерации кода в Руководстве по использованию 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-7.2.0/gfortran/Code-Gen-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API