Spec-Zone.ru › GCC 9

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

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

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

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

-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 включают вывод дампов после трех проходов преобразования инструкций if.

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

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

‘all’

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

‘cgraph’

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

‘inline’

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

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

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

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

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

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

‘all’

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

‘class’

Выгрузить информацию об иерархии классов. Информация о виртуальной таблице выводится, если не указано ’slim’. Эта опция применима только к 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’

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

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

При выгрузке 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 соответствуют трём пасам Value Range Propagation. Число в конце отличает различные вызовы одного и того же паса.
  2. Чтобы включить создание файла выгрузки, добавьте код паса к префиксу опции -fdump- и вызовите GCC с ним. Например, чтобы включить выгрузку из паса Early Value Range Propagation, вызовите GCC с опцией -fdump-tree-evrp. Дополнительно вы можете указать имя файла выгрузки. Если вы не укажете имя, GCC создаст его, как описано ниже.
  3. Найдите выгрузку паса в файле, имя которого состоит из трёх компонентов, разделённых точкой: имя исходного файла, к которому обращался GCC, числовой суффикс, указывающий номер паса, за которым следует буква ‘t’ для деревьев и ‘r’ для RTL, и, наконец, код паса. Например, выгрузка паса Early VRP может находиться в файле с именем myfile.c.038t.evrp в текущем рабочем каталоге. Обратите внимание, что числовые коды нестабильны и могут меняться от одной версии GCC к другой.
-fopt-info
-fopt-info-options
-fopt-info-options=filename

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

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

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

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

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

‘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
-save-temps=cwd

Постоянно сохраняйте обычные «временные» промежуточные файлы; поместите их в текущую директорию и назовите их, основываясь на исходном файле. Таким образом, компиляция foo.c с -c -save-temps создаёт файлы foo.i и foo.s, а также foo.o. Это создаёт файл вывода препроцессированного foo.i, даже несмотря на то, что компилятор теперь обычно использует интегрированный препроцессор.

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

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

gcc -save-temps -o outdir1/foo.o indir1/foo.c&
gcc -save-temps -o outdir2/foo.o indir2/foo.c&

может привести к тому, что foo.i и foo.o будут записаны одновременно обоими компиляторами.

-save-temps=obj

Постоянно сохраняйте обычные «временные» промежуточные файлы. Если используется параметр -o, временные файлы базируются на файле объекта. Если параметр -o не используется, переключатель -save-temps=obj ведёт себя как -save-temps.

Например:

gcc -save-temps=obj -c foo.c
gcc -save-temps=obj -c bar.c -o dir/xbar.o
gcc -save-temps=obj foobar.c -o dir2/yfoobar

создаёт foo.i, foo.s, dir/xbar.i, dir/xbar.s, dir2/yfoobar.i, dir2/yfoobar.s и dir2/yfoobar.o.

-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 к имени файла вывода компиляции.

-fcompare-debug[=opts]

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

Если знак равенства опущен, используется значение по умолчанию -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

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

-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_bound:upper_bound, который устанавливает нижнюю и верхнюю границы каждого отладочного счётчика name. lower_bound необязателен и инициализируется нулём, если не задан. Все отладочные счётчики имеют начальную верхнюю границу UINT_MAX; таким образом dbg_cnt возвращает true всегда, если верхняя граница не установлена этим параметром. Например, с -fdbg-cnt=dce:2:4,tail_call:10, dbg_cnt(dce) возвращает true только для третьего и четвёртого вызова. Для dbg_cnt(tail_call) true возвращается для первых 10 вызовов.

-print-file-name=library

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

-print-multi-directory

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

-print-multi-lib

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

-print-multi-os-directory

Выводит путь к библиотекам ОС для выбранной multilib, относительно некоторого подкаталога lib. Если библиотеки ОС присутствуют в подкаталоге lib и не используются multilib, обычно это просто ., если библиотеки ОС присутствуют в подкаталогах 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 выводит сообщение об ошибке ‘проблема с установкой, нельзя выполнить cpp0: Нет такого файла или каталога’. Для решения этой проблемы вам нужно поместить cpp0 и другие компоненты компилятора туда, где gcc ожидает их найти, или вы можете установить переменную среды GCC_EXEC_PREFIX в каталог, где вы их установили. Не забудьте заключительный символ ‘/’. См. Переменные среды.

-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.) См. Файлы спецификаций.

Далее: Опции подмоделей, Предыдущее: Опции генерации кода, Наверх: Вызов GCC [Оглавление][Индекс]

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

Spec-Zone.ru

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