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