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или defaultREALмежду частями программы, скомпилированными с разными соглашениями вызова, приведёт к ошибке во время выполнения.Внимание: Это нарушит код, передающий встроенные функции типа 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, и при предположении других значений по умолчанию, таких как-fcase-lower, и что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> -
Включить генерацию проверок во время выполнения; аргументом должно быть список ключевых слов, разделённых запятыми.
- ‘
all’ - Включить все проверки во время выполнения
-fcheck. - ‘
array-temps’ - Выводит предупреждения во время выполнения, когда для передачи фактического аргумента необходимо было сгенерировать временный массив. Информация, генерируемая этим предупреждением, иногда полезна для оптимизации, чтобы избежать таких временных массивов.
Примечание: Предупреждение выводится только один раз на местоположение.
- ‘
bounds’ - Включить генерацию проверок во время выполнения для индексов массивов и по отношению к заданным минимальным и максимальным значениям. Также проверяет индексы массивов для массивов с предполагаемой и отложенной формой по отношению к фактическим границам выделения и гарантирует, что все длины строк равны для конструкторов символьных массивов без явного типа.
Некоторые проверки требуют, чтобы
-fcheck=boundsбыл задан для компиляции главной программы.Примечание: В будущем это может также включать и другие формы проверки, например, проверку ссылок на подстроки.
- ‘
do’ - Включить генерацию проверок во время выполнения для недействительного изменения переменных цикла.
- ‘
mem’ - Включить генерацию проверок во время выполнения для выделения памяти. Примечание: Этот параметр не влияет на явные выделения с помощью инструкции
ALLOCATE, которые всегда проверяются. - ‘
pointer’ - Включить генерацию проверок во время выполнения для указателей и выделенных переменных.
- ‘
recursion’ - Включить генерацию проверок во время выполнения для рекурсивных вызовов подпрограмм и функций, которые не отмечены как рекурсивные. См. также
-frecursive. Примечание: Эта проверка не работает для программ OpenMP и отключена, если используется вместе с-frecursiveи-fopenmp.
- ‘
-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.
-frecursive-
Разрешить косвенную рекурсию, заставив все локальные массивы выделять на стеке. Этот флаг не может использоваться вместе с
-fmax-stack-var-size=или-fno-automatic.
-
-finit-local-zero-finit-integer=n-finit-real=<zero|inf|-inf|nan|snan>-finit-logical=<true|false>-finit-character=n -
Вариант
-finit-local-zeroуказывает компилятору инициализировать локальныеINTEGER,REAL, иCOMPLEXпеременные нулями,LOGICALпеременные значением false, иCHARACTERпеременные строкой из нулевых байтов. Более тонкую инициализацию обеспечивают варианты -finit-integer=n, -finit-real=<zero|inf|-inf|nan|snan> (который также инициализирует вещественную и мнимую части локальныхCOMPLEXпеременных), -finit-logical=<true|false>, и -finit-character=n (где n — значение ASCII-символа). Эти варианты не инициализируют- распределяемые массивы
- компоненты переменных производных типов
- переменные, присутствующие в операторе
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. Оптимизации, включенные этим вариантом, включают удаление идентичных вызовов функций внутри выражений, удаление ненужных вызововTRIMв сравнениях и присваиваниях и заменуTRIM(a)наa(1:LEN_TRIM(a)). Его можно отключить, указав-fno-frontend-optimize.
См. Параметры для соглашений о генерации кода, для получения информации о других параметрах, предлагаемых общим компонентом GBE, используемым gfortran, gcc, и другими компиляторами GNU.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.3/gfortran/Code-Gen-Options.html