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-
Дамп после обнаружения auto-inc-dec. Этот проход выполняется только на архитектурах, которые имеют инструкции auto inc или auto dec.
-fdump-rtl-barriers-
Дамп после очистки инструкций барьеров.
-fdump-rtl-bbpart-
Дамп после разделения горячих и холодных базовых блоков.
-fdump-rtl-bbro-
Дамп после переупорядочивания блоков.
-fdump-rtl-btl1-fdump-rtl-btl2-
-fdump-rtl-btl1 и -fdump-rtl-btl2 включают дампы после двух проходов оптимизации загрузки целевого адреса ветвления.
-fdump-rtl-bypass-
Дамп после прохода обхода переходов и оптимизации потоков управления.
-fdump-rtl-combine-
Дамп после прохода объединения инструкций RTL.
-fdump-rtl-compgotos-
Дамп после дублирования вычисленных переходов.
-fdump-rtl-ce1-fdump-rtl-ce2-fdump-rtl-ce3-
-fdump-rtl-ce1, -fdump-rtl-ce2 и -fdump-rtl-ce3 включают дампы после трёх проходов преобразования инструкций if.
-fdump-rtl-cprop_hardreg-
Дамп после распространения копирования жёстких регистров.
-fdump-rtl-csa-
Дамп после объединения корректировок стека.
-fdump-rtl-cse1-fdump-rtl-cse2-
-fdump-rtl-cse1 и -fdump-rtl-cse2 включают дампы после двух проходов устранения общих подвыражений.
-fdump-rtl-dce-
Дамп после проходов устранения мёртвого кода отдельно.
-fdump-rtl-dbr-
Дамп после планирования задержки ветвлений.
-fdump-rtl-dce1-fdump-rtl-dce2-
-fdump-rtl-dce1 и -fdump-rtl-dce2 включают дампы после двух проходов устранения мёртвых хранений.
-fdump-rtl-eh-
Дамп после завершения обработки исключений.
-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-
Дамп после прохода 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/data/кучи/стека/dso.
-freport-bug-
Собирает и выводит информацию отладки в временный файл при возникновении внутренней ошибки компилятора (ICE).
-fdump-unnumbered-
При выполнении дампов отладки подавляет вывод номеров инструкций и адресов. Это позволяет использовать diff для сравнения дампов отладки для вызовов компилятора с различными параметрами, в частности, с -g и без него.
-fdump-unnumbered-links-
При выполнении дампов отладки (см. параметр -d выше) подавляет вывод номеров инструкций для ссылок на предыдущую и следующую инструкции в последовательности.
-fdump-ipa-switch-fdump-ipa-switch-options-
Управляет выводом дампов на различных этапах анализа межпроцедурного языка в файл. Имя файла генерируется путём добавления постфикса, специфичного для переключателя, к имени исходного файла, а файл создаётся в той же директории, что и выходной файл. Возможны следующие дампы:
- ‘all’
-
Включает все дампы межпроцедурного анализа.
- ‘cgraph’
-
Выводит информацию об оптимизации графа вызовов, удалении неиспользуемых функций и решениях по встраиванию.
- ‘inline’
-
Дамп после встраивания функций.
Кроме того, могут быть указаны параметры -optimized, -missed, -note и -all с тем же значением, что и для -fopt-info, по умолчанию используется -optimized.
Например, -fdump-ipa-inline-optimized-missed выведет информацию о местах вызова, которые были встроены, вместе с местами вызова, которые не были встроены.
По умолчанию дамп будет содержать сообщения об успешных оптимизациях (эквивалентно -optimized) вместе с подробными сведениями о низкого уровня анализа.
-fdump-lang
-
Выгрузка информации, специфичной для языка. Имя файла формируется путём добавления .lang к имени исходного файла.
-fdump-lang-all-fdump-lang-switch-fdump-lang-switch-options-fdump-lang-switch-options=filename-
Управление выгрузкой информации, специфичной для языка. Части options и filename ведут себя так же, как описано в опции -fdump-tree. Принимаются следующие значения switch:
- ‘all’
-
Включить все выгрузки, специфичные для языка.
- ‘class’
-
Выгрузить информацию о иерархии классов. Информация о виртуальных таблицах выводится, если не указано ’slim’. Данная опция применима только к C++.
- ‘module’
-
Выгрузить информацию о модуле. Опции lineno (позиции), graph (достижимость), blocks (кластеры), uid (сериализация), alias (сливаемый), asmname (Elrond), eh (mapper) и vops (макросы) могут предоставить дополнительную информацию. Данная опция применима только к C++.
- ‘raw’
-
Выгрузить данные исходного дерева.
-fdump-passes-
Вывести на stderr список оптимизационных проходов, включенных и выключенных текущими опциями командной строки.
-fdump-statistics-option-
Включить и управлять выгрузкой статистики проходов в отдельный файл. Имя файла формируется путем добавления суффикса, заканчивающегося на ‘.statistics’, к имени исходного файла, и файл создаётся в той же директории, что и выходной файл. Если используется форма ‘-option’, ‘-stats’ суммирует счётчики по всему модулю компиляции, а ‘-details’ выгружает каждое событие по мере их генерации проходами. По умолчанию, без опций, суммируются счётчики для каждой компилируемой функции.
-fdump-tree-all-fdump-tree-switch-fdump-tree-switch-options-fdump-tree-switch-options=filename-
Управление выгрузкой на различных стадиях обработки дерева промежуточного языка в файл. Если используется форма ‘-options’, options — список опций, разделённых символом ‘-’, которые управляют подробностями выгрузки. Не все опции применимы ко всем выгрузкам; те, которые не имеют смысла, игнорируются. Доступны следующие опции:
- ‘address’
Вывести адрес каждого узла. Обычно это не имеет смысла, так как он изменяется в зависимости от среды и исходного файла. Его основное назначение — привязка файла выгрузки к среде отладки.
- ‘asmname’
Если для данного объявления было установлено значение
DECL_ASSEMBLER_NAME, его использовать в выгрузке вместоDECL_NAME. Основное назначение — простота работы при обратном анализе от искажённых имён в файле ассемблера.- ‘slim’
-
При выгрузке промежуточных представлений переднего плана запретить выгрузку элементов области видимости или тела функции только потому, что эта область видимости была достигнута. Выгружать такие элементы только тогда, когда они непосредственно достижимы каким-либо другим путём.
При выгрузке красиво отформатированных деревьев эта опция запрещает выгрузку тел управляющих конструкций.
При выгрузке RTL выводить RTL в сжатом (компактном) формате вместо стандартного представления, похожего на LISP.
- ‘raw’
Вывести необработанное представление дерева. По умолчанию деревья выводятся в формате, похожем на C.
- ‘details’
Включить более подробные выгрузки (не поддерживаются каждой опцией выгрузки). Также включить информацию из оптимизационных проходов.
- ‘stats’
Включить выгрузку различных статистических данных о проходе (не поддерживается каждой опцией выгрузки).
- ‘blocks’
Включить отображение границ базовых блоков (выключено в необработанных выгрузках).
- ‘graph’
-
Для каждого из указанных файлов выгрузки (-fdump-rtl-pass) вывести представление графа потока управления, подходящего для просмотра с помощью GraphViz, в файл file.passid.pass.dot. Каждая функция в файле красиво форматируется как подграф, чтобы GraphViz мог отобразить их все на одном графике.
Эта опция в настоящее время работает только для выгрузок RTL, и RTL всегда выгружается в сжатом формате.
- ‘vops’
Включить отображение виртуальных операндов для каждого оператора.
- ‘lineno’
Включить отображение номеров строк для операторов.
- ‘uid’
Включить отображение уникального идентификатора (
DECL_UID) для каждой переменной.- ‘verbose’
Включить выгрузку дерева для каждого оператора.
- ‘eh’
Включить отображение номера области EH, содержащей каждый оператор.
- ‘scev’
Включить отображение подробностей анализа скалярной эволюции.
- ‘optimized’
Включить отображение оптимизационной информации (доступно только в определённых проходах).
- ‘missed’
Включить отображение информации об упущенных оптимизациях (доступно только в определённых проходах).
- ‘note’
Включить другую подробную оптимизационную информацию (доступно только в определённых проходах).
- ‘all’
Включить все опции, за исключением raw, slim, verbose и lineno.
- ‘optall’
Включить все оптимизационные опции, т.е. optimized, missed и note.
Чтобы определить доступные выгрузки дерева или найти выгрузку для интересующего прохода, выполните следующие шаги.
- Вызовите GCC с -fdump-passes и в выводе stderr найдите код, соответствующий интересующему проходу. Например, коды
tree-evrp,tree-vrp1, иtree-vrp2соответствуют трём проходам Value Range Propagation. Цифра в конце отличает разные вызовы одного и того же прохода. - Чтобы включить создание файла выгрузки, добавьте код прохода к префиксу опции -fdump- и вызовите GCC с ним. Например, чтобы включить выгрузку из прохода Early Value Range Propagation, вызовите GCC с опцией -fdump-tree-evrp. По желанию, можно указать имя файла выгрузки. Если вы его не укажете, GCC создаст его, как описано ниже.
- Найдите выгрузку прохода в файле, имя которого состоит из трёх компонентов, разделённых точкой: имя исходного файла, вызываемого GCC, числовой суффикс, указывающий номер прохода, за которым следует буква ‘t’ для проходов дерева (и буква ‘r’ для проходов RTL), и, наконец, код прохода. Например, выгрузка прохода Early VRP может находиться в файле с именем myfile.c.038t.evrp в текущей рабочей директории. Обратите внимание, что числовые коды нестабильны и могут меняться в разных версиях GCC.
-fopt-info-fopt-info-options-fopt-info-options=filename
-
Управляет выводом оптимизационных дампов из различных оптимизационных проходов. Если используется форма ‘-options’, options представляет собой список ключевых слов опций, разделённых символом ‘-’, для выбора деталей дампа и оптимизаций.
options можно разделить на три группы:
- опции, описывающие типы сообщений, которые должны быть выведены,
- опции, описывающие подробность дампа, и
- опции, описывающие, какие оптимизации должны быть включены.
Опции из каждой группы могут быть свободно смешаны, так как они не пересекаются. Однако, в случае конфликта, последующие опции на командной строке переопределяют предыдущие.
Следующие опции управляют тем, какие типы сообщений должны быть выведены:
- ‘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-
Эта опция предоставляет начальное значение, которое 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-
Заставляет компилятор выводить некоторую статистику о времени, затраченном каждым проходом, по его завершении.
-ftime-report-details-
Записывать время, затраченное частями инфраструктуры отдельно для каждого прохода.
-fira-verbose=n-
Управлять подробностью файла вывода для интегрированного регистрового аллокатора. Значение по умолчанию — 5. Если значение n больше или равно 10, вывод вывода отправляется в stderr в том же формате, что и n минус 10.
-flto-report-
Выводит отчет с внутренними подробностями работы оптимизатора на этапе компоновки. Содержимое этого отчета меняется от версии к версии. Он предназначен для использования разработчикам GCC при обработке объектных файлов в режиме LTO (через -flto).
Отключено по умолчанию.
-flto-report-wpa-
Как -flto-report, но выводить только для фазы WPA оптимизации на этапе компоновки.
-fmem-report-
Заставляет компилятор выводить некоторую статистику об выделении постоянной памяти по завершении.
-fmem-report-wpa-
Заставляет компилятор выводить некоторую статистику об выделении постоянной памяти только для фазы WPA.
-fpre-ipa-mem-report-fpost-ipa-mem-report-
Заставляет компилятор выводить некоторую статистику об выделении постоянной памяти до или после межпроцедурной оптимизации.
-fprofile-report-
Заставляет компилятор выводить некоторую статистику о согласованности (оцененного) профиля и влияния отдельных проходов.
-fstack-usage-
Заставляет компилятор выводить информацию об использовании стека для программы, на основе каждой функции. Имя файла для вывода создается путем добавления .su к auxname. auxname генерируется из имени выходного файла, если он явно указан и не является исполняемым файлом, в противном случае это имя файла исходного кода без пути. Запись состоит из трех полей:
- Имя функции.
- Количество байтов.
- Один или несколько квалификаторов:
static,dynamic,bounded.
Квалификатор
staticозначает, что функция манипулирует стеком статически: фиксированное количество байтов выделяется для кадра при входе в функцию и освобождается при выходе из функции; другие корректировки стека в функции не выполняются. Второе поле — это это фиксированное количество байтов.Квалификатор
dynamicозначает, что функция динамически манипулирует стеком: помимо статического выделения, описанного выше, в теле функции выполняются корректировки стека, например, для помещения/извлечения аргументов вокруг вызовов функций. Если также присутствует квалификаторbounded, количество этих корректировок ограничено во время компиляции, и второе поле — это верхняя граница общего объёма стека, используемого функцией. Если он отсутствует, количество этих корректировок не ограничено во время компиляции, и второе поле представляет только ограниченную часть. -fstats-
Выдать статистику о обработке фронтенда по завершению компиляции. Этот параметр поддерживается только фронтендом C++, и информация, как правило, полезна только команде разработчиков G++.
-fdbg-cnt-list-
Напечатать имя и верхнюю границу счётчика для всех отладочных счётчиков.
-fdbg-cnt=counter-value-list-
Установить нижнюю и верхнюю границы внутреннего отладочного счётчика. counter-value-list — это список, разделённый запятыми, из кортежей name:lower_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-
Вывести имя директории, соответствующей выбранному многоязыковым вариантом с помощью других параметров командной строки. Эта директория должна существовать в
GCC_EXEC_PREFIX. -print-multi-lib-
Вывести сопоставление между именами директорий многоязыковых вариантов и параметрами компилятора, которые их включают. Имя директории отделяется от параметров символом ‘;’, а каждый параметр начинается с символа ‘@’ вместо ‘-’, без пробелов между параметрами.
-print-multi-os-directory-
Вывести путь к библиотекам ОС для выбранного многоязыкового варианта, относительно подкаталога lib. Если библиотеки ОС присутствуют в подкаталоге lib и не используются многоязыковые варианты, это обычно просто ., если библиотеки ОС присутствуют в каталогах-сёстрах libsuffix, это выводит, например, ../lib64, ../lib или ../lib32, или если библиотеки ОС присутствуют в подкаталогах lib/subdir, это выводит, например, amd64, sparcv9 или ev6.
-print-multiarch
-
Вывести путь к библиотекам ОС для выбранного multiarch, относительно некоторого подкаталога lib.
-print-prog-name=program-
Подобно -print-file-name, но ищет программу, например,
cpp. -print-libgcc-file-name-
То же самое, что и -print-file-name=libgcc.a.
Это полезно, когда вы используете -nostdlib или -nodefaultlibs, но хотите связаться с libgcc.a. Вы можете сделать так:
gcc -nostdlib files… `gcc -print-libgcc-file-name`
-print-search-dirs-
Вывести имя настроенного каталога установки и список каталогов программ и библиотек, в которых
gccищет—и не делать ничего больше.Это полезно, когда
gccвыводит сообщение об ошибке ‘installation problem, cannot exec cpp0: No such file or directory’. Чтобы решить эту проблему, вам нужно либо поместить cpp0 и другие компоненты компилятора туда, гдеgccожидает их найти, либо установить переменную окруженияGCC_EXEC_PREFIXв каталог, где вы их установили. Не забудьте заключительный ‘/’. См. Переменные среды, влияющие на GCC. -print-sysroot-
Вывести целевой каталог sysroot, используемый во время компиляции. Это целевой sysroot, указанный либо во время настройки, либо с помощью параметра --sysroot, возможно, с дополнительным суффиксом, который зависит от опций компиляции. Если целевой sysroot не указан, опция ничего не выводит.
-print-sysroot-headers-suffix-
Вывести суффикс, добавляемый к целевому sysroot при поиске заголовков, или выдать ошибку, если компилятор не настроен с таким суффиксом—и не делать ничего больше.
-dumpmachine-
Вывести целевую машину компилятора (например, ‘i686-pc-linux-gnu’)—и не делать ничего больше.
-dumpversion-
Вывести версию компилятора (например,
3.0,6.3.0или7)—и не делать ничего больше. Это версия компилятора, используемая в путях и спецификациях файловой системы. В зависимости от того, как был настроен компилятор, это может быть просто одно число (главная версия), два числа, разделенных точкой (главная и второстепенная версия), или три числа, разделенных точками (главная, второстепенная и версия исправления). -dumpfullversion-
Вывести полную версию компилятора—и не делать ничего больше. Вывод всегда состоит из трех чисел, разделенных точками, основной, дополнительной и версией исправления.
-dumpspecs-
Вывести встроенные спецификации компилятора—и не делать ничего больше. (Это используется при построении самого GCC.) См. Указание подпроцессов и переключателей, которые нужно передать им.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Developer-Options.html