3.18 Параметры GCC для разработчиков
В этом разделе описываются параметры командной строки, представляющие в первую очередь интерес для разработчиков GCC, в том числе параметры для поддержки тестирования компилятора и исследования ошибок компилятора и проблем производительности во время компиляции. К ним относятся параметры, создающие отладочные дампы на различных этапах компиляции; выводящие статистику, например об использовании памяти и времени выполнения; а также выводящие сведения о конфигурации GCC, например о том, где выполняется поиск библиотек. Для обычной компиляции и компоновки вам редко понадобится использовать какие-либо из этих параметров.
Многие параметры для разработчиков, которые заставляют GCC записывать вывод в файл, принимают необязательный суффикс ‘=filename’. Чтобы записать вывод в стандартный поток вывода, укажите ‘stdout’ или ‘-’, а для записи в стандартный поток ошибок — ‘stderr’.
Если ‘=filename’ не указан, имя файла дампа по умолчанию формируется путем объединения базового имени файла дампа, номера прохода, буквы фазы и имени прохода. Базовым именем файла дампа является имя выходного файла, создаваемого компилятором, если оно явно задано и файл не является исполняемым; в противном случае используется имя исходного файла. Номер прохода определяется порядком регистрации проходов в менеджере проходов компилятора. Обычно он совпадает с порядком выполнения, но проходы, зарегистрированные плагинами, целевые проходы или проходы, зарегистрированные иным образом на позднем этапе, получают номер выше, чем проход с именем ‘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 или некоторых символов letters параметра -d. Ниже перечислены возможные символы для 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 -
Создать дамп после этапа оптимизации с помощью «глазка».
-
-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 отладочных дампов, полученных при запусках компилятора с разными бинарными файлами компилятора и/или разными начальными адресами областей text / bss / data / heap / stack / dso.
-
-freport-bug -
Собирать отладочную информацию и выводить её во временный файл при возникновении внутренней ошибки компилятора (ICE).
-
-fdump-unnumbered -
При создании отладочных дампов не выводить номера инструкций и адреса. Это упрощает сравнение с помощью diff отладочных дампов, полученных при запусках компилятора с разными параметрами, в частности с -g и без него.
-
-fdump-unnumbered-links -
При создании отладочных дампов (см. описанный выше параметр -d) не выводить номера инструкций в ссылках на предыдущую и следующую инструкции в последовательности.
-
-fdump-ipa-switch -fdump-ipa-switch-options-
Управляет выводом в файл дерева языка на различных этапах межпроцедурного анализа. Имя файла формируется добавлением суффикса, зависящего от параметра, к имени исходного файла; файл создаётся в том же каталоге, что и выходной файл. Возможны следующие дампы:
- ‘all’
-
Включить все дампы межпроцедурного анализа.
- ‘cgraph’
-
Создать дамп сведений об оптимизации графа вызовов, удалении неиспользуемых функций и решениях о встраивании.
- ‘inline’
-
Создать дамп после встраивания функций.
- ‘strubm’
-
Создать дамп после выбора режимов
strubи сохранения выбранных режимов в атрибутах функций. - ‘strub’
-
Создать дамп преобразований
strub: изменений интерфейса, обёртывания функций и вставки встроенных вызовов для очистки и маркировки стека.
Кроме того, можно указать параметры -optimized, -missed, -note и -all со значениями, аналогичными значениям для -fopt-info; по умолчанию используется -optimized.
Например, -fdump-ipa-inline-optimized-missed выведет сведения о встроенных местах вызова, а также о местах вызова, для которых встраивание не выполнялось.
По умолчанию дамп содержит сообщения об успешных оптимизациях (эквивалентно -optimized) и низкоуровневые подробности анализа.
-
-fdump-ipa-clones -
Создать файл дампа со сведениями о создании клонов узлов графа вызовов и удалении узлов графа вызовов во время межпроцедурной оптимизации и преобразований. Файл предназначен прежде всего для инструментов создания динамических исправлений: он позволяет определить набор функций, которые необходимо исправить динамически для полной замены конкретной функции (см. -flive-patching). Имя файла формируется добавлением суффикса
ipa-clonesк имени исходного файла; файл создаётся в том же каталоге, что и выходной файл. Каждая запись занимает отдельную строку и содержит поля, разделённые точками с запятой.При создании клона узла графа вызовов поля имеют следующий вид:
- Строка
Callgraph clone. - Имя клонируемой функции в том виде, в каком оно передаётся ассемблеру.
- Число, однозначно идентифицирующее клонируемую функцию в графе вызовов. Обратите внимание, что это число уникально только в пределах единицы компиляции или анализа всей программы, но в этих двух фазах, вероятно, будет различаться.
- Имя исходного файла, в котором определена функция.
- Строка, в которой находится определение функции.
- Столбец, в котором находится определение функции.
- Имя нового клона функции в том виде, в каком оно передаётся ассемблеру.
- Число, однозначно идентифицирующее новый клон функции в графе вызовов. Обратите внимание, что это число уникально только в пределах единицы компиляции или анализа всей программы, но в этих двух фазах, вероятно, будет различаться.
- Имя исходного файла, на который указывает местоположение исходного кода нового клона.
- Строка, на которую указывает местоположение исходного кода нового клона.
- Столбец, на который указывает местоположение исходного кода нового клона.
- Строка, указывающая причину клонирования.
При удалении клона узла графа вызовов поля имеют следующий вид:
- Строка
Callgraph removal. - Имя удаляемой функции в том виде, в каком оно передавалось бы ассемблеру.
- Число, однозначно идентифицирующее клонируемую функцию в графе вызовов. Обратите внимание, что это число уникально только в пределах единицы компиляции или анализа всей программы, но в этих двух фазах, вероятно, будет различаться.
- Имя исходного файла, в котором определена функция.
- Строка, в которой находится определение функции.
- Столбец, в котором находится определение функции.
- Строка
-
-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 (сопоставитель) и 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’
-
При выводе промежуточных представлений внешнего интерфейса не выводить элементы области видимости или тела функции только потому, что эта область видимости была достигнута. Такие элементы выводятся, только если к ним можно перейти непосредственно по другому пути.
При выводе деревьев в удобочитаемом формате этот параметр запрещает выводить тела управляющих конструкций.
При выводе 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); и, наконец, кода этапа. Например, дамп этапа раннего VRP может находиться в файле 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 (выгрузка и многопроцессорная обработка).
- ‘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 -
Этот параметр задаёт начальное значение, которое 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 к аргументам второй компиляции. Записать окончательное внутреннее представление в обоих запусках и вывести сообщение об ошибке, если представления различаются.
Если знак равенства опущен, используется значение по умолчанию -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 -
Заставляет компилятор по завершении каждого прохода выводить в stderr некоторую статистику о затраченном времени.
Если вывод диагностики в формате SARIF запрошен с помощью -fdiagnostics-format=sarif-file или -fdiagnostics-format=sarif-stderr, сведения -ftime-report вместо этого выводятся в формате JSON как часть вывода SARIF. Точный формат этих данных JSON может измениться; значения могут не полностью совпадать с выводимыми в stderr, поскольку запись выполняется в несколько ином месте компилятора.
-
-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 -
Этот параметр позволяет использовать учитывающий multilib
TFLAGSдля сборки целевых библиотек с параметрами, отличными от заданных в конфигурации компилятора по умолчанию. Для этого используются спецификации (см. раздел Задание подпроцессов и передаваемых им параметров), подготовленные внутренними компонентами компилятора, целевой платформой или сборщиками во время настройки.Как и
TFLAGS, этот параметр позволяет собирать целевые библиотеки для переносимых базовых сред, даже если компилятор по умолчанию настроен на более требовательные среды. Это полезно, поскольку пользователи могут легко переопределить параметры по умолчанию, заданные для компилятора, при сборке собственных программ, если эти значения не подходят для целевой среды. Пересобирать же библиотеки времени выполнения обычно сложнее и нежелательно.В отличие от
TFLAGS, использование спецификаций позволяет выбирать разные флаги для разных multilib. Для этого следует выполнить сборку с помощью ‘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 указывать необязательно; если он не задан, используется значение 0. Например, при -fdbg-cnt=dce:2-4:10-11,tail_call:10
dbg_cnt(dce)возвращает true только при втором, третьем, четвёртом, десятом и одиннадцатом вызовах. Дляdbg_cnt(tail_call)значение true возвращается при первых 10 вызовах. -
-print-file-name=library -
Вывести полное абсолютное имя файла библиотеки library, который использовался бы при компоновке, и больше ничего не делать. С этим параметром GCC ничего не компилирует и не компонуёт, а только выводит имя файла.
-
-print-multi-directory -
Вывести имя каталога, соответствующего multilib, выбранному с помощью других переключателей в командной строке. Предполагается, что этот каталог существует в
GCC_EXEC_PREFIX. -
-print-multi-lib -
Вывести соответствие между именами каталогов multilib и переключателями компилятора, которые их включают. Имя каталога отделяется от переключателей символом ‘;’, а каждый переключатель начинается с ‘@’ вместо ‘-’; между несколькими переключателями пробелы не ставятся. Это упрощает обработку в командной оболочке.
-
-print-multi-os-directory -
Вывести путь к библиотекам ОС для выбранного multilib относительно некоторого подкаталога lib. Если библиотеки ОС находятся в подкаталоге lib и 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выводит сообщение об ошибке ‘installation problem, cannot exec cpp0: No such file or directory’. Чтобы устранить эту проблему, поместите cpp0 и остальные компоненты компилятора в ожидаемоеgccместо либо задайте переменной средыGCC_EXEC_PREFIXкаталог, в который вы их установили. Не забудьте добавить завершающий символ ‘/’. См. раздел Переменные среды, влияющие на GCC. -
-print-sysroot -
Вывести каталог целевой системной корневой файловой системы, используемый во время компиляции. Это целевая системная корневая файловая система, заданная при настройке или с помощью параметра --sysroot, возможно, с дополнительным суффиксом, зависящим от параметров компиляции. Если целевая системная корневая файловая система не задана, параметр ничего не выводит.
-
-print-sysroot-headers-suffix -
Вывести суффикс, добавляемый к целевой системной корневой файловой системе при поиске заголовочных файлов, или выдать ошибку, если компилятор не настроен на использование такого суффикса, и больше ничего не делать.
-
-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-14.4.0/gcc/Developer-Options.html