1 <Sect1 id="options-debugging">
2 <Title>Debugging the compiler
6 <IndexTerm><Primary>debugging options (for GHC)</Primary></IndexTerm>
10 HACKER TERRITORY. HACKER TERRITORY.
14 <Sect2 id="replacing-phases">
15 <Title>Replacing the program for one or more phases.
19 <IndexTerm><Primary>GHC phases, changing</Primary></IndexTerm>
20 <IndexTerm><Primary>phases, changing GHC</Primary></IndexTerm>
21 You may specify that a different program be used for one of the phases
22 of the compilation system, in place of whatever the driver <Command>ghc</Command> has
23 wired into it. For example, you might want to try a different
25 <Option>-pgm<phase-code><program-name></Option><IndexTerm><Primary>-pgm<phase><stuff>
26 option</Primary></IndexTerm> option to <Command>ghc</Command> will cause it to use <Literal><program-name></Literal>
27 for phase <Literal><phase-code></Literal>, where the codes to indicate the phases are:
33 <ColSpec Align="Left" Colsep="0">
34 <ColSpec Align="Left" Colsep="0">
37 <Entry><Emphasis>code</Emphasis> </Entry>
38 <Entry><Emphasis>phase</Emphasis> </Entry>
44 <Entry> literate pre-processor </Entry>
49 <Entry> C pre-processor (if -cpp only) </Entry>
54 <Entry> Haskell compiler </Entry>
59 <Entry> C compiler</Entry>
64 <Entry> assembler </Entry>
69 <Entry> linker </Entry>
74 <Entry> Makefile dependency generator </Entry>
85 <Sect2 id="forcing-options-through">
86 <Title>Forcing options to a particular phase.
90 <IndexTerm><Primary>forcing GHC-phase options</Primary></IndexTerm>
94 The preceding sections describe driver options that are mostly
95 applicable to one particular phase. You may also <Emphasis>force</Emphasis> a
96 specific option <Option><option></Option> to be passed to a particular phase
97 <Literal><phase-code></Literal> by feeding the driver the option
98 <Option>-opt<phase-code><option></Option>.<IndexTerm><Primary>-opt<phase><stuff>
99 option</Primary></IndexTerm> The codes to indicate the phases are the same as in the
104 So, for example, to force an <Option>-Ewurble</Option> option to the assembler, you
105 would tell the driver <Option>-opta-Ewurble</Option> (the dash before the E is
110 Besides getting options to the Haskell compiler with <Option>-optC<blah></Option>,
111 you can get options through to its runtime system with
112 <Option>-optCrts<blah></Option><IndexTerm><Primary>-optCrts<blah> option</Primary></IndexTerm>.
116 So, for example: when I want to use my normal driver but with my
117 profiled compiler binary, I use this script:
121 exec /local/grasp_tmp3/simonpj/ghc-BUILDS/working-alpha/ghc/driver/ghc \
122 -pgmC/local/grasp_tmp3/simonpj/ghc-BUILDS/working-hsc-prof/hsc \
132 <Sect2 id="dumping-output">
133 <Title>Dumping out compiler intermediate structures
137 <IndexTerm><Primary>dumping GHC intermediates</Primary></IndexTerm>
138 <IndexTerm><Primary>intermediate passes, output</Primary></IndexTerm>
145 <Term><Option>-noC</Option>:</Term>
148 <IndexTerm><Primary>-noC option</Primary></IndexTerm>
149 Don't bother generating C output <Emphasis>or</Emphasis> an interface file. Usually
150 used in conjunction with one or more of the <Option>-ddump-*</Option> options; for
151 example: <Command>ghc -noC -ddump-simpl Foo.hs</Command>
156 <Term><Option>-hi</Option>:</Term>
159 <IndexTerm><Primary>-hi option</Primary></IndexTerm>
160 <Emphasis>Do</Emphasis> generate an interface file. This would normally be used in
161 conjunction with <Option>-noC</Option>, which turns off interface generation;
162 thus: <Option>-noC -hi</Option>.
167 <Term><Option>-dshow-passes</Option>:</Term>
170 <IndexTerm><Primary>-dshow-passes option</Primary></IndexTerm>
171 Prints a message to stderr as each pass starts. Gives a warm but
172 undoubtedly misleading feeling that GHC is telling you what's
178 <Term><Option>-ddump-<pass></Option>:</Term>
181 <IndexTerm><Primary>-ddump-<pass> options</Primary></IndexTerm>
182 Make a debugging dump after pass <Literal><pass></Literal> (may be common enough to
183 need a short form…). You can get all of these at once (<Emphasis>lots</Emphasis> of
184 output) by using <Option>-ddump-all</Option>, or most of them with <Option>-ddump-most</Option>.
185 Some of the most useful ones are:
192 <Term><Option>-ddump-parsed</Option>:</Term>
200 <Term><Option>-ddump-rn</Option>:</Term>
209 <Term><Option>-ddump-tc</Option>:</Term>
218 <Term><Option>-ddump-types</Option>:</Term>
221 Dump a type signature for each value defined at the top level
222 of the module. The list is sorted alphabetically.
223 Using <Option>-dppr-debug</Option> dumps a type signature for
224 all the imported and system-defined things as well; useful
225 for debugging the compiler.
231 <Term><Option>-ddump-deriv</Option>:</Term>
239 <Term><Option>-ddump-ds</Option>:</Term>
247 <Term><Option>-ddump-spec</Option>:</Term>
250 output of specialisation pass
255 <Term><Option>-ddump-rules</Option>:</Term>
258 dumps all rewrite rules (including those generated by the specialisation pass)
263 <Term><Option>-ddump-simpl</Option>:</Term>
266 simplifer output (Core-to-Core passes)
271 <Term><Option>-ddump-usagesp</Option>:</Term>
274 UsageSP inference pre-inf and output
279 <Term><Option>-ddump-cpranal</Option>:</Term>
287 <Term><Option>-ddump-stranal</Option>:</Term>
290 strictness analyser output
295 <Term><Option>-ddump-workwrap</Option>:</Term>
298 worker/wrapper split output
303 <Term><Option>-ddump-occur-anal</Option>:</Term>
306 `occurrence analysis' output
311 <Term><Option>-ddump-stg</Option>:</Term>
314 output of STG-to-STG passes
319 <Term><Option>-ddump-absC</Option>:</Term>
322 <Emphasis>un</Emphasis>flattened Abstract C
327 <Term><Option>-ddump-flatC</Option>:</Term>
330 <Emphasis>flattened</Emphasis> Abstract C
335 <Term><Option>-ddump-realC</Option>:</Term>
338 same as what goes to the C compiler
343 <Term><Option>-ddump-asm</Option>:</Term>
346 assembly language from the native-code generator
351 <IndexTerm><Primary>-ddump-all option</Primary></IndexTerm>
352 <IndexTerm><Primary>-ddump-most option</Primary></IndexTerm>
353 <IndexTerm><Primary>-ddump-parsed option</Primary></IndexTerm>
354 <IndexTerm><Primary>-ddump-rn option</Primary></IndexTerm>
355 <IndexTerm><Primary>-ddump-tc option</Primary></IndexTerm>
356 <IndexTerm><Primary>-ddump-deriv option</Primary></IndexTerm>
357 <IndexTerm><Primary>-ddump-ds option</Primary></IndexTerm>
358 <IndexTerm><Primary>-ddump-simpl option</Primary></IndexTerm>
359 <IndexTerm><Primary>-ddump-cpranal option</Primary></IndexTerm>
360 <IndexTerm><Primary>-ddump-workwrap option</Primary></IndexTerm>
361 <IndexTerm><Primary>-ddump-rules option</Primary></IndexTerm>
362 <IndexTerm><Primary>-ddump-usagesp option</Primary></IndexTerm>
363 <IndexTerm><Primary>-ddump-stranal option</Primary></IndexTerm>
364 <IndexTerm><Primary>-ddump-occur-anal option</Primary></IndexTerm>
365 <IndexTerm><Primary>-ddump-spec option</Primary></IndexTerm>
366 <IndexTerm><Primary>-ddump-stg option</Primary></IndexTerm>
367 <IndexTerm><Primary>-ddump-absC option</Primary></IndexTerm>
368 <IndexTerm><Primary>-ddump-flatC option</Primary></IndexTerm>
369 <IndexTerm><Primary>-ddump-realC option</Primary></IndexTerm>
370 <IndexTerm><Primary>-ddump-asm option</Primary></IndexTerm>
375 <Term><Option>-dverbose-simpl</Option> and <Option>-dverbose-stg</Option>:</Term>
378 <IndexTerm><Primary>-dverbose-simpl option</Primary></IndexTerm>
379 <IndexTerm><Primary>-dverbose-stg option</Primary></IndexTerm>
380 Show the output of the intermediate Core-to-Core and STG-to-STG
381 passes, respectively. (<Emphasis>Lots</Emphasis> of output!) So: when we're
385 % ghc -noC -O -ddump-simpl -dverbose-simpl -dcore-lint Foo.hs
392 <Term><Option>-ddump-simpl-iterations</Option>:</Term>
395 <IndexTerm><Primary>-ddump-simpl-iterations option</Primary></IndexTerm>
396 Show the output of each <Emphasis>iteration</Emphasis> of the simplifier (each run of
397 the simplifier has a maximum number of iterations, normally 4). Used
398 when even <Option>-dverbose-simpl</Option> doesn't cut it.
403 <Term><Option>-dppr-{user,debug</Option>}:</Term>
406 <IndexTerm><Primary>-dppr-user option</Primary></IndexTerm>
407 <IndexTerm><Primary>-dppr-debug option</Primary></IndexTerm>
408 Debugging output is in one of several “styles.” Take the printing
409 of types, for example. In the “user” style, the compiler's internal
410 ideas about types are presented in Haskell source-level syntax,
411 insofar as possible. In the “debug” style (which is the default for
412 debugging output), the types are printed in with
413 explicit foralls, and variables have their unique-id attached (so you
414 can check for things that look the same but aren't).
419 <Term><Option>-ddump-simpl-stats</Option>:</Term>
422 <IndexTerm><Primary>-ddump-simpl-stats option</Primary></IndexTerm>
423 Dump statistics about how many of each kind
424 of transformation too place. If you add <Option>-dppr-debug</Option> you get more detailed information.
429 <Term><Option>-ddump-raw-asm</Option>:</Term>
432 <IndexTerm><Primary>-ddump-raw-asm option</Primary></IndexTerm>
433 Dump out the assembly-language stuff, before the “mangler” gets it.
438 <Term><Option>-ddump-rn-trace</Option>:</Term>
441 <IndexTerm><Primary>-ddump-rn-trace</Primary></IndexTerm>
442 Make the renamer be *real* chatty about what it is upto.
447 <Term><Option>-dshow-rn-stats</Option>:</Term>
450 <IndexTerm><Primary>-dshow-rn-stats</Primary></IndexTerm>
451 Print out summary of what kind of information the renamer had to bring
457 <Term><Option>-dshow-unused-imports</Option>:</Term>
460 <IndexTerm><Primary>-dshow-unused-imports</Primary></IndexTerm>
461 Have the renamer report what imports does not contribute.
470 <Sect2 id="checking-consistency">
471 <Title>Checking for consistency
475 <IndexTerm><Primary>consistency checks</Primary></IndexTerm>
476 <IndexTerm><Primary>lint</Primary></IndexTerm>
483 <Term><Option>-dcore-lint</Option>:</Term>
486 <IndexTerm><Primary>-dcore-lint option</Primary></IndexTerm>
487 Turn on heavyweight intra-pass sanity-checking within GHC, at Core
488 level. (It checks GHC's sanity, not yours.)
493 <Term><Option>-dstg-lint</Option>:</Term>
496 <IndexTerm><Primary>-dstg-lint option</Primary></IndexTerm>
502 <Term><Option>-dusagesp-lint</Option>:</Term>
505 <IndexTerm><Primary>-dstg-lint option</Primary></IndexTerm>
506 Turn on checks around UsageSP inference (<Option>-fusagesp</Option>). This verifies
507 various simple properties of the results of the inference, and also
508 warns if any identifier with a used-once annotation before the
509 inference has a used-many annotation afterwards; this could indicate a
510 non-worksafe transformation is being applied.
520 <Title>How to read Core syntax (from some <Option>-ddump-*</Option> flags)</Title>
523 <IndexTerm><Primary>reading Core syntax</Primary></IndexTerm>
524 <IndexTerm><Primary>Core syntax, how to read</Primary></IndexTerm>
528 Let's do this by commenting an example. It's from doing
529 <Option>-ddump-ds</Option> on this code:
532 skip2 m = m : skip2 (m+2)
538 Before we jump in, a word about names of things. Within GHC,
539 variables, type constructors, etc., are identified by their
540 “Uniques.” These are of the form `letter' plus `number' (both
541 loosely interpreted). The `letter' gives some idea of where the
542 Unique came from; e.g., <Literal>_</Literal> means “built-in type variable”;
543 <Literal>t</Literal> means “from the typechecker”; <Literal>s</Literal> means “from the
544 simplifier”; and so on. The `number' is printed fairly compactly in
545 a `base-62' format, which everyone hates except me (WDP).
549 Remember, everything has a “Unique” and it is usually printed out
550 when debugging, in some form or another. So here we go…
556 Main.skip2{-r1L6-} :: _forall_ a$_4 =>{{Num a$_4}} -> a$_4 -> [a$_4]
558 --# `r1L6' is the Unique for Main.skip2;
559 --# `_4' is the Unique for the type-variable (template) `a'
560 --# `{{Num a$_4}}' is a dictionary argument
564 --# `_NI_' means "no (pragmatic) information" yet; it will later
565 --# evolve into the GHC_PRAGMA info that goes into interface files.
568 /\ _4 -> \ d.Num.t4Gt ->
571 +.t4Hg :: _4 -> _4 -> _4
573 +.t4Hg = (+{-r3JH-} _4) d.Num.t4Gt
575 fromInt.t4GS :: Int{-2i-} -> _4
577 fromInt.t4GS = (fromInt{-r3JX-} _4) d.Num.t4Gt
579 --# The `+' class method (Unique: r3JH) selects the addition code
580 --# from a `Num' dictionary (now an explicit lamba'd argument).
581 --# Because Core is 2nd-order lambda-calculus, type applications
582 --# and lambdas (/\) are explicit. So `+' is first applied to a
583 --# type (`_4'), then to a dictionary, yielding the actual addition
584 --# function that we will use subsequently...
586 --# We play the exact same game with the (non-standard) class method
587 --# `fromInt'. Unsurprisingly, the type `Int' is wired into the
597 } in fromInt.t4GS ds.d4Qz
599 --# `I# 2#' is just the literal Int `2'; it reflects the fact that
600 --# GHC defines `data Int = I# Int#', where Int# is the primitive
601 --# unboxed type. (see relevant info about unboxed types elsewhere...)
603 --# The `!' after `I#' indicates that this is a *saturated*
604 --# application of the `I#' data constructor (i.e., not partially
607 skip2.t3Ja :: _4 -> [_4]
611 let { ds.d4QQ :: [_4]
617 ds.d4QY = +.t4Hg m.r1H4 lit.t4Hb
618 } in skip2.t3Ja ds.d4QY
628 (“It's just a simple functional language” is an unregisterised
629 trademark of Peyton Jones Enterprises, plc.)
634 <Sect2 id="source-file-options">
635 <Title>Command line options in source files
639 <IndexTerm><Primary>source-file options</Primary></IndexTerm>
643 Sometimes it is useful to make the connection between a source file
644 and the command-line options it requires quite tight. For instance,
645 if a (Glasgow) Haskell source file uses <Literal>casm</Literal>s, the C back-end
646 often needs to be told about which header files to include. Rather than
647 maintaining the list of files the source depends on in a
648 <Filename>Makefile</Filename> (using the <Option>-#include</Option> command-line option), it is
649 possible to do this directly in the source file using the <Literal>OPTIONS</Literal>
650 pragma <IndexTerm><Primary>OPTIONS pragma</Primary></IndexTerm>:
655 {-# OPTIONS -#include "foo.h" #-}
663 <Literal>OPTIONS</Literal> pragmas are only looked for at the top of your source
664 files, upto the first (non-literate,non-empty) line not containing
665 <Literal>OPTIONS</Literal>. Multiple <Literal>OPTIONS</Literal> pragmas are recognised. Note
666 that your command shell does not get to the source file options, they
667 are just included literally in the array of command-line arguments
668 the compiler driver maintains internally, so you'll be desperately
669 disappointed if you try to glob etc. inside <Literal>OPTIONS</Literal>.
673 NOTE: the contents of OPTIONS are prepended to the command-line
674 options, so you *do* have the ability to override OPTIONS settings
675 via the command line.
679 It is not recommended to move all the contents of your Makefiles into
680 your source files, but in some circumstances, the <Literal>OPTIONS</Literal> pragma
681 is the Right Thing. (If you use <Option>-keep-hc-file-too</Option> and have OPTION
682 flags in your module, the OPTIONS will get put into the generated .hc
691 ;;; Local Variables: ***
693 ;;; sgml-parent-document: ("users_guide.sgml" "book" "chapter" "sect1") ***