Spec-Zone.ru › GCC 15

3.19 Параметры 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

Создать дамп после завершения обработки исключений.

-fdump-rtl-eh_ranges

Создать дамп после преобразования диапазонов обработки исключений.

-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-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-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 к имени исходного файла; файл создаётся в том же каталоге, что и выходной файл. Каждая запись находится на отдельной строке и содержит поля, разделённые точками с запятой.

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

  1. Строка Callgraph clone.
  2. Имя клонируемой функции в том виде, в каком оно передаётся ассемблеру.
  3. Число, однозначно идентифицирующее клонируемую функцию в графе вызовов. Обратите внимание: это число уникально только в пределах единицы компиляции или анализа всей программы, но, вероятно, будет различаться в двух фазах.
  4. Имя исходного файла, в котором определена функция.
  5. Строка, в которой находится определение функции.
  6. Столбец, в котором находится определение функции.
  7. Имя нового клона функции в том виде, в каком оно передаётся ассемблеру.
  8. Число, однозначно идентифицирующее новый клон функции в графе вызовов. Обратите внимание: это число уникально только в пределах единицы компиляции или анализа всей программы, но, вероятно, будет различаться в двух фазах.
  9. Имя исходного файла, на который указывает местоположение исходного кода нового клона.
  10. Строка, на которую указывает местоположение исходного кода нового клона.
  11. Столбец, на который указывает местоположение исходного кода нового клона.
  12. Строка, указывающая причину клонирования.

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

  1. Строка Callgraph removal.
  2. Имя удаляемой функции в том виде, в каком оно передавалось бы ассемблеру.
  3. Число, однозначно идентифицирующее клонируемую функцию в графе вызовов. Обратите внимание: это число уникально только в пределах единицы компиляции или анализа всей программы, но, вероятно, будет различаться в двух фазах.
  4. Имя исходного файла, в котором определена функция.
  5. Строка, в которой находится определение функции.
  6. Столбец, в котором находится определение функции.
-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.

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

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

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

Параметры options делятся на три группы:

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

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

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

‘optimized’

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

‘missed’

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

‘note’

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

‘all’

Выводить подробные сведения об оптимизации. Сюда входят ‘optimized’, ‘missed’ и ‘note’.

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

‘internals’

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

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

‘ipa’

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

‘loop’

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

‘inline’

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

‘omp’

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

‘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

Если в командной строке этот параметр указан перед --help=, -Q служит модификатором вывода справки. Подробные сведения о --help= см. в разделе Параметры, управляющие типом вывода.

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

-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

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

Как и 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 можно не указывать; если он не задан, его значение по умолчанию равно нулю. Например, при -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

Вывести путь к библиотекам ОС для выбранной многоархитектурной конфигурации относительно некоторого подкаталога 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-15.3.0/gcc/Developer-Options.html

Spec-Zone.ru

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