Spec-Zone.ru › Haskell 9

5.13. Отладка компилятора

ТЕРРИТОРИЯ ХАКЕРОВ. ТЕРРИТОРИЯ ХАКЕРОВ. (Вас предупреждали.)

Флаги дампа

  • Отладка компилятора

    • Вывод промежуточных структур компилятора

      • Фронтенд
      • Проверка типов и переименование
      • Представление Core и упрощение
      • Представление STG
      • Представление C-\-
      • Генератор кода LLVM
      • Генератор кода C
      • Генератор машинного кода
      • Генератор кода JavaScript
      • Различные дампы бэкенда
    • Форматирование дампов
    • Сокрытие ненужной информации
    • Проверка согласованности
    • Проверка детерминированности
    • Прочее

5.13.1. Вывод промежуточных структур компилятора

-ddump-to-file

Вывод для каждого из флагов, начинающихся с «-ddump», записывается в один или несколько файлов. Если нужно сохранить весь вывод для одного флага в одном файле, используйте -ddump-file-prefix=⟨str⟩ (см. описания ниже). В противном случае вывод будет записан в несколько файлов: один для данных, не относящихся к конкретному модулю, и несколько для данных по модулям. Суффикс файла дампа зависит от включённого флага: например, вывод -ddump-simpl будет записан в prefix.dump-simpl.

-ddump-file-prefix=⟨str⟩

Задаёт префикс имён файлов, используемых для отладочного вывода. Например, -ddump-file-prefix=Foo приведёт к тому, что вывод -ddump-simpl будет записан в Foo.dump-simpl.

-fdump-with-ways
По умолчанию:

включено

При компиляции Main.hs с профилированием и без него будут создаваться Main.p.dump-simpl и Main.dump-simpl вместо перезаписи вывода одного режима выводом другого.

-ddump-json

Ранее этот флаг использовался для создания диагностики GHC в формате JSON, но теперь он устарел. Вместо него используйте -fdiagnostics-as-json.

-dshow-passes

Выводит название каждого прохода, затраченное время выполнения и объём выделенной в куче памяти по мере выполнения. Обратите внимание: это может немного снизить производительность, поскольку компилятор будет активнее вычислять результаты проходов, чтобы точнее учитывать затраты.

Выводятся два типа сообщений: сообщения, начинающиеся с ***, обозначают начало фазы компиляции, а сообщения, начинающиеся с !!!, отмечают завершение прохода и сопровождаются статистикой по выделенной памяти и времени выполнения.

-dipe-stats

Для каждого модуля выводит простую статистику о таблицах информации с данными IPE и о количестве таких таблиц для каждого типа замыкания. Это полезно, например, для проверки того, что таблицы информации STACK должным образом исключаются из карты таблиц информации или включаются в неё.

-dfaststring-stats

Выводит статистику использования компилятором быстрых строк.

-ddump-faststrings

По завершении выводит всю таблицу FastString. Чтобы записать её в файл, можно использовать -ddump-file-prefix=⟨str⟩.

-dppr-debug

Для отладочного вывода используются различные «стили». Рассмотрим, например, вывод типов. В стиле «user» (по умолчанию) внутренние представления типов в компиляторе по возможности отображаются в синтаксисе исходного кода Haskell. В стиле «debug» (по умолчанию используется для отладочного вывода) типы печатаются с явными forall, а к переменным добавляется их уникальный идентификатор (чтобы можно было различать сущности, которые выглядят одинаково, но таковыми не являются). Этот флаг включает более подробный стиль «debug» для отладочного вывода.

-ddump-timings

Выводит статистику по объёму выделенной памяти и времени выполнения для различных этапов компиляции. Объём выделенной памяти измеряется в байтах, время — в миллисекундах.

GHC — большая программа, состоящая из нескольких этапов. С помощью перечисленных ниже флагов -ddump-⟨pass⟩ можно вывести сведения о различных этапах компиляции. Обратите внимание, что некоторые из них могут создавать очень большой объём вывода. Чтобы он не засорял стандартный вывод, передайте -ddump-to-file.

5.13.1.1. Внешний интерфейс

Эти флаги выводят различную информацию о внешнем интерфейсе GHC, включая парсер и средство чтения файлов интерфейса.

-ddump-parsed

Вывести результат работы парсера

-ddump-parsed-ast

Вывести результат работы парсера в виде синтаксического дерева

-dkeep-comments

Включать комментарии в результат работы парсера. Полезно в сочетании с -ddump-parsed-ast.

-ddump-if-trace

Заставляет загрузчик интерфейсов очень подробно сообщать о своих действиях.

5.13.1.2. Проверка типов и переименование

Эти флаги выводят различную информацию о проверяющем типы и переименовывающем компонентах GHC.

-ddump-tc-trace

Заставляет проверяющий типы компонент очень подробно сообщать о своих действиях.

-ddump-rn-trace

Заставляет переименовывающий компонент очень подробно сообщать о своих действиях.

-ddump-ec-trace

Заставляет проверяющий полноту сопоставления с образцом компонент очень подробно сообщать о своих действиях.

-ddump-cs-trace

Заставляет решатель ограничений очень подробно сообщать о своих действиях.

-ddump-rn-stats

Выводит сводку о том, какие сведения пришлось загрузить переименовывающему компоненту.

-ddump-rn

Вывести результат работы переименовывающего компонента

-ddump-rn-ast

Вывести результат работы переименовывающего компонента в виде синтаксического дерева

-ddump-tc

Вывести результат работы проверяющего типы компонента. По умолчанию значительная часть подробностей скрыта; для их отображения можно использовать этот флаг вместе с -fprint-typechecker-elaboration.

-ddump-tc-ast

Вывести результат работы проверяющего типы компонента в виде синтаксического дерева

-ddump-hie

Вывести синтаксическое дерево файла hie, если создаются расширенные файлы интерфейса

-ddump-splices

Вывести выражения Template Haskell, вставляемые в код, и код Haskell, в который вычисляется каждое выражение.

-dth-dec-file

Вывести развёртки всех вставок Template Haskell верхнего уровня в module.th.hs для каждого файла module.hs.

-ddump-types

Вывести сигнатуру типа для каждого значения, определённого на верхнем уровне модуля. Список упорядочен по алфавиту. При использовании -dppr-debug также выводятся сигнатуры типов всех импортированных и системных сущностей; это полезно для отладки компилятора.

-ddump-deriv

Вывести производные экземпляры

5.13.1.3. Представление Core и упрощение

Эти флаги выводят данные о различных этапах конвейера GHC Core-to-Core. Конвейер начинается с десахаризатора и включает упрощатель, преобразование worker-wrapper, механизм правил, специализатор, анализаторы строгости и вхождений, а также проход устранения общих подвыражений.

-ddump-call-arity

Вывести результат прохода анализа арности вызовов (-fcall-arity).

-ddump-core-stats

Вывести однострочную сводку о размере программы Core в конце конвейера оптимизации.

-ddump-ds
-ddump-ds-preopt

Вывести результат работы десахаризатора. -ddump-ds выводит результат после выполнения очень простого оптимизатора (который удаляет много лишнего и поэтому разумно включён по умолчанию). -ddump-ds-preopt выводит результат после десахаризации, но до запуска очень простого оптимизатора.

-ddump-exitify

Вывести результат прохода exitification (-fexitification), который пытается извлечь код из рекурсивных функций.

-ddump-simpl-iterations

Показывать результат каждой итерации упрощателя (для каждого запуска упрощателя задано максимальное число итераций, обычно равное 4).

-ddump-simpl-stats

Вывести статистику о количестве выполненных преобразований каждого типа. Если добавить -dppr-debug, будет выведена более подробная информация.

-ddump-simpl-trace

Вывести трассировочные сообщения различных функций упрощателя. Создаёт довольно большой объём вывода.

-dverbose-core2core

Показывать результат промежуточного прохода Core-to-Core (очень много вывода!). Используйте этот флаг, когда ситуация совсем безнадёжна:

% ghc -noC -O -ddump-simpl -dverbose-core2core -dcore-lint Foo.hs
-ddump-spec

Вывести результат прохода специализации классов типов

-ddump-spec-constr
Начиная с версии:

9.8.1

Вывести результат прохода специализации SpecConstr

-ddump-rules

Вывести все правила переписывания, заданные в этом модуле; см. раздел Управление ходом применения правил переписывания.

-ddump-rule-firings

Вывести названия всех правил, сработавших в этом модуле

-ddump-rule-rewrites

Вывести подробную информацию обо всех правилах, сработавших в этом модуле

-drule-check=⟨str⟩

Этот флаг полезен для выяснения, почему ожидаемое правило не срабатывает.

Правила фильтруются по заданной пользователем строке: правило сохраняется, если его имя начинается с этой строки. Затем проход проверяет, могут ли какие-либо из этих правил применяться к программе, но не сработали по какой-либо причине. Например, указание -drule-check=SPEC позволит проверить, есть ли вызовы, к которым могло бы примениться правило, созданное специализацией.

-dinline-check=⟨str⟩

Этот флаг полезен для выяснения, почему определение не встраивается.

Если передать этому флагу строку, будут выведены сведения обо всех функциях, имена которых начинаются с этой строки.

Например, при изучении Core вашей программы вы заметили, что foo не встраивается. Передайте -dinline-check foo, и вы увидите отчёт о том, почему foo не встраивается.

-ddump-simpl

Вывести результат работы упрощателя (проходы Core-to-Core)

-ddump-inlinings

Вывести сведения о встраиваниях, выполненных упрощателем.

-ddump-verbose-inlinings

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

-ddump-stranal

Переименован в -ddump-dmdanal.

-ddump-dmdanal

Вывести результат анализа спроса.

Синтаксис и семантику аннотаций спроса см. в описании -fstrictness.

-ddump-str-signatures

Переименован в -ddump-dmd-signatures.

-ddump-dmd-signatures

Вывести сигнатуры спроса верхнего уровня, полученные в результате анализа спроса.

Синтаксис и семантику аннотаций спроса см. в описании -fstrictness.

-ddump-cpranal

Вывести результат анализа Constructed Product Result

-ddump-cpr-signatures

Вывести сигнатуры Constructed Product Result

-ddump-cse

Вывести результат прохода устранения общих подвыражений (CSE)

-ddump-full-laziness
-ddump-float-out

Вывести результат прохода полной ленивости (также известного как float-out); см. -ffull-laziness.

-ddump-float-in

Вывести результат прохода float-in; см. -ffloat-in.

-ddump-liberate-case

Вывести результат прохода liberate-case; см. -fliberate-case.

-ddump-static-argument-transformation

Вывести результат прохода преобразования статических аргументов; см. -fstatic-argument-transformation.

-ddump-worker-wrapper

Вывести результат разделения worker/wrapper

-ddump-occur-anal

Вывести результат «анализа вхождений»

-ddump-prep

Вывести результат прохода подготовки Core

-ddump-late-cc

Вывести результат прохода LateCC после добавления центров затрат.

-ddump-view-pattern-commoning

Вывести объединяемые шаблоны-представления.

5.13.1.4. Представление STG

Эти флаги выводят данные о различных этапах конвейера STG в GHC.

-ddump-stg-from-core

Показать результат прохода CoreToStg.

-dverbose-stg2stg

Показать результат промежуточного прохода STG-to-STG (очень много вывода!).

-ddump-stg-unarised

Показать результат прохода unarise.

-ddump-stg-cg

Показать результат работы прохода Stg2Stg над STG. Это результат применения оптимизационных проходов Stg2Stg.

-ddump-stg-tags

Показать результат прохода вывода тегов.

-ddump-stg-final

Показать результат последнего прохода STG перед генерацией Cmm.

-ddump-stg

Псевдоним для -ddump-stg-from-core. Устарел; вместо него рекомендуется использовать более конкретные флаги: -ddump-stg-from-core, -ddump-stg-final и т. д.

-ddump-stg-from-js-sinker

Показать результат прохода JavaScript Sinker.

5.13.1.5. Представление C-\-

Эти флаги выводят данные о различных этапах конвейера C-\- в GHC.

-ddump-cmm-verbose-by-proc

Вывести данные основных этапов конвейера C-\-. При компиляции .cmm также выводится результат разбора файла. Проходы, выполняемые выбранной серверной частью, не включаются. В настоящее время дополнительные проходы выполняют только серверные части NCG (-ddump-opt-cmm).

Дампы Cmm не содержат недостижимые блоки, поскольку блоки выводятся в обратном постпорядке.

-ddump-cmm-verbose

При использовании вместе с -ddump-to-file записывает дампы основных этапов конвейера C-\- в файлы (отдельный файл для каждого этапа).

-ddump-cmm-from-stg

Вывести результат преобразования STG в C-\-

-ddump-cmm-raw

Вывести «сырой» C-\-.

-ddump-cmm-cfg

Вывести результаты прохода оптимизации потока управления C-\-.

-ddump-cmm-thread-sanitizer

Вывести результаты прохода C-\-, отвечающего за добавление инструментирования, включаемого флагом -fcmm-thread-sanitizer.

-ddump-cmm-cbe

Вывести результаты прохода устранения общих блоков C-\- (CBE).

-ddump-cmm-switch

Вывести результаты прохода понижения конструкций switch в C-\-.

-ddump-cmm-proc

Вывести результаты прохода анализа точек процедур C-\-.

-ddump-cmm-sp

Вывести результаты прохода раскладки стека C-\-.

-ddump-cmm-sink

Вывести результаты прохода перемещения вниз C-\-.

-ddump-cmm-caf

Вывести результаты прохода анализа CAF в C-\-.

-ddump-cmm-procmap

Вывести результаты прохода построения карты точек процедур C-\-.

-ddump-cmm-split

Вывести результаты прохода разделения по точкам процедур C-\-.

-ddump-cmm-info

Вывести результаты прохода дополнения таблиц информации C-\-.

-ddump-cmm-cps

Вывести результаты прохода CPS.

-ddump-cmm

Вывести результат обработки конвейером C-\-

-ddump-cfg-weights

Вывести граф потока управления (CFG) с весами, используемыми новым кодом раскладки блоков. Каждый CFG выводится в формате dot, что упрощает его визуализацию.

5.13.1.6. Генератор кода LLVM

-ddump-llvm
Включает:

-fllvm

Код LLVM, созданный генератором кода LLVM

5.13.1.7. Генератор кода C

-ddump-c-backend
Краткое описание:

Вывести код C, созданный серверной частью C (без регистрации).

5.13.1.8. Генератор машинного кода

Эти флаги выводят данные о различных этапах конвейера генератора машинного кода, который принимает C-\- и создаёт машинный ассемблерный код.

-ddump-cmm-opt

Вывести результаты оптимизирующих проходов преобразования C-\- в C-\-, выполняемых NCG.

-ddump-opt-cmm

Псевдоним для -ddump-cmm-opt

-ddump-asm-conflicts

Вывести конфликты (виртуальных) регистров («пересечения») для распределителя регистров методом раскраски графа (-fregs-graph).

-ddump-asm-native

Вывести исходный ассемблерный код, созданный из C-\-.

-ddump-asm-liveness

Вывести результат прохода анализа живости регистров.

-ddump-asm-regalloc

Вывести результат прохода распределения регистров.

-ddump-asm-regalloc-stages

Вывести этапы построения и выгрузки регистров распределителя регистров методом раскраски графа (-fregs-graph).

-ddump-asm-stats

Вывести статистику распределителя регистров.

-ddump-asm

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

-ddump-js

Вывести окончательный код JavaScript, созданный генератором кода JavaScript.

5.13.1.9. Генератор кода JavaScript

-ddisable-js-minifier

Добавлять пробелы и отступы для удобства чтения при генерации JavaScript.

-ddisable-js-c-sources

При отладке может быть полезно отключить связывание с исходными файлами C, скомпилированными в JavaScript с помощью Emscripten. Это также отключает связывание с RTS Emscripten. Обратите внимание: код, вызывающий этот код C или использующий примитивы Emscripten, завершится с ошибкой во время выполнения (например, из-за неопределённых функций).

5.13.1.10. Различные дампы бэкендов

Эти флаги выводят различные сведения из других бэкендов.

-ddump-bcos

Вывести объекты байт-кода (BCO), созданные для интерпретатора байт-кода GHC.

-ddump-debug

Вывести сгенерированную отладочную информацию (DWARF), полученную с помощью флага -g.

-ddump-rtti

Отслеживать вывод типов во время выполнения, выполняемый различными командами интерпретатора.

-ddump-foreign

Вывести заглушки экспорта внешних функций.

-ddump-ticked

Вывести код, инструментированный HPC (Наблюдение за покрытием кода).

-ddump-hpc

Псевдоним для -ddump-ticked.

-ddump-mod-map

Вывести сопоставление модулей с источниками и способами их получения:

  • (hidden module): Модуль скрыт и поэтому никогда не будет доступен для импорта.
  • (unusable module): Модуль недоступен, поскольку пакет непригоден для использования.
  • (hidden package): Этот модуль есть в списке экспортируемых модулей некоторого пакета, но сам пакет скрыт.
  • (exposed package): Модуль доступен для импорта.
  • (reexport by <PACKAGES>): Этот модуль доступен через реэкспорт из набора открытых пакетов.
  • (hidden reexport by <PACKAGES>): Этот модуль доступен через реэкспорт из набора скрытых пакетов.
  • (package flag): Этот модуль экспортируется с помощью флага пакета.

5.13.2. Форматирование дампов

-dppr-user-length

В сообщениях об ошибках выражения выводятся до определённой «глубины», а подвыражения, выходящие за её пределы, заменяются многоточиями. Этот флаг задаёт глубину. Значение по умолчанию — 5.

-dppr-cols=⟨n⟩

Задать ширину отладочного вывода. Используйте этот флаг, если строки кода слишком часто переносятся. Например: -dppr-cols=200.

-dppr-case-as-let

Выводить выражения case с единственной альтернативой так, как если бы они были строгими выражениями let. Это полезно, если код часто выполняет распаковку.

-dhex-word-literals

Выводить значения типов Word# и Word64# (но не значения типов Int# и Int64#) в шестнадцатеричном, а не десятичном формате. Шестнадцатеричное представление дополняется нулями до длины, равной степени двойки. Например: 0x0A0A##, 0x000FFFFF##, 0xC##. Этот флаг может быть полезен, если вы формируете битовый шаблон, который должен корректно работать на 32- или 64-разрядной архитектуре. Вывод шестнадцатеричных литералов после оптимизаций и свёртки констант упрощает проверку корректности сгенерированного битового шаблона.

-dno-debug-output

Подавить весь непредусмотренный отладочный вывод. Если GHC собран с параметром DEBUG, иногда он выводит отладочную информацию, представляющую интерес для разработчиков. Дополнительный вывод может сбивать с толку тестовую инфраструктуру и приводить к ложным сбоям тестов, поэтому этот флаг позволяет его отключить.

5.13.3. Подавление ненужной информации

Дампы Core содержат большой объём информации. В зависимости от выполняемой задачи не вся она будет полезна. Используйте эти флаги, чтобы подавить неинтересующие вас части.

-dsuppress-all

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

-dsuppress-ticks

Подавить «тики» в выводе форматтера.

-dsuppress-uniques

Подавить вывод уникальных идентификаторов. Из-за этого вывод может стать неоднозначным (например, будет непонятно, где привязано вхождение «x»), но в выводе двух запусков компилятора станет гораздо меньше несущественных различий, так что можно будет применить diff. Когда diff покажет, где искать, попробуйте выполнить команду ещё раз без -dsuppress-uniques

-dsuppress-idinfo

Подавить расширенную информацию об идентификаторах в местах их привязки. Она включает сведения о строгости и шаблоны инлайнера. Использование этого флага может вдвое уменьшить размер дампа Core за счёт исключения шаблонов инлайнера

-dsuppress-unfoldings

Подавить вывод стабильного развёртывания переменной в месте её привязки.

-dsuppress-module-prefixes

Подавить вывод префиксов квалификаторов модулей. Это Data.List в Data.List.length.

-dsuppress-timestamps

Подавить вывод временных меток. Это упрощает сравнение дампов.

-dsuppress-type-signatures

Подавить вывод сигнатур типов.

-dsuppress-type-applications

Подавить вывод применений типов.

-dsuppress-coercions

Подавить вывод преобразований типов.

-dsuppress-coercion-types
-dsuppress-var-kinds

Подавить вывод видов переменных

-dsuppress-stg-free-vars

Подавить вывод списков свободных переменных замыканий в выводе STG

-dsuppress-core-sizes
Начиная с:

9.4.1

Подавить вывод статистики размера Core для каждой привязки

-dsuppress-stg-reps
Начиная с:

9.6.1

по умолчанию: включено

Отключение этого параметра приводит к аннотированию некоторых аргументов STG их prim rep.

5.13.4. Проверка согласованности

-dlint
Включает:

-dcore-lint, -dstg-lint, -dcmm-lint, -dasm-lint, -fllvm-fill-undef-with-garbage, -fcatch-nonexhaustive-cases, -debug

Начиная с:

9.4.1

Включить различные ресурсоёмкие проверки корректности между проходами в GHC и его системе времени выполнения. В частности, этот флаг не включает -falignment-sanitisation, поскольку он влечёт значительные затраты во время выполнения.

-dcore-lint

Включить ресурсоёмкие проверки корректности между проходами в GHC на уровне Core. (Проверяется корректность GHC, а не вашего кода.)

-dlinear-core-lint

Включить проверку линейности в GHC. В настоящее время некоторые оптимизации GHC могут нарушать линейность, и существуют корректные программы, которые не проходят проверку Linear Core Lint. В ближайшем будущем этот параметр будет удалён и включён в обычную проверку Core Lint.

-dstg-lint

То же самое для уровня STG.

-dcmm-lint

То же самое для уровня C-\-.

-dasm-lint

Включить проверки корректности между проходами в GHC на уровне генератора кода.

-fllvm-fill-undef-with-garbage

Указать генератору кода LLVM заполнять мёртвые регистры STG мусорными данными вместо undef в вызовах. Это упрощает обнаружение трудноуловимых ошибок генератора кода и системы времени выполнения (например, см. #11487).

-falignment-sanitisation

Компилировать с проверками выравнивания для всех разыменований информационных таблиц. Это может быть полезно при поиске проблем с тегированием указателей.

-fproc-alignment
Начиная с:

8.6.1

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

-fproc-alignment=64 можно использовать, чтобы ограничить влияние выравнивания на производительность, поскольку каждая функция будет начинаться с границы строки кэша. Однако принудительное увеличение выравнивания в целом снижает производительность.

-fcatch-nonexhaustive-cases

В некоторых случаях GHC генерирует выражения case без альтернативы по умолчанию:

  • Когда анализ спроса предполагает, что выражение, по которому выполняется сопоставление, не возвращает управление (то есть является завершающимся снизу выражением)
  • Когда выражение, по которому выполняется сопоставление, имеет тип GADT, его тип исключает некоторые конструкторы, а остальные уже обработаны выражением case.

С этим флагом в таких случаях GHC генерирует альтернативу по умолчанию с error. Это полезно при отладке ошибок анализа спроса или проверки типов, которые иногда могут проявляться в виде ошибок сегментации.

-forig-thunk-info

При отладке циклических thunk полезно знать исходную информационную таблицу вычисляемого thunk. Этот флаг включает логику генерации кода, необходимую для этого: вместе с обычным кадром обновления создаётся кадр стека stg_orig_thunk_info; такие кадры orig_thunk не влияют на выполнение, но сохраняют исходную информационную таблицу обновляемого thunk для анализа отладочными инструментами. Подробности см. в Note [Original thunk info table frames] в GHC.StgToCmm.Bind.

-fcheck-prim-bounds

Операции primops, такие как writeArray#, обычно ведут себя небезопасно, полагаясь на то, что пользователь сам выполнит проверку границ. Этот флаг указывает генератору кода инструментировать такие операции проверкой границ, которая прерывает программу при обнаружении выхода за границы.

Обратите внимание, что этот флаг предназначен только для отладки, а не для использования в качестве основного средства обнаружения обращений за пределы границ.

-fcmm-thread-sanitizer

Включает генерацию инструментирования обращений к памяти для ThreadSanitizer <https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual>. При компиляции и компоновке требуется использовать -fsanitize=thread или аналогичный параметр.

5.13.5. Проверка детерминированности

-dinitial-unique=⟨s⟩

Начать выделение UniqSupply с ⟨s⟩.

-dunique-increment=⟨i⟩

Задать приращение для генерируемых Unique равным ⟨i⟩.

Это полезно в сочетании с -dinitial-unique=⟨s⟩ для проверки того, зависят ли сгенерированные файлы от порядка Unique.

Некоторые интересные значения:

  • -dinitial-unique=0 -dunique-increment=1 — текущий последовательный UniqSupply
  • -dinitial-unique=16777215 -dunique-increment=-1 — UniqSupply, генерирующий значения в убывающем порядке
  • -dinitial-unique=1 -dunique-increment=PRIME — если PRIME достаточно велико, чтобы часто происходило переполнение, порядок будет непоследовательным

5.13.6. Прочее

-dno-typeable-binds

Отключает генерацию привязок, связанных с Typeable, для модулей и типов. Это полезно при отладке, поскольку уменьшает размер модулей и дампов, но компилятор завершится с аварийной ошибкой, если вы попытаетесь использовать экземпляры Typeable для сущностей, собранных с этим флагом.

-dtag-inference-checks

Если вывод тегов указывает, что определённое значение должно быть помечено тегом, генерировать код для проверки этого во время выполнения. При неудачной проверке программа завершится. Это помогает выяснить, связана ли проблема с выводом тегов, если что-то пошло не так. В противном случае это может быть довольно сложно сделать.

-funoptimized-core-for-interpreter
Начиная с:

9.8.1

По умолчанию:

включено

В настоящее время ghci отключает оптимизации, поскольку не все проходы совместимы с интерпретатором. Этот параметр позволяет обойти эту проверку, например, ghci -O2 -fno-unoptimized-core-for-interpreter. Не рекомендуется использовать его в обычных условиях: он может привести к аварийному завершению компилятора.

Обратите внимание, что это влияет на интерфейс отладчика: при включённых оптимизациях свободные переменные в точках останова могут заменяться сложными выражениями. Такие выражения нельзя сохранить в точках останова, поэтому при включённом флаге невозможно будет исследовать свободные переменные, относящиеся к оптимизированному коду.

-fadd-bco-name
Начиная с:

9.14.1

Добавлять перед каждым сгенерированным объектом байт-кода инструкцию BCO_NAME, содержащую имя привязки STG, из которой был получен BCO. Дизассемблер байт-кода выводит эти имена, что помогает сопоставлять байт-код с STG.

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.14.1/docs/users_guide/debugging.html

Spec-Zone.ru

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