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 включают вывод после трёх этапов преобразования операторов 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 для сравнения отладочных дампов при разных вызовах компилятора с различными бинарниками и/или разными начальными значениями сегментов текста, данных, кучи, стека и объектов.
-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-all-fdump-lang-switch-fdump-lang-switch-options-fdump-lang-switch-options=filename
-
Управление выводом информации, специфичной для языка. Части options и filename ведут себя так же, как описано в параметре -fdump-tree. Принимаются следующие значения switch:
- ‘all’
-
Включить весь вывод, специфичный для языка.
- ‘class’
-
Вывести информацию об иерархии классов. Информация о виртуальных таблицах выводится, если не указан параметр ‘slim’. Данный параметр применим только к C++.
- ‘raw’
-
Вывести данные исходного внутреннего дерева. Данный параметр применим только к C++.
-fdump-passes-
Вывести в stderr список оптимизационных проходов, включенных и выключенных текущими параметрами командной строки.
-fdump-statistics-option-
Включить и управлять выводом статистики проходов в отдельный файл. Имя файла формируется путем добавления суффикса, заканчивающегося на ‘.statistics’ к имени исходного файла, и файл создается в той же директории, что и выходной файл. Если используется форма ‘-option’, то ‘-stats’ суммирует счётчики по всему модулю компиляции, в то время как ‘-details’ выводит каждое событие, по мере его генерации проходами. По умолчанию, без указания параметра, счётчики суммируются для каждой компилируемой функции.
-fdump-tree-all-fdump-tree-switch-fdump-tree-switch-options-fdump-tree-switch-options=filename-
Управление выводом на различные стадии обработки дерева промежуточного языка в файл. Если используется форма ‘-options’, options представляет собой список параметров, разделенных символом ‘-’, которые управляют деталями вывода. Не все параметры применимы ко всем выводам; те, которые не имеют смысла, игнорируются. Доступные параметры:
- ‘address’
Выводит адрес каждого узла. Обычно это неинформативно, так как он изменяется в зависимости от среды и исходного файла. Его основное применение – сопоставление файла вывода со средой отладки.
- ‘asmname’
Если для данного объявления был задан
DECL_ASSEMBLER_NAME, он используется в выводе вместоDECL_NAME. Его основное применение – упрощение работы, возвращаясь к искажённым именам в файле ассемблера.- ‘slim’
-
При выводе промежуточных представлений передней части, запретить вывод членов области видимости или тела функции просто потому, что область видимости была достигнута. Выводить такие элементы только тогда, когда они непосредственно достижимы каким-либо другим путём.
При выводе красивого дерева, данный параметр запрещает вывод тел управляющих структур.
При выводе RTL, вывести RTL в сокращённой (сжатой) форме вместо представления по умолчанию, подобного LISP.
- ‘raw’
Вывести исходное представление дерева. По умолчанию деревья форматируются в представление, подобное C.
- ‘details’
Включить более подробные выводы (не учитываются всеми параметрами вывода). Также включать информацию из оптимизационных проходов.
- ‘stats’
Включить вывод различной статистики о проходе (не учитывается всеми параметрами вывода).
- ‘blocks’
Включить отображение границ базовых блоков (отключено в исходных выводах).
- ‘graph’
-
Для каждого из указанных файлов вывода (-fdump-rtl-pass), вывести представление графа потока управления, пригодное для просмотра с помощью GraphViz, в file.passid.pass.dot. Каждая функция в файле отображается как подграф, чтобы GraphViz мог отобразить все их на одном графике.
Этот параметр в настоящее время работает только для вывода RTL, и RTL всегда выводится в сжатой форме.
- ‘vops’
Включить отображение виртуальных операндов для каждого оператора.
- ‘lineno’
Включить отображение номеров строк для операторов.
- ‘uid’
Включить отображение уникального идентификатора (
DECL_UID) для каждой переменной.- ‘verbose’
Включить вывод дерева для каждого оператора.
- ‘eh’
Включить отображение номера области EH, содержащего каждый оператор.
- ‘scev’
Включить отображение деталей анализа скалярной эволюции.
- ‘optimized’
Включить отображение информации об оптимизации (доступно только в определенных проходах).
- ‘missed’
Включить отображение информации об пропущенной оптимизации (доступно только в определенных проходах).
- ‘note’
Включить другую подробную информацию об оптимизации (доступно только в определенных проходах).
- ‘all’
Включить все параметры, кроме raw, slim, verbose и lineno.
- ‘optall’
Включить все параметры оптимизации, т.е. optimized, missed и note.
Для определения доступных выводов дерева или поиска вывода для интересующего прохода, выполните следующие действия:
- Вызовите GCC с параметром -fdump-passes и в выводе stderr найдите код, соответствующий интересующему вас проходу. Например, коды
tree-evrp,tree-vrp1, иtree-vrp2соответствуют трём проходам распространения диапазона значений. Цифра в конце отличает разные вызовы одного и того же прохода. - Чтобы включить создание файла вывода, добавьте код прохода к префиксу параметра -fdump- и вызовите GCC с ним. Например, для включения вывода из прохода раннего распространения диапазона значений, вызовите GCC с параметром -fdump-tree-evrp. Необязательно, можно указать имя файла вывода. Если вы его не укажете, GCC создаст его, как описано ниже.
- Найдите вывод прохода в файле, имя которого состоит из трёх компонентов, разделённых точкой: имя исходного файла, который GCC вызывается для компиляции, числовой суффикс, указывающий номер прохода, за которым следует буква ‘t’ для проходов дерева (и буква ‘r’ для проходов RTL), и, наконец, код прохода. Например, вывод прохода раннего VRP может быть в файле с именем myfile.c.038t.evrp в текущей рабочей директории. Обратите внимание, что числовые коды нестабильны и могут изменяться от одной версии GCC к другой.
-fopt-info-fopt-info-options-fopt-info-options=filename
-
Управляет выводом оптимизационных дампов из различных оптимизационных проходов. Если используется форма ‘-options’, options — это список ключевых слов опций, разделённых ‘-’, для выбора деталей дампа и оптимизаций.
options можно разделить на три группы:
- опции, описывающие, какие виды сообщений должны быть выведены,
- опции, описывающие подробность вывода дампа, и
- опции, описывающие, какие оптимизации должны быть включены.
Опции из каждой группы могут быть свободно смешаны, так как они не перекрываются. Однако, в случае конфликтов, последующие опции на командной строке переопределяют предыдущие.
Следующие опции управляют видами сообщений, которые должны быть выведены:
- ‘optimized’
Выводит информацию, когда оптимизация успешно применена. Решать, какая информация релевантна, должен каждый проход. Например, проходы векторизации выведут расположение в исходном коде циклов, которые успешно векторизованы.
- ‘missed’
Выводит информацию об упущенных оптимизациях. Индивидуальные проходы контролируют, какую информацию включить в вывод.
- ‘note’
Выводит подробную информацию об оптимизациях, таких как определённые преобразования, более подробные сообщения о принятых решениях и т. д.
- ‘all’
Выводит подробную информацию об оптимизациях. Включает ‘optimized’, ‘missed’ и ‘note’.
Следующая опция управляет подробностью вывода дампа:
- ‘internals’
По умолчанию выводятся только сообщения высокого уровня. Эта опция включает дополнительные, более подробные сообщения, которые, вероятно, будут интересны только разработчикам GCC.
Одно или несколько из следующих ключевых слов опций могут быть использованы для описания группы оптимизаций:
- ‘ipa’
Включает дампы всех межпроцедурных оптимизаций.
- ‘loop’
Включает дампы всех оптимизаций циклов.
- ‘inline’
Включает дампы всех оптимизаций встраивания.
- ‘omp’
Включает дампы всех оптимизаций OMP (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-save-temps=cwd
-
Постоянно сохраняйте обычные «временные» промежуточные файлы; поместите их в текущую директорию и назовите их на основе исходного файла. Таким образом, компиляция foo.c с -c -save-temps создает файлы foo.i и foo.s, а также foo.o. Это создает файл вывода foo.i после предварительной обработки, даже если компилятор теперь обычно использует интегрированный препроцессор.
При использовании в сочетании с параметром командной строки -x, -save-temps достаточно разумно, чтобы не перезаписывать входной исходный файл тем же расширением, что и промежуточный файл. Соответствующий промежуточный файл можно получить, переименовав исходный файл перед использованием -save-temps.
Если вы вызываете GCC параллельно, компилируя несколько разных исходных файлов, имеющих общее имя базы в разных подкаталогах или один и тот же исходный файл, скомпилированный для нескольких целевых мест вывода, вероятно, разные параллельные компиляторы будут мешать друг другу и перезаписывать временные файлы. Например:
gcc -save-temps -o outdir1/foo.o indir1/foo.c& gcc -save-temps -o outdir2/foo.o indir2/foo.c&
может привести к тому, что foo.i и foo.o будут записаны одновременно обоими компиляторами.
-save-temps=obj-
Постоянно сохраняйте обычные «временные» промежуточные файлы. Если используется параметр -o, временные файлы основаны на объектном файле. Если параметр -o не используется, переключатель -save-temps=obj ведет себя как -save-temps.
Например:
gcc -save-temps=obj -c foo.c gcc -save-temps=obj -c bar.c -o dir/xbar.o gcc -save-temps=obj foobar.c -o dir2/yfoobar
создает foo.i, foo.s, dir/xbar.i, dir/xbar.s, dir2/yfoobar.i, dir2/yfoobar.s и dir2/yfoobar.o.
-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к имени файла вывода компиляции. -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-
Выводит статистику о обработке на фронте перед концом компиляции. Этот параметр поддерживается только front-end компилятором 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
-
Выводит отображение имен каталогов multilib к компиляторным ключам, которые их включают. Имя каталога отделено от ключей символом ‘;’, а каждый ключ начинается с ‘@’ вместо ‘-’, без пробелов между несколькими ключами. Это призвано упростить обработку командной оболочки.
-print-multi-os-directory-
Выводит путь к библиотекам ОС для выбранного multilib, относительно некоторого подкаталога lib. Если библиотеки ОС присутствуют в подкаталоге lib и не используются multilibs, это обычно просто ., если библиотеки ОС присутствуют в подкаталогах 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выводит сообщение об ошибке ‘проблема с установкой, невозможно выполнить cpp0: Нет такого файла или каталога’. Для решения этой проблемы необходимо поместить 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-10.5.0/gcc/Developer-Options.html