6d14eb39a451f258169aab3395c2775273c80349
[ghc-hetmet.git] / ghc / docs / users_guide / debugging.vsgml
1 %************************************************************************
2 %*                                                                      *
3 <sect1>Debugging the compiler
4 <label id="options-debugging">
5 <p>
6 <nidx>debugging options (for GHC)</nidx>
7 %*                                                                      *
8 %************************************************************************
9
10 HACKER TERRITORY. HACKER TERRITORY.
11 (You were warned.)
12
13 %----------------------------------------------------------------------
14 <sect2>Replacing the program for one or more phases.
15 <label id="replacing-phases">
16 <p>
17 <nidx>GHC phases, changing</nidx>
18 <nidx>phases, changing GHC</nidx>
19
20 You may specify that a different program be used for one of the phases
21 of the compilation system, in place of whatever the driver @ghc@ has
22 wired into it.  For example, you might want to try a different
23 assembler.  The
24 @-pgm<phase-code><program-name>@<nidx>-pgm&lt;phase&gt;&lt;stuff&gt;
25 option</nidx> option to @ghc@ will cause it to use @<program-name>@
26 for phase @<phase-code>@, where the codes to indicate the phases are:
27
28 <tabular ca="ll">
29 <bf>code</bf> | <bf>phase</bf> @@
30 @@
31 L    | literate pre-processor @@
32 P    | C pre-processor (if -cpp only) @@
33 C    | Haskell compiler @@
34 c    | C compiler@@
35 a    | assembler @@
36 l    | linker @@
37 dep  | Makefile dependency generator @@
38 </tabular>
39
40 %----------------------------------------------------------------------
41 <sect2>Forcing options to a particular phase.
42 <label id="forcing-options-through">
43 <p>
44 <nidx>forcing GHC-phase options</nidx>
45
46 The preceding sections describe driver options that are mostly
47 applicable to one particular phase.  You may also <em>force</em> a
48 specific option @<option>@ to be passed to a particular phase
49 @<phase-code>@ by feeding the driver the option
50 @-opt<phase-code><option>@.<nidx>-opt&lt;phase&gt;&lt;stuff&gt;
51 option</nidx> The codes to indicate the phases are the same as in the
52 previous section.
53
54 So, for example, to force an @-Ewurble@ option to the assembler, you
55 would tell the driver @-opta-Ewurble@ (the dash before the E is
56 required).
57
58 Besides getting options to the Haskell compiler with @-optC<blah>@,
59 you can get options through to its runtime system with
60 @-optCrts<blah>@<nidx>-optCrts&lt;blah&gt; option</nidx>.
61
62 So, for example: when I want to use my normal driver but with my
63 profiled compiler binary, I use this script:
64 <tscreen><verb>
65 #! /bin/sh
66 exec /local/grasp_tmp3/simonpj/ghc-BUILDS/working-alpha/ghc/driver/ghc \
67      -pgmC/local/grasp_tmp3/simonpj/ghc-BUILDS/working-hsc-prof/hsc \
68      -optCrts-i0.5 \
69      -optCrts-PT \
70      "$@"
71 </verb></tscreen>
72
73 %----------------------------------------------------------------------
74 <sect2>Dumping out compiler intermediate structures
75 <label id="dumping-output">
76 <p>
77 <nidx>dumping GHC intermediates</nidx>
78 <nidx>intermediate passes, output</nidx>
79
80 <descrip>
81 <tag>@-noC@:</tag>
82 <nidx>-noC option</nidx>
83 Don't bother generating C output <em>or</em> an interface file.  Usually
84 used in conjunction with one or more of the @-ddump-*@ options; for
85 example: @ghc -noC -ddump-simpl Foo.hs@
86
87 <tag>@-hi@:</tag>
88 <nidx>-hi option</nidx>
89 <em>Do</em> generate an interface file.  This would normally be used in
90 conjunction with @-noC@, which turns off interface generation;
91 thus: @-noC -hi@.
92
93 <tag>@-dshow-passes@:</tag>
94 <nidx>-dshow-passes option</nidx>
95 Prints a message to stderr as each pass starts.  Gives a warm but
96 undoubtedly misleading feeling that GHC is telling you what's
97 happening.
98
99 <tag>@-ddump-<pass>@:</tag>
100 <nidx>-ddump-&lt;pass&gt; options</nidx>
101 Make a debugging dump after pass @<pass>@ (may be common enough to
102 need a short form...).  Some of the most useful ones are:
103
104 <descrip>
105 <tag>@-ddump-rdr@:</tag> reader output (earliest stuff in the compiler)
106 <tag>@-ddump-rn@:</tag>  renamer output
107 <tag>@-ddump-tc@:</tag>  typechecker output
108 <tag>@-ddump-deriv@:</tag>  derived instances
109 <tag>@-ddump-ds@:</tag>  desugarer output
110 <tag>@-ddump-spec@:</tag>  output of specialisation pass
111 <tag>@-ddump-rules@:</tag>  dumps all rewrite rules (including those generated by the specialisation pass)
112 <tag>@-ddump-simpl@:</tag>  simplifer output (Core-to-Core passes)
113 <tag>@-ddump-usagesp@:</tag> UsageSP inference pre-inf and output
114 <tag>@-ddump-cpranal@:</tag>  CPR analyser output
115 <tag>@-ddump-stranal@:</tag>  strictness analyser output
116 <tag>@-ddump-workwrap@:</tag>  worker/wrapper split output
117 <tag>@-ddump-occur-anal@:</tag>  `occurrence analysis' output
118 <tag>@-ddump-stg@:</tag>  output of STG-to-STG passes
119 <tag>@-ddump-absC@:</tag>  <em>un</em>flattened Abstract~C
120 <tag>@-ddump-flatC@:</tag>  <em>flattened</em> Abstract~C
121 <tag>@-ddump-realC@:</tag>  same as what goes to the C compiler
122 <tag>@-ddump-asm@:</tag>  assembly language from the native-code generator
123 </descrip>
124
125 <nidx>-ddump-rdr option</nidx>%
126 <nidx>-ddump-rn option</nidx>%
127 <nidx>-ddump-tc option</nidx>%
128 <nidx>-ddump-deriv option</nidx>%
129 <nidx>-ddump-ds option</nidx>%
130 <nidx>-ddump-simpl option</nidx>%
131 <nidx>-ddump-cpranal option</nidx>%
132 <nidx>-ddump-workwrap option</nidx>%
133 <nidx>-ddump-rules option</nidx>%
134 <nidx>-ddump-usagesp option</nidx>%
135 <nidx>-ddump-stranal option</nidx>%
136 <nidx>-ddump-occur-anal option</nidx>%
137 <nidx>-ddump-spec option</nidx>%
138 <nidx>-ddump-stg option</nidx>%
139 <nidx>-ddump-absC option</nidx>%
140 <nidx>-ddump-flatC option</nidx>%
141 <nidx>-ddump-realC option</nidx>%
142 <nidx>-ddump-asm option</nidx>
143
144 %For any other @-ddump-*@ options: consult the source, notably
145 %@ghc/compiler/main/CmdLineOpts.lhs@.
146
147 <tag>@-dverbose-simpl@ and @-dverbose-stg@:</tag>
148 <nidx>-dverbose-simpl option</nidx>
149 <nidx>-dverbose-stg option</nidx>
150 Show the output of the intermediate Core-to-Core and STG-to-STG
151 passes, respectively.  (<em>Lots</em> of output!) So: when we're 
152 really desperate:
153 <tscreen><verb>
154 % ghc -noC -O -ddump-simpl -dverbose-simpl -dcore-lint Foo.hs
155 </verb></tscreen>
156
157 <tag>@-ddump-simpl-iterations@:</tag>
158 <nidx>-ddump-simpl-iterations option</nidx>
159 Show the output of each <em/iteration/ of the simplifier (each run of
160 the simplifier has a maximum number of iterations, normally 4).  Used
161 when even @-dverbose-simpl@ doesn't cut it.
162
163 <tag>@-dppr-{user,debug@}:</tag>
164 <nidx>-dppr-user option</nidx>
165 <nidx>-dppr-debug option</nidx>
166 Debugging output is in one of several ``styles.''  Take the printing
167 of types, for example.  In the ``user'' style, the compiler's internal
168 ideas about types are presented in Haskell source-level syntax,
169 insofar as possible.  In the ``debug'' style (which is the default for
170 debugging output), the types are printed in with
171 explicit foralls, and variables have their unique-id attached (so you
172 can check for things that look the same but aren't).
173
174 <tag>@-ddump-simpl-stats@:</tag>
175 <nidx>-ddump-simpl-stats option</nidx>
176 Dump statistics about how many of each kind
177 of transformation too place.  If you add @-dppr-debug@ you get more detailed information.
178
179 <tag>@-ddump-raw-asm@:</tag>
180 <nidx>-ddump-raw-asm option</nidx>
181 Dump out the assembly-language stuff, before the ``mangler'' gets it.
182
183 <tag>@-ddump-rn-trace@:</tag>
184 <nidx>-ddump-rn-trace</nidx>
185 Make the renamer be *real* chatty about what it is upto.
186
187 <tag>@-dshow-rn-stats@:</tag>
188 <nidx>-dshow-rn-stats</nidx>
189 Print out summary of what kind of information the renamer had to bring
190 in.
191 <tag>@-dshow-unused-imports@:</tag>
192 <nidx>-dshow-unused-imports</nidx>
193 Have the renamer report what imports does not contribute.
194
195 %
196 %<tag>@-dgc-debug@:</tag>
197 %<nidx>-dgc-debug option</nidx>
198 %Enables some debugging code related to the garbage-collector.
199 </descrip>
200
201 %ToDo: -ddump-asm-insn-counts
202 %-ddump-asm-globals-info
203
204 %----------------------------------------------------------------------
205 <sect2>Checking for consistency
206 <label id="checking-consistency">
207 <p>
208 <nidx>consistency checks</nidx>
209 <nidx>lint</nidx>
210
211 <descrip>
212 <tag>@-dcore-lint@:</tag>
213 <nidx>-dcore-lint option</nidx>
214 Turn on heavyweight intra-pass sanity-checking within GHC, at Core
215 level.  (It checks GHC's sanity, not yours.)
216
217 <tag>@-dstg-lint@:</tag>
218 <nidx>-dstg-lint option</nidx>
219 Ditto for STG level.
220
221 <tag>@-dusagesp-lint@:</tag>
222 <nidx>-dstg-lint option</nidx>
223 Turn on checks around UsageSP inference (@-fusagesp@).  This verifies
224 various simple properties of the results of the inference, and also
225 warns if any identifier with a used-once annotation before the
226 inference has a used-many annotation afterwards; this could indicate a
227 non-worksafe transformation is being applied.
228 </descrip>
229
230 %----------------------------------------------------------------------
231 <sect2>How to read Core syntax (from some @-ddump-*@ flags)
232 <p>
233 <nidx>reading Core syntax</nidx>
234 <nidx>Core syntax, how to read</nidx>
235
236 Let's do this by commenting an example.  It's from doing
237 @-ddump-ds@ on this code:
238 <tscreen><verb>
239 skip2 m = m : skip2 (m+2)
240 </verb></tscreen>
241
242 Before we jump in, a word about names of things.  Within GHC,
243 variables, type constructors, etc., are identified by their
244 ``Uniques.''  These are of the form `letter' plus `number' (both
245 loosely interpreted).  The `letter' gives some idea of where the
246 Unique came from; e.g., @_@ means ``built-in type variable'';
247 @t@ means ``from the typechecker''; @s@ means ``from the
248 simplifier''; and so on.  The `number' is printed fairly compactly in
249 a `base-62' format, which everyone hates except me (WDP).
250
251 Remember, everything has a ``Unique'' and it is usually printed out
252 when debugging, in some form or another.  So here we go...
253
254 <tscreen><verb>
255 Desugared:
256 Main.skip2{-r1L6-} :: _forall_ a$_4 =>{{Num a$_4}} -> a$_4 -> [a$_4]
257
258 --# `r1L6' is the Unique for Main.skip2;
259 --# `_4' is the Unique for the type-variable (template) `a'
260 --# `{{Num a$_4}}' is a dictionary argument
261
262 _NI_
263
264 --# `_NI_' means "no (pragmatic) information" yet; it will later
265 --# evolve into the GHC_PRAGMA info that goes into interface files.
266
267 Main.skip2{-r1L6-} =
268     /\ _4 -> \ d.Num.t4Gt ->
269         let {
270           {- CoRec -}
271           +.t4Hg :: _4 -> _4 -> _4
272           _NI_
273           +.t4Hg = (+{-r3JH-} _4) d.Num.t4Gt
274
275           fromInt.t4GS :: Int{-2i-} -> _4
276           _NI_
277           fromInt.t4GS = (fromInt{-r3JX-} _4) d.Num.t4Gt
278
279 --# The `+' class method (Unique: r3JH) selects the addition code
280 --# from a `Num' dictionary (now an explicit lamba'd argument).
281 --# Because Core is 2nd-order lambda-calculus, type applications
282 --# and lambdas (/\) are explicit.  So `+' is first applied to a
283 --# type (`_4'), then to a dictionary, yielding the actual addition
284 --# function that we will use subsequently...
285
286 --# We play the exact same game with the (non-standard) class method
287 --# `fromInt'.  Unsurprisingly, the type `Int' is wired into the
288 --# compiler.
289
290           lit.t4Hb :: _4
291           _NI_
292           lit.t4Hb =
293               let {
294                 ds.d4Qz :: Int{-2i-}
295                 _NI_
296                 ds.d4Qz = I#! 2#
297               } in  fromInt.t4GS ds.d4Qz
298
299 --# `I# 2#' is just the literal Int `2'; it reflects the fact that
300 --# GHC defines `data Int = I# Int#', where Int# is the primitive
301 --# unboxed type.  (see relevant info about unboxed types elsewhere...)
302
303 --# The `!' after `I#' indicates that this is a *saturated*
304 --# application of the `I#' data constructor (i.e., not partially
305 --# applied).
306
307           skip2.t3Ja :: _4 -> [_4]
308           _NI_
309           skip2.t3Ja =
310               \ m.r1H4 ->
311                   let { ds.d4QQ :: [_4]
312                         _NI_
313                         ds.d4QQ =
314                     let {
315                       ds.d4QY :: _4
316                       _NI_
317                       ds.d4QY = +.t4Hg m.r1H4 lit.t4Hb
318                     } in  skip2.t3Ja ds.d4QY
319                   } in
320                   :! _4 m.r1H4 ds.d4QQ
321
322           {- end CoRec -}
323         } in  skip2.t3Ja
324 </verb></tscreen>
325
326 (``It's just a simple functional language'' is an unregisterised
327 trademark of Peyton Jones Enterprises, plc.)
328
329 %----------------------------------------------------------------------
330 <sect2>Command line options in source files
331 <label id="source-file-options">
332 <p>
333 <nidx>source-file options</nidx>
334
335 Sometimes it is useful to make the connection between a source file
336 and the command-line options it requires quite tight. For instance,
337 if a (Glasgow) Haskell source file uses @casm@s, the C back-end
338 often needs to be told about which header files to include. Rather than
339 maintaining the list of files the source depends on in a
340 @Makefile@ (using the @-#include@ command-line option), it is
341 possible to do this directly in the source file using the @OPTIONS@
342 pragma <nidx>OPTIONS pragma</nidx>: 
343
344 <tscreen><verb>
345 {-# OPTIONS -#include "foo.h" #-}
346 module X where
347
348 ...
349 </verb></tscreen>
350
351 @OPTIONS@ pragmas are only looked for at the top of your source
352 files, upto the first (non-literate,non-empty) line not containing
353 @OPTIONS@. Multiple @OPTIONS@ pragmas are recognised. Note
354 that your command shell does not get to the source file options, they
355 are just included literally in the array of command-line arguments
356 the compiler driver maintains internally, so you'll be desperately
357 disappointed if you try to glob etc. inside @OPTIONS@.
358
359 NOTE: the contents of OPTIONS are prepended to the command-line
360 options, so you *do* have the ability to override OPTIONS settings
361 via the command line.
362
363 It is not recommended to move all the contents of your Makefiles into
364 your source files, but in some circumstances, the @OPTIONS@ pragma
365 is the Right Thing. (If you use @-keep-hc-file-too@ and have OPTION
366 flags in your module, the OPTIONS will get put into the generated .hc
367 file).
368
369 %----------------------------------------------------------------------