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’
-
Вывод после встраивания функции.
- ‘strubm’
-
Вывод после выбора режимов
strub, и записи выборов как атрибутов функций. - ‘strub’
-
Вывод преобразований
strub: изменения интерфейса, обертывание функций и вставка встроенных вызовов для очистки стека и маркировки.
Кроме того, можно использовать параметры -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’
-
При выводе промежуточных представлений переднего плана запрещается вывод членов области видимости или тела функции только потому, что эта область видимости была достигнута. Вывод таких элементов осуществляется только тогда, когда они непосредственно достижимы каким-либо другим путем.
При выводе красиво отформатированных деревьев этот параметр запрещает вывод тел управляющих структур.
При выводе RTL, вывод RTL в формате slim (сжатый) вместо представления по умолчанию в стиле 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 (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 - список, разделенный запятыми, диапазонов функций или имен ассемблера. Каждый диапазон - это пара чисел, разделенных двоеточием. Диапазон включает оба конца. Если диапазон тривиален, пару чисел можно упростить до одного числа. Если узел узла вызова функции в графе вызовов находится в одном из указанных диапазонов, этап 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 к аргументам, передаваемым во вторую компиляцию. Выгрузить окончательное внутреннее представление в обе компиляции и вывести ошибку, если они отличаются.
Если знак равенства опущен, используется значение по умолчанию -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 -
Этот параметр позволяет использовать многоязычную поддержку
TFLAGSдля построения целевых библиотек с параметрами, отличающимися от тех, которые компилятор настроен использовать по умолчанию, с помощью спецификаций (см. Указание дочерних процессов и параметров, передаваемых им), заданных внутренними компонентами компилятора, целевым компилятором или разработчиками на этапе конфигурации.Подобно
TFLAGS, это позволяет создавать целевые библиотеки для портативных базовых сред, в то время как компилятор по умолчанию использует более требовательные. Это полезно, потому что пользователи могут легко переопределить значения по умолчанию, настроенные компилятором для создания собственных программ, если значения по умолчанию не подходят для их целевой среды, в то время как перестройка библиотек времени выполнения обычно не так просто или желательна.В отличие от
TFLAGS, использование спецификаций позволяет выбирать различные флаги для различных многоязыковых сред. Способ достижения этого — компиляция с ‘make TFLAGS=-fmultiflags’ после конфигурации ‘--with-specs=%{fmultiflags:...}’.Этот параметр отбрасывается драйвером после завершения обработки собственной спецификации драйвера.
Также полезно проверить, что
TFLAGSиспользуются для создания всех целевых библиотек, настроив не-bootstrap компилятор ‘--with-specs='%{!fmultiflags:%emissing TFLAGS}'’ и собрав компилятор и целевые библиотеки. -
-fprofile-report -
Заставляет компилятор выводить некоторую статистику о согласованности (оценённого) профиля и эффекта отдельных проходов.
-
-fstack-usage -
Заставляет компилятор выводить информацию об использовании стека для программы, на основе каждой функции. Имя файла выгрузки создаётся путём добавления .su к auxname. auxname генерируется из имени выходного файла, если он явно указан и это не исполняемый файл, иначе это имя файла без пути исходного файла. Запись состоит из трёх полей:
- Имя функции.
- Количество байт.
- Один или несколько квалификаторов:
static,dynamic,bounded.
Квалификатор
staticозначает, что функция манипулирует стеком статически: для кадра выделяется фиксированное количество байт при входе в функцию и освобождается при выходе из неё; в функции не выполняются другие корректировки стека. Второе поле — это фиксированное количество байт.Квалификатор
dynamicозначает, что функция динамически манипулирует стеком: в дополнение к описанному выше статическому выделению в теле функции выполняются корректировки стека, например, для помещения/извлечения аргументов вокруг вызовов функций. Если также присутствует квалификаторbounded, количество этих корректировок ограничено во время компиляции, и второе поле является верхней границей общего объёма стека, используемого функцией. Если он отсутствует, количество этих корректировок не ограничено во время компиляции, и второе поле представляет только ограниченную часть. -
-fstats -
Выводит статистику по обработке на этапе front-end по завершении компиляции. Эта опция поддерживается только front-end C++, и информация обычно полезна только команде разработчиков G++.
-
-fdbg-cnt-list
-
Выведите имя и верхнюю границу счетчика для всех отладочных счетчиков.
-
-fdbg-cnt=counter-value-list -
Установите нижнюю и верхнюю границу внутреннего отладочного счетчика. counter-value-list — это список, разделенный запятыми, пар имя:нижняя_граница1-верхняя_граница1 [:нижняя_граница2-верхняя_граница2...], задающих имя счетчика и список замкнутых интервалов. нижняя_граница — необязательна и инициализируется нулём, если не указана. Например, с помощью -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 -
Выведите имя директории, соответствующей многолиб, выбранной любыми другими параметрами в командной строке. Эта директория должна существовать в
GCC_EXEC_PREFIX. -
-print-multi-lib -
Выведите отображение имён директорий многолиб на параметры компилятора, которые их активируют. Имя директории отделено от параметров знаком «;», а каждый параметр начинается с «@» вместо «-», без пробелов между несколькими параметрами. Это должно упростить обработку оболочки.
-
-print-multi-os-directory -
Выведите путь к библиотекам ОС для выбранной многолиб, относительно некоторой поддиректории lib. Если библиотеки ОС находятся в поддиректории lib и не используются многолиб, это обычно просто .. Если библиотеки ОС находятся в поддиректориях 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, используемый во время компиляции. Это целевой 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-14.2.0/gcc/Developer-Options.html