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