1 <Sect1 id="options-debugging">
2 <Title>Debugging the compiler
6 <IndexTerm><Primary>debugging options (for GHC)</Primary></IndexTerm>
10 HACKER TERRITORY. HACKER TERRITORY.
15 <Sect2 id="dumping-output">
16 <Title>Dumping out compiler intermediate structures
20 <IndexTerm><Primary>dumping GHC intermediates</Primary></IndexTerm>
21 <IndexTerm><Primary>intermediate passes, output</Primary></IndexTerm>
28 <Term><Option>-hi</Option>:</Term>
31 <IndexTerm><Primary>-hi option</Primary></IndexTerm>
32 <Emphasis>Do</Emphasis> generate an interface file. This would normally be used in
33 conjunction with <Option>-noC</Option>, which turns off interface generation;
34 thus: <Option>-noC -hi</Option>.
39 <Term><Option>-dshow-passes</Option>:</Term>
42 <IndexTerm><Primary>-dshow-passes option</Primary></IndexTerm>
43 Prints a message to stderr as each pass starts. Gives a warm but
44 undoubtedly misleading feeling that GHC is telling you what's
50 <Term><Option>-ddump-<pass></Option>:</Term>
53 <IndexTerm><Primary>-ddump-<pass> options</Primary></IndexTerm>
54 Make a debugging dump after pass <Literal><pass></Literal> (may be common enough to
55 need a short form…). You can get all of these at once (<Emphasis>lots</Emphasis> of
56 output) by using <Option>-ddump-all</Option>, or most of them with <Option>-ddump-most</Option>.
57 Some of the most useful ones are:
64 <Term><Option>-ddump-parsed</Option>:</Term>
73 <Term><Option>-ddump-rn</Option>:</Term>
82 <Term><Option>-ddump-tc</Option>:</Term>
91 <Term><Option>-ddump-types</Option>:</Term>
94 Dump a type signature for each value defined at the top level
95 of the module. The list is sorted alphabetically.
96 Using <Option>-dppr-debug</Option> dumps a type signature for
97 all the imported and system-defined things as well; useful
98 for debugging the compiler.
104 <Term><Option>-ddump-deriv</Option>:</Term>
112 <Term><Option>-ddump-ds</Option>:</Term>
120 <Term><Option>-ddump-spec</Option>:</Term>
123 output of specialisation pass
128 <Term><Option>-ddump-rules</Option>:</Term>
131 dumps all rewrite rules (including those generated by the specialisation pass)
136 <Term><Option>-ddump-simpl</Option>:</Term>
139 simplifer output (Core-to-Core passes)
144 <Term><Option>-ddump-usagesp</Option>:</Term>
147 UsageSP inference pre-inf and output
152 <Term><Option>-ddump-cpranal</Option>:</Term>
160 <Term><Option>-ddump-stranal</Option>:</Term>
163 strictness analyser output
168 <Term><Option>-ddump-workwrap</Option>:</Term>
171 worker/wrapper split output
176 <Term><Option>-ddump-occur-anal</Option>:</Term>
179 `occurrence analysis' output
184 <Term><Option>-ddump-stg</Option>:</Term>
187 output of STG-to-STG passes
192 <Term><Option>-ddump-absC</Option>:</Term>
195 <Emphasis>un</Emphasis>flattened Abstract C
200 <Term><Option>-ddump-flatC</Option>:</Term>
203 <Emphasis>flattened</Emphasis> Abstract C
208 <Term><Option>-ddump-realC</Option>:</Term>
211 same as what goes to the C compiler
216 <Term><Option>-ddump-asm</Option>:</Term>
219 assembly language from the native-code generator
224 <IndexTerm><Primary>-ddump-all option</Primary></IndexTerm>
225 <IndexTerm><Primary>-ddump-most option</Primary></IndexTerm>
226 <IndexTerm><Primary>-ddump-parsed option</Primary></IndexTerm>
227 <IndexTerm><Primary>-ddump-rn option</Primary></IndexTerm>
228 <IndexTerm><Primary>-ddump-tc option</Primary></IndexTerm>
229 <IndexTerm><Primary>-ddump-deriv option</Primary></IndexTerm>
230 <IndexTerm><Primary>-ddump-ds option</Primary></IndexTerm>
231 <IndexTerm><Primary>-ddump-simpl option</Primary></IndexTerm>
232 <IndexTerm><Primary>-ddump-cpranal option</Primary></IndexTerm>
233 <IndexTerm><Primary>-ddump-workwrap option</Primary></IndexTerm>
234 <IndexTerm><Primary>-ddump-rules option</Primary></IndexTerm>
235 <IndexTerm><Primary>-ddump-usagesp option</Primary></IndexTerm>
236 <IndexTerm><Primary>-ddump-stranal option</Primary></IndexTerm>
237 <IndexTerm><Primary>-ddump-occur-anal option</Primary></IndexTerm>
238 <IndexTerm><Primary>-ddump-spec option</Primary></IndexTerm>
239 <IndexTerm><Primary>-ddump-stg option</Primary></IndexTerm>
240 <IndexTerm><Primary>-ddump-absC option</Primary></IndexTerm>
241 <IndexTerm><Primary>-ddump-flatC option</Primary></IndexTerm>
242 <IndexTerm><Primary>-ddump-realC option</Primary></IndexTerm>
243 <IndexTerm><Primary>-ddump-asm option</Primary></IndexTerm>
248 <Term><Option>-dverbose-simpl</Option> and <Option>-dverbose-stg</Option>:</Term>
251 <IndexTerm><Primary>-dverbose-simpl option</Primary></IndexTerm>
252 <IndexTerm><Primary>-dverbose-stg option</Primary></IndexTerm>
253 Show the output of the intermediate Core-to-Core and STG-to-STG
254 passes, respectively. (<Emphasis>Lots</Emphasis> of output!) So: when we're
258 % ghc -noC -O -ddump-simpl -dverbose-simpl -dcore-lint Foo.hs
265 <Term><Option>-ddump-simpl-iterations</Option>:</Term>
268 <IndexTerm><Primary>-ddump-simpl-iterations option</Primary></IndexTerm>
269 Show the output of each <Emphasis>iteration</Emphasis> of the simplifier (each run of
270 the simplifier has a maximum number of iterations, normally 4). Used
271 when even <Option>-dverbose-simpl</Option> doesn't cut it.
276 <Term><Option>-dppr-{user,debug</Option>}:</Term>
279 <IndexTerm><Primary>-dppr-user option</Primary></IndexTerm>
280 <IndexTerm><Primary>-dppr-debug option</Primary></IndexTerm>
281 Debugging output is in one of several “styles.” Take the printing
282 of types, for example. In the “user” style, the compiler's internal
283 ideas about types are presented in Haskell source-level syntax,
284 insofar as possible. In the “debug” style (which is the default for
285 debugging output), the types are printed in with
286 explicit foralls, and variables have their unique-id attached (so you
287 can check for things that look the same but aren't).
292 <Term><Option>-ddump-simpl-stats</Option>:</Term>
295 <IndexTerm><Primary>-ddump-simpl-stats option</Primary></IndexTerm>
296 Dump statistics about how many of each kind
297 of transformation too place. If you add <Option>-dppr-debug</Option> you get more detailed information.
302 <Term><Option>-ddump-raw-asm</Option>:</Term>
305 <IndexTerm><Primary>-ddump-raw-asm option</Primary></IndexTerm>
306 Dump out the assembly-language stuff, before the “mangler” gets it.
311 <Term><Option>-ddump-rn-trace</Option>:</Term>
314 <IndexTerm><Primary>-ddump-rn-trace</Primary></IndexTerm>
315 Make the renamer be *real* chatty about what it is upto.
320 <Term><Option>-dshow-rn-stats</Option>:</Term>
323 <IndexTerm><Primary>-dshow-rn-stats</Primary></IndexTerm>
324 Print out summary of what kind of information the renamer had to bring
330 <Term><Option>-dshow-unused-imports</Option>:</Term>
333 <IndexTerm><Primary>-dshow-unused-imports</Primary></IndexTerm>
334 Have the renamer report what imports does not contribute.
343 <Sect2 id="checking-consistency">
344 <Title>Checking for consistency
348 <IndexTerm><Primary>consistency checks</Primary></IndexTerm>
349 <IndexTerm><Primary>lint</Primary></IndexTerm>
356 <Term><Option>-dcore-lint</Option>:</Term>
359 <IndexTerm><Primary>-dcore-lint option</Primary></IndexTerm>
360 Turn on heavyweight intra-pass sanity-checking within GHC, at Core
361 level. (It checks GHC's sanity, not yours.)
366 <Term><Option>-dstg-lint</Option>:</Term>
369 <IndexTerm><Primary>-dstg-lint option</Primary></IndexTerm>
375 <Term><Option>-dusagesp-lint</Option>:</Term>
378 <IndexTerm><Primary>-dstg-lint option</Primary></IndexTerm>
379 Turn on checks around UsageSP inference (<Option>-fusagesp</Option>). This verifies
380 various simple properties of the results of the inference, and also
381 warns if any identifier with a used-once annotation before the
382 inference has a used-many annotation afterwards; this could indicate a
383 non-worksafe transformation is being applied.
393 <Title>How to read Core syntax (from some <Option>-ddump-*</Option> flags)</Title>
396 <IndexTerm><Primary>reading Core syntax</Primary></IndexTerm>
397 <IndexTerm><Primary>Core syntax, how to read</Primary></IndexTerm>
401 Let's do this by commenting an example. It's from doing
402 <Option>-ddump-ds</Option> on this code:
405 skip2 m = m : skip2 (m+2)
411 Before we jump in, a word about names of things. Within GHC,
412 variables, type constructors, etc., are identified by their
413 “Uniques.” These are of the form `letter' plus `number' (both
414 loosely interpreted). The `letter' gives some idea of where the
415 Unique came from; e.g., <Literal>_</Literal> means “built-in type variable”;
416 <Literal>t</Literal> means “from the typechecker”; <Literal>s</Literal> means “from the
417 simplifier”; and so on. The `number' is printed fairly compactly in
418 a `base-62' format, which everyone hates except me (WDP).
422 Remember, everything has a “Unique” and it is usually printed out
423 when debugging, in some form or another. So here we go…
429 Main.skip2{-r1L6-} :: _forall_ a$_4 =>{{Num a$_4}} -> a$_4 -> [a$_4]
431 --# `r1L6' is the Unique for Main.skip2;
432 --# `_4' is the Unique for the type-variable (template) `a'
433 --# `{{Num a$_4}}' is a dictionary argument
437 --# `_NI_' means "no (pragmatic) information" yet; it will later
438 --# evolve into the GHC_PRAGMA info that goes into interface files.
441 /\ _4 -> \ d.Num.t4Gt ->
444 +.t4Hg :: _4 -> _4 -> _4
446 +.t4Hg = (+{-r3JH-} _4) d.Num.t4Gt
448 fromInt.t4GS :: Int{-2i-} -> _4
450 fromInt.t4GS = (fromInt{-r3JX-} _4) d.Num.t4Gt
452 --# The `+' class method (Unique: r3JH) selects the addition code
453 --# from a `Num' dictionary (now an explicit lamba'd argument).
454 --# Because Core is 2nd-order lambda-calculus, type applications
455 --# and lambdas (/\) are explicit. So `+' is first applied to a
456 --# type (`_4'), then to a dictionary, yielding the actual addition
457 --# function that we will use subsequently...
459 --# We play the exact same game with the (non-standard) class method
460 --# `fromInt'. Unsurprisingly, the type `Int' is wired into the
470 } in fromInt.t4GS ds.d4Qz
472 --# `I# 2#' is just the literal Int `2'; it reflects the fact that
473 --# GHC defines `data Int = I# Int#', where Int# is the primitive
474 --# unboxed type. (see relevant info about unboxed types elsewhere...)
476 --# The `!' after `I#' indicates that this is a *saturated*
477 --# application of the `I#' data constructor (i.e., not partially
480 skip2.t3Ja :: _4 -> [_4]
484 let { ds.d4QQ :: [_4]
490 ds.d4QY = +.t4Hg m.r1H4 lit.t4Hb
491 } in skip2.t3Ja ds.d4QY
501 (“It's just a simple functional language” is an unregisterised
502 trademark of Peyton Jones Enterprises, plc.)
507 <Sect2 id="source-file-options">
508 <Title>Command line options in source files
512 <IndexTerm><Primary>source-file options</Primary></IndexTerm>
516 Sometimes it is useful to make the connection between a source file
517 and the command-line options it requires quite tight. For instance,
518 if a (Glasgow) Haskell source file uses <Literal>casm</Literal>s, the C back-end
519 often needs to be told about which header files to include. Rather than
520 maintaining the list of files the source depends on in a
521 <Filename>Makefile</Filename> (using the <Option>-#include</Option> command-line option), it is
522 possible to do this directly in the source file using the <Literal>OPTIONS</Literal>
523 pragma <IndexTerm><Primary>OPTIONS pragma</Primary></IndexTerm>:
528 {-# OPTIONS -#include "foo.h" #-}
536 <Literal>OPTIONS</Literal> pragmas are only looked for at the top of your source
537 files, upto the first (non-literate,non-empty) line not containing
538 <Literal>OPTIONS</Literal>. Multiple <Literal>OPTIONS</Literal> pragmas are recognised. Note
539 that your command shell does not get to the source file options, they
540 are just included literally in the array of command-line arguments
541 the compiler driver maintains internally, so you'll be desperately
542 disappointed if you try to glob etc. inside <Literal>OPTIONS</Literal>.
546 NOTE: the contents of OPTIONS are prepended to the command-line
547 options, so you <Emphasis>do</Emphasis> have the ability to override OPTIONS settings
548 via the command line.
552 It is not recommended to move all the contents of your Makefiles into
553 your source files, but in some circumstances, the <Literal>OPTIONS</Literal> pragma
554 is the Right Thing. (If you use <Option>-keep-hc-file-too</Option> and have OPTION
555 flags in your module, the OPTIONS will get put into the generated .hc
562 <title>Unregisterised compilation</title>
563 <indexterm><primary>unregisterised compilation</primary></indexterm>
565 <para>The term "unregisterised" really means "compile via vanilla
566 C", disabling some of the platform-specific tricks that GHC
567 normally uses to make programs go faster. When compiling
568 unregisterised, GHC simply generates a C file which is compiled
571 <para>Unregisterised compilation can be useful when porting GHC to
572 a new machine, since it reduces the prerequisite tools to
573 <command>gcc</command>, <command>as</command>, and
574 <command>ld</command> and nothing more, and furthermore the amount
575 of platform-specific code that needs to be written in order to get
576 unregisterised compilation going is usually fairly small.</para>
580 <term><option>-unreg</option>:</term>
581 <indexterm><primary><option>-unreg</option></primary></indexterm>
583 <para>Compile via vanilla ANSI C only, turning off
584 platform-specific optimisations. NOTE: in order to use
585 <option>-unreg</option>, you need to have a set of libraries
586 (including the RTS) built for unregisterised compilation.
587 This amounts to building GHC with way "u" enabled.</para>
596 ;;; Local Variables: ***
598 ;;; sgml-parent-document: ("users_guide.sgml" "book" "chapter" "sect1") ***