Spec-Zone.ru › GCC 13

3.18 Параметры разработчика GCC

В этом разделе описываются параметры командной строки, которые в первую очередь представляют интерес для разработчиков GCC, включая параметры для поддержки тестирования компилятора и выявления ошибок компилятора, а также проблем производительности на этапе компиляции. Это включает параметры, которые генерируют дампы отладки в различные моменты компиляции; которые выводят статистику, такую как использование памяти и время выполнения; и которые выводят информацию о конфигурации GCC, например, о том, где он ищет библиотеки. Вам вряд ли понадобится использовать какие-либо из этих параметров для обычных задач компиляции и компоновки.

Многие параметры разработчика, которые заставляют GCC выводить вывод в файл, принимают необязательный суффикс «=имя_файла». Можно указать «stdout» или «-» для вывода в стандартный вывод, а «stderr» для стандартного потока ошибок.

Если «=имя_файла» опущено, имя файла дампа по умолчанию формируется путем конкатенации имени базового файла дампов, номера прохода, буквы фазы и имени прохода. Базовое имя файла дампов — это имя выходного файла, сгенерированного компилятором, если оно было явно указано и не является исполняемым файлом; в противном случае это имя исходного файла. Номер прохода определяется порядком регистрации проходов в менеджере проходов компилятора. Как правило, он совпадает с порядком выполнения, но проходы, зарегистрированные плагинами, специфичными для целевой архитектуры, или проходы, которые регистрируются позднее, имеют больший номер, чем проход с именем «final», даже если они выполняются раньше. Буква фазы — одна из «i» (межпроцедурный анализ), «l» (специфичный для языка), «r» (RTL) или «t» (дерево). Файлы создаются в каталоге выходного файла.

-fcallgraph-info
-fcallgraph-info=MARKERS

Выводит информацию о графе вызовов компилятора для программы, на основе каждого объектного файла. Информация генерируется в стандартном формате VCG. Она может быть дополнена дополнительной информацией по узлам и/или рёбрам, если дополнительно указан список маркеров, разделённых запятыми. При указании маркера su, граф вызовов дополняется информацией об использовании стека; это эквивалентно -fstack-usage. При указании маркера da, граф вызовов дополняется информацией об объектах, выделенных динамически.

При компиляции с -flto, информация о графе вызовов не выводится вместе с объектным файлом. При линковке LTO, -fcallgraph-info может сгенерировать несколько файлов информации о графе вызовов рядом с промежуточными файлами вывода LTO.

-dletters
-fdump-rtl-pass
-fdump-rtl-pass=filename

Указывает на создание отладочных дампов во время компиляции в моменты, заданные символами letters. Это используется для отладки проходов компилятора, основанных на RTL.

Некоторые переключатели -dletters имеют разное значение, когда используется -E для препроцессинга. Обратитесь к разделу Параметры, управляющие препроцессором для информации о параметрах дампов, специфичных для препроцессора.

Отладочные дампы могут быть включены с помощью переключателя -fdump-rtl или некоторых опций -d с символами letters. Вот возможные символы для использования в pass и letters, и их значения:

-fdump-rtl-alignments

Думп после вычисления выравнивания ветвей.

-fdump-rtl-asmcons

Думп после исправления инструкций RTL, у которых есть неудовлетворённые входные/выходные ограничения.

-fdump-rtl-auto_inc_dec

Думп после обнаружения автоинкрементов/декрементов. Этот проход выполняется только на архитектурах, которые имеют инструкции автоинкремента или автодекремента.

-fdump-rtl-barriers

Думп после очистки барьерных инструкций.

-fdump-rtl-bbpart

Думп после разбиения горячих и холодных базовых блоков.

-fdump-rtl-bbro

Думп после переупорядочивания блоков.

-fdump-rtl-btl1
-fdump-rtl-btl2

-fdump-rtl-btl1 и -fdump-rtl-btl2 включают думпы после двух проходов оптимизации загрузки целевого адреса ветвления.

-fdump-rtl-bypass

Думп после обхода переходов и оптимизации потока управления.

-fdump-rtl-combine

Думп после прохода комбинирования инструкций RTL.

-fdump-rtl-compgotos

Думп после дублирования вычисленных переходов.

-fdump-rtl-ce1
-fdump-rtl-ce2
-fdump-rtl-ce3

-fdump-rtl-ce1, -fdump-rtl-ce2 и -fdump-rtl-ce3 включают думпы после трёх проходов преобразования условных операторов.

-fdump-rtl-cprop_hardreg

Думп после распространения копирования регистров жесткой адресации.

-fdump-rtl-csa

Думп после объединения корректировок стека.

-fdump-rtl-cse1
-fdump-rtl-cse2

-fdump-rtl-cse1 и -fdump-rtl-cse2 включают думпы после двух проходов устранения общих подвыражений.

-fdump-rtl-dce

Думп после проходов удаления мёртвого кода.

-fdump-rtl-dbr

Думп после планирования отложенных ветвлений.

-fdump-rtl-dce1
-fdump-rtl-dce2

-fdump-rtl-dce1 и -fdump-rtl-dce2 включают думпы после двух проходов удаления мёртвых хранений.

-fdump-rtl-eh

Думп после завершения обработки исключений (EH).

-fdump-rtl-eh_ranges

Думп после преобразования областей обработки исключений (EH).

-fdump-rtl-expand

Думп после генерации RTL.

-fdump-rtl-fwprop1
-fdump-rtl-fwprop2

-fdump-rtl-fwprop1 и -fdump-rtl-fwprop2 включают думпы после двух проходов распространения вперёд.

-fdump-rtl-gcse1
-fdump-rtl-gcse2

-fdump-rtl-gcse1 и -fdump-rtl-gcse2 включают думпы после глобального устранения общих подвыражений.

-fdump-rtl-init-regs

Думп после инициализации регистров.

-fdump-rtl-initvals

Думп после вычисления начальных наборов значений.

-fdump-rtl-into_cfglayout

Думп после перехода в режим cfglayout.

-fdump-rtl-ira

Думп после итерационной аллокации регистров.

-fdump-rtl-jump

Думп после второй оптимизации переходов.

-fdump-rtl-loop2

-fdump-rtl-loop2 включает думпы после проходов оптимизации циклов RTL.

-fdump-rtl-mach

Думп после выполнения зависящего от архитектуры прохода реорганизации, если такой проход существует.

-fdump-rtl-mode_sw

Думп после удаления избыточных переключений режимов.

-fdump-rtl-rnreg

Думп после переиндексации регистров.

-fdump-rtl-outof_cfglayout

Думп после выхода из режима cfglayout.

-fdump-rtl-peephole2

Думп после прохода peephole.

-fdump-rtl-postreload

Думп после пост-загрузки оптимизаций.

-fdump-rtl-pro_and_epilogue

Думп после генерации прологов и эпилогов функций.

-fdump-rtl-sched1
-fdump-rtl-sched2

-fdump-rtl-sched1 и -fdump-rtl-sched2 включают думпы после проходов планирования базовых блоков.

-fdump-rtl-ree

Думп после устранения расширений знака/нуля.

-fdump-rtl-seqabstr

Думп после обнаружения общих последовательностей.

-fdump-rtl-shorten

Думп после укорочения ветвей.

-fdump-rtl-sibling

Думп после оптимизаций вызовов-братьев.

-fdump-rtl-split1
-fdump-rtl-split2
-fdump-rtl-split3
-fdump-rtl-split4
-fdump-rtl-split5

Эти параметры включают думпы после пяти раундов разделения инструкций.

-fdump-rtl-sms

Думп после модульного планирования. Этот проход выполняется только на некоторых архитектурах.

-fdump-rtl-stack

Думп после преобразования регистров "плоского файла регистров" GCC в стек-подобные регистры x87. Этот проход выполняется только на вариантах x86.

-fdump-rtl-subreg1
-fdump-rtl-subreg2

-fdump-rtl-subreg1 и -fdump-rtl-subreg2 включают думпы после двух проходов расширения subreg.

-fdump-rtl-unshare

Думп после того, как все RTL были разделены.

-fdump-rtl-vartrack

Думп после отслеживания переменных.

-fdump-rtl-vregs

Думп после преобразования виртуальных регистров в реальные.

-fdump-rtl-web

Думп после разделения интервалов жизни.

-fdump-rtl-regclass
-fdump-rtl-subregs_of_mode_init
-fdump-rtl-subregs_of_mode_finish
-fdump-rtl-dfinit
-fdump-rtl-dfinish

Эти дампы определены, но всегда производят пустые файлы.

-da
-fdump-rtl-all

Производят все перечисленные выше дампы.

-dA

Добавляет в выходные данные ассемблера различную отладочную информацию.

-dD

Выводит все определения макросов в конце препроцессинга, в дополнение к обычному выводу.

-dH

Создаёт дамп ядра при возникновении ошибки.

-dp

Добавляет в выходные данные ассемблера комментарий, указывающий, какой шаблон и альтернатива использовались. Также выводится длина и стоимость каждой инструкции.

-dP

Выводит RTL в выходные данные ассемблера как комментарий перед каждой инструкцией. Также включает аннотацию -dp.

-dx

Генерирует RTL для функции вместо её компиляции. Обычно используется с -fdump-rtl-expand.

-fdump-debug

Выводит отладочную информацию, сгенерированную на фазе генерации отладки.

-fdump-earlydebug

Выводит отладочную информацию, сгенерированную на ранней фазе генерации отладки.

-fdump-noaddr

При создании отладочных дампов подавляет вывод адресов. Это делает более возможным использование diff на отладочных дампах для вызовов компилятора с разными бинарными файлами компилятора и/или разными начальными значениями текста / bss / данных / кучи / стека / dso.

-freport-bug

Собирает и выводит отладочную информацию в временный файл, если произошла внутренняя ошибка компилятора (ICE).

-fdump-unnumbered

При создании отладочных дампов подавляет вывод номеров инструкций и адресов. Это делает более возможным использовать diff на отладочных дампах для вызовов компилятора с разными параметрами, в частности с и без -g.

-fdump-unnumbered-links

При создании отладочных дампов (см. параметр -d выше), подавляет номера инструкций для ссылок на предыдущие и последующие инструкции в последовательности.

-fdump-ipa-switch
-fdump-ipa-switch-options

Управляйте выгрузкой на различных этапах межпроцедурного анализа дерева языка в файл. Имя файла формируется путем добавления специфичного для переключателя суффикса к имени исходного файла, а файл создается в той же директории, что и выходной файл. Возможны следующие выгрузки:

‘all’

Включает все выгрузки межпроцедурного анализа.

‘cgraph’

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

‘inline’

Выгрузка после встраивания функций.

Кроме того, можно указать параметры -optimized, -missed, -note и -all с тем же значением, что и для -fopt-info, по умолчанию используется -optimized.

Например, -fdump-ipa-inline-optimized-missed выведет информацию о местах вызова, которые были встроены, вместе с местами вызова, которые не были встроены.

По умолчанию выгрузка будет содержать сообщения об успешных оптимизациях (эквивалентно -optimized) вместе с деталями низкого уровня анализа.

-fdump-lang

Выгружает информацию, специфичную для языка. Имя файла формируется путем добавления .lang к имени исходного файла.

-fdump-lang-all
-fdump-lang-switch
-fdump-lang-switch-options
-fdump-lang-switch-options=filename

Управление выгрузкой информации, специфичной для языка. Части options и filename ведут себя так, как описано в параметре -fdump-tree. Принимаются следующие значения switch:

‘all’

Включает все выгрузки, специфичные для языка.

‘class’

Выгружает информацию о иерархии классов. Информация о виртуальных таблицах выводится, если не указано ‘slim’. Этот параметр применим только к C++.

‘module’

Выгружает информацию о модуле. Параметры lineno (позиции), graph (достижимость), blocks (кластеры), uid (сериализация), alias (сливаемо), asmname (Elrond), eh (mapper) и vops (макросы) могут предоставить дополнительную информацию. Этот параметр применим только к C++.

‘raw’

Выгружает сырые внутренние данные дерева. Этот параметр применим только к C++.

-fdump-passes

Выводит в stderr список оптимизационных проходов, которые включены и выключены текущими параметрами командной строки.

-fdump-statistics-option

Включает и управляет выгрузкой статистики проходов в отдельный файл. Имя файла формируется путем добавления суффикса, заканчивающегося на ‘.statistics’, к имени исходного файла, и файл создается в той же директории, что и выходной файл. Если используется форма ‘-option’, ‘-stats’ суммирует счетчики по всему модулю компиляции, а ‘-details’ выгружает каждое событие по мере его генерации проходами. По умолчанию без параметра счетчики суммируются для каждой компилируемой функции.

-fdump-tree-all
-fdump-tree-switch
-fdump-tree-switch-options
-fdump-tree-switch-options=filename

Управление выгрузкой на различных этапах обработки дерева промежуточного языка в файл. Если используется форма ‘-options’, options — это список параметров, разделенных символом ‘-’, которые контролируют детали выгрузки. Не все параметры применимы ко всем выгрузкам; те, которые не имеют смысла, игнорируются. Доступны следующие параметры:

‘address’

Выводит адрес каждого узла. Обычно это не имеет смысла, так как он изменяется в зависимости от среды и исходного файла. Его основное назначение — связать файл выгрузки с средой отладки.

‘asmname’

Если для данного объявления установлено DECL_ASSEMBLER_NAME, оно используется в выгрузке вместо DECL_NAME. Его основное назначение — простота работы, позволяющая вернуться к искаженным именам в файле ассемблера.

‘slim’

При выгрузке промежуточных представлений front-end, запретить выгрузку элементов области видимости или тела функции просто потому, что область видимости достигнута. Выгружать такие элементы только в том случае, если они непосредственно достижимы каким-либо другим путем.

При выгрузке отформатированных деревьев этот параметр запрещает выгрузку тел управляющих структур.

При выгрузке RTL, выводить RTL в сокращенной форме (конденсированной) вместо стандартного представления в стиле LISP.

‘raw’

Выводит необработанное представление дерева. По умолчанию деревья выводятся в отформатированном виде, похожем на C.

‘details’

Включает более подробные выгрузки (не все параметры поддерживают этот параметр). Также включает информацию из оптимизирующих проходов.

‘stats’

Включает выгрузку различной статистики по проходу (не поддерживается всеми параметрами выгрузки).

‘blocks’

Включает показ границ базовых блоков (выключено в необработанных выгрузках).

‘graph’

Для каждого из указанных файлов выгрузки (-fdump-rtl-pass) выгрузить представление графа управления потоком, подходящее для просмотра с помощью GraphViz, в file.passid.pass.dot. Каждая функция в файле отображается как подграф, что позволяет GraphViz отобразить все их на одном графике.

Этот параметр в настоящее время работает только для выгрузок RTL, и RTL всегда выгружается в сокращенном формате.

‘vops’

Включает отображение виртуальных операндов для каждого оператора.

‘lineno’

Включает отображение номеров строк для операторов.

‘uid’

Включает отображение уникального идентификатора (DECL_UID) для каждой переменной.

‘verbose’

Включает выгрузку дерева для каждого оператора.

‘eh’

Включает отображение номера области EH, содержащей каждый оператор.

‘scev’

Включает отображение подробностей анализа скалярной эволюции.

‘optimized’

Включает отображение оптимизационной информации (доступно только в определенных проходах).

‘missed’

Включает отображение информации об упущенных оптимизациях (доступно только в определенных проходах).

‘note’

Включает другую подробную оптимизационную информацию (доступно только в определенных проходах).

‘all’

Включает все параметры, кроме raw, slim, verbose и lineno.

‘optall’

Включает все параметры оптимизации, т.е. optimized, missed и note.

Чтобы определить доступные выгрузки дерева или найти выгрузку для интересующего вас прохода, выполните следующие шаги.

  1. Вызовите GCC с -fdump-passes и в выводе stderr найдите код, соответствующий интересующему вас проходу. Например, коды tree-evrp, tree-vrp1, и tree-vrp2 соответствуют трём проходам распространения диапазонов значений. Число в конце отличает различные вызовы одного и того же прохода.
  2. Чтобы включить создание файла выгрузки, добавьте код прохода к префиксу параметра -fdump- и вызовите GCC с ним. Например, чтобы включить выгрузку из прохода раннего распространения диапазонов значений, вызовите GCC с параметром -fdump-tree-evrp. По желанию вы можете указать имя файла выгрузки. Если вы не укажете имя, GCC создаст его, как описано ниже.
  3. Найдите выгрузку прохода в файле, имя которого состоит из трёх компонентов, разделенных точкой: имя исходного файла, который GCC вызывался для компиляции, числовой суффикс, указывающий номер прохода, за которым следуют буква ‘t’ для проходов дерева (и буква ‘r’ для проходов RTL), и, наконец, код прохода. Например, выгрузка прохода раннего распространения диапазонов значений может находиться в файле с именем myfile.c.038t.evrp в текущей рабочей директории. Обратите внимание, что числовые коды не стабильны и могут изменяться в разных версиях GCC.
-fopt-info
-fopt-info-options
-fopt-info-options=filename

Управляет выводом дампов оптимизации из различных проходов оптимизации. Если используется форма «-options», options — это список ключевых слов опций, разделенных символом «-», для выбора деталей дампов и оптимизаций.

options можно разделить на три группы:

  1. опции, описывающие, какие типы сообщений должны быть выведены,
  2. опции, описывающие подробность дампов, и
  3. опции, описывающие, какие оптимизации следует включить.

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

Следующие опции управляют типами выводимых сообщений:

‘optimized’

Выводит информацию, когда оптимизация успешно применена. Задача прохода — определить, какая информация релевантна. Например, проходы векторизации печатают местоположение кода циклов, которые успешно векторизованы.

‘missed’

Выводит информацию об упущенных оптимизациях. Индивидуальные проходы управляют тем, какая информация должна быть включена в вывод.

‘note’

Выводит подробную информацию об оптимизациях, таких как определенные преобразования, более подробные сообщения о решениях и т. д.

‘all’

Выводит подробную информацию об оптимизациях. Включает ‘optimized’, ‘missed’ и ‘note’.

Следующая опция управляет подробностью дампов:

‘internals’

По умолчанию выводятся только сообщения высокого уровня. Эта опция включает дополнительные, более подробные сообщения, которые, вероятно, будут интересны только разработчикам GCC.

Для описания группы оптимизаций можно использовать одну или несколько из следующих ключевых слов опций:

‘ipa’

Включает дампы всех межпроцедурных оптимизаций.

‘loop’

Включает дампы всех оптимизаций циклов.

‘inline’

Включает дампы всех оптимизаций встраивания.

‘omp’

Включает дампы всех оптимизаций OMP (Offloading and Multi Processing).

‘vec’

Включает дампы всех оптимизаций векторизации.

‘optall’

Включает дампы всех оптимизаций. Это супермножество перечисленных выше групп оптимизаций.

Если options опущено, по умолчанию используется ‘optimized-optall», что означает вывод сообщений об успешных оптимизациях всех проходов, опуская сообщения, которые рассматриваются как «внутренние».

Если указан filename, то дампы всех применимых оптимизаций конкатенируются в filename. В противном случае дамп выводится в stderr. Несмотря на то, что принимаются несколько опций -fopt-info, только одна из них может включать filename. Если указаны другие имена файлов, то все, кроме первого, игнорируются.

Обратите внимание, что выходной filename перезаписывается в случае нескольких единиц трансляции. Если требуется объединенный вывод из нескольких единиц трансляции, следует использовать stderr.

В следующем примере информация об оптимизации выводится в stderr:

gcc -O3 -fopt-info

Этот пример:

gcc -O3 -fopt-info-missed=missed.all

выводит отчет об упущенных оптимизациях со всех проходов в missed.all, а этот:

gcc -O2 -ftree-vectorize -fopt-info-vec-missed

выводит информацию об упущенных возможностях оптимизации из проходов векторизации в stderr. Обратите внимание, что -fopt-info-vec-missed эквивалентно -fopt-info-missed-vec. Порядок имен групп оптимизации и типов сообщений, перечисленных после -fopt-info, не имеет значения.

В качестве еще одного примера:

gcc -O3 -fopt-info-inline-optimized-missed=inline.txt

выводит информацию об упущенных оптимизациях, а также о местах оптимизированного кода со всех проходов встраивания в inline.txt.

Наконец, рассмотрим:

gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt

Здесь два выходных имени файлов vec.miss и loop.opt конфликтуют, так как разрешен только один выходной файл. В этом случае действует только первая опция, а последующие опции игнорируются. Таким образом, генерируется только vec.miss, содержащий дампы векторизатора об упущенных возможностях.

-fsave-optimization-record

Записывает файл SRCFILE.opt-record.json.gz, подробно описывающий выполненные оптимизации для тех оптимизаций, которые поддерживают -fopt-info.

Эта опция экспериментальная, и формат данных в сжатом JSON-файле может измениться.

Он примерно эквивалентен машинно-читаемой версии -fopt-info-all, как набор сообщений с номером файла, строки и столбца, со следующими дополнительными данными для каждого сообщения:

  • количество выполнений оптимизируемого кода вместе с метаданными о том, получены ли они из реальных профильных данных или являются просто оценкой, что позволяет потребителям приоритезировать сообщения по частоте использования кода,
  • имя функции оптимизируемого кода, если применимо,
  • «цепь встраивания» для оптимизируемого кода, чтобы, когда функция встраивается в несколько разных местах (которые сами могут быть встроены), читатель мог отличать копии,
  • объекты, идентифицирующие те части сообщения, которые относятся к выражениям, операторам или узлам таблицы символов, к какой категории они относятся и, если доступно, их местоположение в исходном коде,
  • проход GCC, который вывел сообщение, и
  • местоположение в собственном коде GCC, откуда было выведено сообщение

Кроме того, некоторые сообщения логически вложены в другие сообщения, отражая реализационные детали проходов оптимизации.

-fsched-verbose=n

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

Для n больше нуля, -fsched-verbose выводит ту же информацию, что и -fdump-rtl-sched1 и -fdump-rtl-sched2. Для n больше единицы он также выводит вероятности блоков базового потока, подробную информацию о готовности списка и информацию о блоках/инструкциях. Для n больше двух он включает RTL в точке прерывания, информацию о потоке управления и регионах. А для n больше четырёх, -fsched-verbose также включает информацию о зависимостях.

-fenable-kind-pass
-fdisable-kind-pass=range-list

Это набор опций, используемых для явного отключения/включения проходов оптимизации. Эти опции предназначены для использования в отладке GCC. Пользователи компилятора должны использовать стандартные опции для включения/отключения проходов вместо этого.

-fdisable-ipa-pass

Отключает проход IPA pass. pass — имя прохода. Если один и тот же проход статически вызывается в компиляторе несколько раз, к имени прохода следует добавить порядковый номер, начиная с 1.

-fdisable-rtl-pass
-fdisable-rtl-pass=range-list

Отключает проход RTL pass. pass — имя прохода. Если один и тот же проход статически вызывается в компиляторе несколько раз, к имени прохода следует добавить порядковый номер, начиная с 1. range-list — список диапазонов функций или имен ассемблера, разделённых запятыми. Каждый диапазон — это пара чисел, разделённых двоеточием. Диапазон включает оба конца. Если диапазон тривиален, пару чисел можно упростить до одного числа. Если узел узла вызова графа функций uid попадает в один из указанных диапазонов, проход pass отключается для этой функции. uid отображается в заголовке функции файла дампов, а имена проходов можно вывести, используя опцию -fdump-passes.

-fdisable-tree-pass
-fdisable-tree-pass=range-list

Отключает проход дерева pass. См. -fdisable-rtl для описания аргументов опции.

-fenable-ipa-pass

Включает проход IPA pass. pass — имя прохода. Если один и тот же проход статически вызывается в компиляторе несколько раз, к имени прохода следует добавить порядковый номер, начиная с 1.

-fenable-rtl-pass
-fenable-rtl-pass=range-list

Включает проход RTL pass. См. -fdisable-rtl для описания аргументов опции и примеров.

-fenable-tree-pass
-fenable-tree-pass=range-list

Включает проход дерева pass. См. -fdisable-rtl для описания аргументов опции.

Вот несколько примеров использования этих опций.

# disable ccp1 for all functions
   -fdisable-tree-ccp1
# disable complete unroll for function whose cgraph node uid is 1
   -fenable-tree-cunroll=1
# disable gcse2 for functions at the following ranges [1,1],
# [300,400], and [400,1000]
# disable gcse2 for functions foo and foo2
   -fdisable-rtl-gcse2=foo,foo2
# disable early inlining
   -fdisable-tree-einline
# disable ipa inlining
   -fdisable-ipa-inline
# enable tree full unroll
   -fenable-tree-unroll
-fchecking
-fchecking=n

Включает проверку внутренней согласованности. Значение по умолчанию зависит от конфигурации компилятора. -fchecking=2 включает дополнительную проверку внутренней согласованности, которая может повлиять на генерацию кода.

-frandom-seed=string

Эта опция предоставляет seed, который GCC использует вместо случайных чисел при генерации некоторых имён символов, которые должны быть разными в каждом скомпилированном файле. Она также используется для размещения уникальных штампов в файлах данных покрытия и объектных файлах, которые их генерируют. Вы можете использовать опцию -frandom-seed для создания воспроизводимо идентичных объектных файлов.

string может быть числом (десятичным, восьмеричным или шестнадцатеричным) или произвольной строкой (в этом случае она преобразуется в число путём вычисления CRC32).

string должен быть разным для каждого файла, который вы компилируете.

-save-temps

Постоянно храните обычные «временные» промежуточные файлы; называйте их вспомогательными выходными файлами, как указано в описании под -dumpbase и -dumpdir.

При использовании в сочетании с командной опцией -x, -save-temps достаточно разумна, чтобы избежать перезаписи входного исходного файла тем же расширением, что и промежуточный файл. Соответствующий промежуточный файл можно получить, переименовав исходный файл перед использованием -save-temps.

-save-temps=cwd

Эквивалентно -save-temps -dumpdir ./.

-save-temps=obj

Эквивалентно -save-temps -dumpdir outdir/, где outdir/ — это каталог выходного файла, указанного после опции -o, включая все разделители каталогов. Если опция -o не используется, переключатель -save-temps=obj ведет себя как -save-temps=cwd.

-time[=file]

Отчет о времени процессора, затраченном каждым подпроцессом в последовательности компиляции. Для исходных файлов C это собственно компилятор и ассемблер (плюс компоновщик, если компоновка выполняется).

Без указания выходного файла вывод выглядит следующим образом:

# cc1 0.12 0.01
# as 0.00 0.01

Первое число в каждой строке — «пользовательское время», то есть время, затраченное на выполнение программы. Второе число — «системное время», время, затраченное на выполнение системных процедур от имени программы. Оба числа в секундах.

При указании выходного файла вывод добавляется в указанный файл, и он выглядит следующим образом:

0.12 0.01 cc1 options
0.00 0.01 as options

«Пользовательское время» и «системное время» перемещаются перед именем программы, и отображаются опции, переданные программе, чтобы можно было узнать, какой файл компилировался и с какими опциями.

-fdump-final-insns[=file]

Вывести окончательное внутреннее представление (RTL) в file. Если необязательный аргумент опущен (или если file — .), имя файла вывода определяется путем добавления .gkd к имени базового файла вывода, см. -dumpbase.

-fcompare-debug[=opts]

Если при компиляции ошибок не возникает, запустите компилятор во второй раз, добавив opts и -fcompare-debug-second к аргументам, переданным во вторую компиляцию. Выведите окончательное внутреннее представление в обеих компиляцияx и выведите ошибку, если они отличаются.

Если знак равенства опущен, используется значение по умолчанию -gtoggle.

Переменная среды GCC_COMPARE_DEBUG, если определена, непуста и отлична от нуля, неявно включает -fcompare-debug. Если GCC_COMPARE_DEBUG определена как строка, начинающаяся с тире, то она используется для opts, в противном случае используется значение по умолчанию -gtoggle.

-fcompare-debug=, со знаком равенства, но без opts, эквивалентно -fno-compare-debug, что отключает вывод окончательного представления и вторую компиляцию, предотвращая даже GCC_COMPARE_DEBUG от вступления в силу.

Для проверки полного охвата при тестировании -fcompare-debug установите GCC_COMPARE_DEBUG на -fcompare-debug-not-overridden, который GCC отклонит как недопустимую опцию в любой реальной компиляции (а не предварительной обработке, сборке или компоновке). Чтобы получить просто предупреждение, установка GCC_COMPARE_DEBUG на ‘-w%n-fcompare-debug not overridden’ сработает.

-fcompare-debug-second

Эта опция неявно передаётся компилятору для второй компиляции, запрошенной -fcompare-debug, наряду с опциями для отключения предупреждений и опуская другие опции, которые могут привести к выводу компилятора в файлы или стандартный вывод как побочный эффект. Файлы вывода и сохранённые временные файлы переименовываются таким образом, чтобы содержать дополнительное расширение .gk во время второй компиляции, чтобы избежать перезаписи файлов, созданных в первой.

Когда эта опция передаётся драйверу компилятора, она приводит к пропуску первой компиляции, что делает её полезной в основном только для отладки самого компилятора.

-gtoggle

Отключить генерацию отладочной информации, если без этой опции она генерируется, или включить её на уровне 2 в противном случае. Положение этого аргумента в командной строке не имеет значения; он вступает в силу после обработки всех остальных опций и только один раз, независимо от того, сколько раз он задаётся. Это в основном предназначено для использования с -fcompare-debug.

-fvar-tracking-assignments-toggle

Включить/выключить -fvar-tracking-assignments так же, как -gtoggle включает/выключает -g.

-Q

Заставляет компилятор выводить имя каждой функции по мере её компиляции и печатать некоторую статистику о каждом проходе по завершении.

-ftime-report

Заставляет компилятор выводить некоторую статистику о времени, затраченном каждым проходом, по завершении.

-ftime-report-details

Записывать время, затраченное частями инфраструктуры отдельно для каждого прохода.

-fira-verbose=n

Управление подробностью файла вывода для интегрированного регистрового аллокатора. Значение по умолчанию равно 5. Если значение n больше или равно 10, вывод вывода отправляется в stderr в том же формате, что и n минус 10.

-flto-report

Выводит отчёт со внутренними подробностями о работе оптимизатора на этапе компоновки. Содержимое этого отчёта меняется от версии к версии. Он предназначен для использования разработчиками GCC при обработке объектных файлов в режиме LTO (через -flto).

Отключено по умолчанию.

-flto-report-wpa

Как -flto-report, но выводить только для фазы WPA оптимизации на этапе компоновки.

-fmem-report

Заставляет компилятор выводить некоторую статистику о выделении постоянной памяти при завершении.

-fmem-report-wpa

Заставляет компилятор выводить некоторую статистику об выделении постоянной памяти только для фазы WPA.

-fpre-ipa-mem-report
-fpost-ipa-mem-report

Заставляет компилятор выводить некоторую статистику об выделении постоянной памяти до или после межпроцедурной оптимизации.

-fmultiflags

Эта опция включает многомодульную поддержку TFLAGS, которая позволяет строить целевые библиотеки с опциями, отличными от тех, которые компилятор настроен использовать по умолчанию, с помощью спецификаций (см. Указание подпроцессов и опций, передаваемых им), настроенных внутренними элементами компилятора, целевой системой или сборщиками во время конфигурации.

Подобно TFLAGS, это позволяет строить целевые библиотеки для портативных баз данных, в то время как компилятор по умолчанию использует более требовательные опции. Это полезно, поскольку пользователи могут легко переопределить значения по умолчанию, используемые компилятором для построения собственных программ, если значения по умолчанию не идеально подходят для их целевой среды, в то время как перестройка библиотек времени выполнения обычно не так легко выполнима или желательна.

В отличие от TFLAGS, использование спецификаций позволяет выбирать разные флаги для разных многомодульных вариантов. Для этого необходимо скомпилировать с помощью ‘make TFLAGS=-fmultiflags’ после настройки ‘--with-specs=%{fmultiflags:...}’.

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

Также полезно проверить, что TFLAGS используются для построения всех целевых библиотек, настроив не-бутовой компилятор ‘--with-specs='%{!fmultiflags:%emissing TFLAGS}'’ и скомпилировав компилятор и целевые библиотеки.

-fprofile-report

Заставляет компилятор выводить некоторую статистику о согласованности (оценённого) профиля и эффекте отдельных проходов.

-fstack-usage

Заставляет компилятор выводить информацию об использовании стека для программы на основе каждой функции. Имя файла для вывода создаётся путём добавления .su к auxname. auxname генерируется из имени выходного файла, если оно явно указано и это не исполняемый файл, в противном случае это имя файла без пути. Запись состоит из трёх полей:

  • Имя функции.
  • Количество байтов.
  • Одна или несколько квалификаций: static, dynamic, bounded.

Квалификатор static означает, что функция манипулирует стеком статически: определённое количество байтов выделяется для кадра при входе в функцию и освобождается при выходе из функции; в противном случае корректировки стека в функции не производятся. Второе поле — это фиксированное число байтов.

Квалификатор dynamic означает, что функция динамически манипулирует стеком: помимо статического выделения, описанного выше, в теле функции производятся корректировки стека, например, для помещения/изъятия аргументов вокруг вызовов функций. Если квалификатор bounded также присутствует, то количество таких корректировок ограничено во время компиляции, а второе поле представляет собой верхнюю границу общего количества используемой стека функции. Если его нет, то количество таких корректировок не ограничено во время компиляции, а второе поле представляет только ограниченную часть.

-fstats

Выводит статистику обработки передней части на этапе завершения компиляции. Эта опция поддерживается только передней частью компилятора C++, и информация, как правило, полезна только команде разработчиков G++.

-fdbg-cnt-list

Выводит имя и верхнюю границу счётчика для всех отладочных счётчиков.

-fdbg-cnt=counter-value-list

Установите нижнюю и верхнюю границы внутреннего счётчика отладки. counter-value-list — это список значений, разделённых запятыми, вида name:lower_bound1-upper_bound1 [:lower_bound2-upper_bound2...] кортежи, которые устанавливают имя счётчика и список замкнутых интервалов. lower_bound — необязательный параметр; если он не задан, инициализируется значением ноль. Например, с -fdbg-cnt=dce:2-4:10-11,tail_call:10, dbg_cnt(dce) возвращает true только для второго, третьего, четвёртого, десятого и одиннадцатого вызова. Для -print-libgcc-file-name true возвращается для первых 10 вызовов.

-print-file-name=library

Вывести полное абсолютное имя библиотечного файла library, которое будет использоваться при компоновке — и ничего более. С этим параметром GCC не компилирует и не компонует ничего; он просто выводит имя файла.

-print-multi-directory

Вывести имя каталога, соответствующего многокомпонентной библиотеке (multilib), выбранной другими параметрами командной строки. Этот каталог должен существовать в GCC_EXEC_PREFIX.

-print-multi-lib

Вывести отображение имён каталогов многокомпонентных библиотек (multilib) на компиляторные параметры, которые их включают. Имя каталога отделено от параметров символом ‘;’, а каждый параметр начинается с ‘@’ вместо ‘-’ без пробелов между несколькими параметрами. Это призвано облегчить обработку в оболочке.

-print-multi-os-directory

Вывести путь к библиотекам ОС для выбранной многокомпонентной библиотеки (multilib), относительно некоторого подкаталога lib. Если библиотеки ОС находятся в подкаталоге lib и многокомпонентные библиотеки не используются, это обычно просто .. Если библиотеки ОС находятся в подкаталогах libsuffix , это выводит, например, ../lib64, ../lib или ../lib32. Или, если библиотеки ОС находятся в подкаталогах lib/subdir, это выводит, например, amd64, sparcv9 или ev6.

-print-multiarch

Вывести путь к библиотекам ОС для выбранной многоархитектурной системы (multiarch), относительно некоторого подкаталога lib.

-print-prog-name=program

Как -print-file-name, но ищет программу, такую как cpp.

-print-libgcc-file-name

То же, что и -print-file-name=libgcc.a.

Это полезно, когда вы используете -nostdlib или -nodefaultlibs, но хотите связать libgcc.a. Вы можете сделать так:

gcc -nostdlib files… `gcc -print-libgcc-file-name`
-print-search-dirs

Вывести имя настроенного каталога установки и список каталогов программ и библиотек, которые gcc ищет — и ничего более.

Это полезно, когда gcc выводит сообщение об ошибке ‘installation problem, cannot exec cpp0: No such file or directory’. Чтобы решить эту проблему, либо поместите cpp0 и другие компоненты компилятора туда, где gcc ожидает их найти, либо установите переменную среды GCC_EXEC_PREFIX в каталог, куда вы их установили. Не забудьте заключительный ‘/’. См. Переменные среды, влияющие на GCC.

-print-sysroot

Вывести целевой каталог sysroot, используемый во время компиляции. Это целевой sysroot, указанный во время настройки или с помощью параметра --sysroot, возможно, с дополнительным суффиксом, который зависит от параметров компиляции. Если целевой sysroot не указан, параметр ничего не выводит.

-print-sysroot-headers-suffix

Вывести суффикс, добавляемый к целевому sysroot при поиске заголовочных файлов, или вывести ошибку, если компилятор не настроен с таким суффиксом — и ничего более.

-dumpmachine

Вывести целевую машину компилятора (например, ‘i686-pc-linux-gnu’)— и ничего более.

-dumpversion

Вывести версию компилятора (например, 3.0, 6.3.0 или 7 )— и ничего более. Это версия компилятора, используемая в путях к файлам и спецификациях. В зависимости от того, как настроен компилятор, он может быть просто одним числом (главной версией), двумя числами, разделёнными точкой (главной и дополнительной версией), или тремя числами, разделёнными точками (главной, дополнительной и версией исправления).

-dumpfullversion

Вывести полную версию компилятора — и ничего более. Вывод всегда состоит из трёх чисел, разделённых точками: основной, дополнительной и версии исправления.

-dumpspecs

Вывести встроенные спецификации компилятора — и ничего более. (Это используется, когда GCC сам строится.) См. Указание подпроцессов и параметров, которые передать им.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Developer-Options.html

Spec-Zone.ru

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