Document -dfaststring-stats
[ghc-hetmet.git] / docs / users_guide / debugging.xml
1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <sect1 id="options-debugging">
3   <title>Debugging the compiler</title>
4
5   <indexterm><primary>debugging options (for GHC)</primary></indexterm>
6
7   <para>HACKER TERRITORY. HACKER TERRITORY.  (You were warned.)</para>
8
9   <sect2 id="dumping-output">
10     <title>Dumping out compiler intermediate structures</title>
11     
12     <indexterm><primary>dumping GHC intermediates</primary></indexterm>
13     <indexterm><primary>intermediate passes, output</primary></indexterm>
14     
15     <variablelist>
16       <varlistentry>
17         <term>
18           <option>-ddump-</option><replaceable>pass</replaceable>
19           <indexterm><primary><option>-ddump</option> options</primary></indexterm>
20         </term>
21         <listitem>
22           <para>Make a debugging dump after pass
23         <literal>&lt;pass&gt;</literal> (may be common enough to need
24         a short form&hellip;).  You can get all of these at once
25         (<emphasis>lots</emphasis> of output) by using
26         <option>-v5</option>, or most of them with
27         <option>-v4</option>.  Some of the most useful ones
28         are:</para>
29
30           <variablelist>
31             <varlistentry>
32               <term>
33                 <option>-ddump-parsed</option>:
34                 <indexterm><primary><option>-ddump-parsed</option></primary></indexterm>
35               </term>
36               <listitem>
37                 <para>parser output</para>
38               </listitem>
39             </varlistentry>
40
41             <varlistentry>
42               <term>
43                 <option>-ddump-rn</option>:
44                 <indexterm><primary><option>-ddump-rn</option></primary></indexterm>
45               </term>
46               <listitem>
47                 <para>renamer output</para>
48               </listitem>
49             </varlistentry>
50
51             <varlistentry>
52               <term>
53                 <option>-ddump-tc</option>:
54                 <indexterm><primary><option>-ddump-tc</option></primary></indexterm>
55               </term>
56               <listitem>
57                 <para>typechecker output</para>
58               </listitem>
59             </varlistentry>
60
61             <varlistentry>
62               <term>
63                 <option>-ddump-types</option>:
64                 <indexterm><primary><option>-ddump-types</option></primary></indexterm>
65               </term>
66               <listitem>
67                 <para>Dump a type signature for each value defined at
68               the top level of the module.  The list is sorted
69               alphabetically.  Using <option>-dppr-debug</option>
70               dumps a type signature for all the imported and
71               system-defined things as well; useful for debugging the
72               compiler.</para>
73               </listitem>
74             </varlistentry>
75
76             <varlistentry>
77               <term>
78                 <option>-ddump-deriv</option>:
79                 <indexterm><primary><option>-ddump-deriv</option></primary></indexterm>
80               </term>
81               <listitem>
82                 <para>derived instances</para>
83               </listitem>
84             </varlistentry>
85
86             <varlistentry>
87               <term>
88                 <option>-ddump-ds</option>:
89                 <indexterm><primary><option>-ddump-ds</option></primary></indexterm>
90               </term>
91               <listitem>
92                 <para>desugarer output</para>
93               </listitem>
94             </varlistentry>
95
96             <varlistentry>
97               <term>
98                 <option>-ddump-spec</option>:
99                 <indexterm><primary><option>-ddump-spec</option></primary></indexterm>
100               </term>
101               <listitem>
102                 <para>output of specialisation pass</para>
103               </listitem>
104             </varlistentry>
105
106             <varlistentry>
107               <term>
108                 <option>-ddump-rules</option>:
109                 <indexterm><primary><option>-ddump-rules</option></primary></indexterm>
110               </term>
111               <listitem>
112                 <para>dumps all rewrite rules (including those generated
113               by the specialisation pass)</para>
114               </listitem>
115             </varlistentry>
116
117             <varlistentry>
118               <term>
119                 <option>-ddump-simpl</option>:
120                 <indexterm><primary><option>-ddump-simpl</option></primary></indexterm>
121               </term>
122               <listitem>
123                 <para>simplifier output (Core-to-Core passes)</para>
124               </listitem>
125             </varlistentry>
126
127             <varlistentry>
128               <term>
129                 <option>-ddump-inlinings</option>:
130                 <indexterm><primary><option>-ddump-inlinings</option></primary></indexterm>
131               </term>
132               <listitem>
133                 <para>inlining info from the simplifier</para>
134               </listitem>
135             </varlistentry>
136
137             <varlistentry>
138               <term>
139                 <option>-ddump-cpranal</option>:
140                 <indexterm><primary><option>-ddump-cpranal</option></primary></indexterm>
141               </term>
142               <listitem>
143                 <para>CPR analyser output</para>
144               </listitem>
145             </varlistentry>
146
147             <varlistentry>
148               <term>
149                 <option>-ddump-stranal</option>:
150                 <indexterm><primary><option>-ddump-stranal</option></primary></indexterm>
151               </term>
152               <listitem>
153                 <para>strictness analyser output</para>
154               </listitem>
155             </varlistentry>
156
157             <varlistentry>
158               <term>
159                 <option>-ddump-cse</option>:
160                 <indexterm><primary><option>-ddump-cse</option></primary></indexterm>
161               </term>
162               <listitem>
163                 <para>CSE pass output</para>
164               </listitem>
165             </varlistentry>
166
167             <varlistentry>
168               <term>
169                 <option>-ddump-workwrap</option>:
170                 <indexterm><primary><option>-ddump-workwrap</option></primary></indexterm>
171               </term>
172               <listitem>
173                 <para>worker/wrapper split output</para>
174               </listitem>
175             </varlistentry>
176
177             <varlistentry>
178               <term>
179                 <option>-ddump-occur-anal</option>:
180                 <indexterm><primary><option>-ddump-occur-anal</option></primary></indexterm>
181               </term>
182               <listitem>
183                 <para>`occurrence analysis' output</para>
184               </listitem>
185             </varlistentry>
186
187             <varlistentry>
188               <term>
189                 <option>-ddump-stg</option>:
190                 <indexterm><primary><option>-ddump-stg</option></primary></indexterm>
191               </term>
192               <listitem>
193                 <para>output of STG-to-STG passes</para>
194               </listitem>
195             </varlistentry>
196
197             <varlistentry>
198               <term>
199                 <option>-ddump-flatC</option>:
200                 <indexterm><primary><option>-ddump-flatC</option></primary></indexterm>
201               </term>
202               <listitem>
203                 <para><emphasis>flattened</emphasis> Abstract&nbsp;C</para>
204               </listitem>
205             </varlistentry>
206
207             <varlistentry>
208               <term>
209                 <option>-ddump-asm</option>:
210                 <indexterm><primary><option>-ddump-asm</option></primary></indexterm>
211               </term>
212               <listitem>
213                 <para>assembly language from the native-code generator</para>
214               </listitem>
215             </varlistentry>
216
217             <varlistentry>
218               <term>
219                 <option>-ddump-bcos</option>:
220                 <indexterm><primary><option>-ddump-bcos</option></primary></indexterm>
221               </term>
222               <listitem>
223                 <para>byte code compiler output</para>
224               </listitem>
225             </varlistentry>
226
227             <varlistentry>
228               <term>
229                 <option>-ddump-foreign</option>:
230                 <indexterm><primary><option>-ddump-foreign</option></primary></indexterm>
231               </term>
232               <listitem>
233                 <para>dump foreign export stubs</para>
234               </listitem>
235             </varlistentry>
236           </variablelist>
237         </listitem>
238       </varlistentry>
239       
240       <varlistentry>
241         <term>
242           <option>-ddump-simpl-iterations</option>:
243           <indexterm><primary><option>-ddump-simpl-iterations</option></primary></indexterm>
244         </term>
245         <listitem>
246           <para>Show the output of each <emphasis>iteration</emphasis>
247         of the simplifier (each run of the simplifier has a maximum
248         number of iterations, normally 4).  Used when even
249         <option>-dverbose-simpl</option> doesn't cut it.</para>
250         </listitem>
251       </varlistentry>
252
253       <varlistentry>
254         <term>
255           <option>-ddump-simpl-stats</option>
256           <indexterm><primary><option>-ddump-simpl-stats option</option></primary></indexterm>
257         </term>
258         <listitem>
259           <para>Dump statistics about how many of each kind of
260         transformation too place.  If you add
261         <option>-dppr-debug</option> you get more detailed
262         information.</para>
263         </listitem>
264       </varlistentry>
265
266       <varlistentry>
267         <term>
268           <option>-ddump-rn-trace</option>
269           <indexterm><primary><option>-ddump-rn-trace</option></primary></indexterm>
270         </term>
271         <listitem>
272           <para>Make the renamer be *real* chatty about what it is
273         upto.</para>
274         </listitem>
275       </varlistentry>
276
277       <varlistentry>
278         <term>
279           <option>-ddump-rn-stats</option>
280           <indexterm><primary><option>-dshow-rn-stats</option></primary></indexterm>
281         </term>
282         <listitem>
283           <para>Print out summary of what kind of information the renamer
284         had to bring in.</para>
285         </listitem>
286       </varlistentry>
287
288       <varlistentry>
289         <term>
290           <option>-dverbose-core2core</option>
291           <indexterm><primary><option>-dverbose-core2core</option></primary></indexterm>
292         </term>
293         <term>
294           <option>-dverbose-stg2stg</option>
295           <indexterm><primary><option>-dverbose-stg2stg</option></primary></indexterm>
296         </term>
297         <listitem>
298           <para>Show the output of the intermediate Core-to-Core and
299         STG-to-STG passes, respectively.  (<emphasis>Lots</emphasis>
300         of output!) So: when we're really desperate:</para>
301
302           <screen>
303 % ghc -noC -O -ddump-simpl -dverbose-simpl -dcore-lint Foo.hs
304 </screen>
305
306         </listitem>
307       </varlistentry>
308       
309       <varlistentry>
310         <term>
311           <option>-dfaststring-stats</option>
312           <indexterm><primary><option>-dfaststring-stats</option></primary></indexterm>
313         </term>
314         <listitem>
315           <para>Show statistics for the usage of fast strings by the
316           compiler</para>
317         </listitem>
318       </varlistentry>
319
320       <varlistentry>
321         <term>
322           <option>-dppr-debug</option>
323           <indexterm><primary><option>-dppr-debug</option></primary></indexterm>
324         </term>
325         <listitem>
326           <para>Debugging output is in one of several
327           &ldquo;styles.&rdquo; Take the printing of types, for
328           example.  In the &ldquo;user&rdquo; style (the default), the
329           compiler's internal ideas about types are presented in
330           Haskell source-level syntax, insofar as possible.  In the
331           &ldquo;debug&rdquo; style (which is the default for
332           debugging output), the types are printed in with explicit
333           foralls, and variables have their unique-id attached (so you
334           can check for things that look the same but aren't).  This
335           flag makes debugging output appear in the more verbose debug
336           style.</para>
337         </listitem>
338       </varlistentry>
339
340       <varlistentry>
341         <term>
342           <option>-dppr-user-length</option>
343           <indexterm><primary><option>-dppr-user-length</option></primary></indexterm>
344         </term>
345         <listitem>
346           <para>In error messages, expressions are printed to a
347           certain &ldquo;depth&rdquo;, with subexpressions beyond the
348           depth replaced by ellipses.  This flag sets the
349           depth.</para>
350         </listitem>
351       </varlistentry>
352
353       <varlistentry>
354         <term>
355           <option>-dshow-unused-imports</option>
356           <indexterm><primary><option>-dshow-unused-imports</option></primary></indexterm>
357         </term>
358         <listitem>
359           <para>Have the renamer report what imports does not
360         contribute.</para>
361         </listitem>
362       </varlistentry>
363     </variablelist>
364   </sect2>
365
366   <sect2 id="checking-consistency">
367     <title>Checking for consistency</title>
368
369     <indexterm><primary>consistency checks</primary></indexterm>
370     <indexterm><primary>lint</primary></indexterm>
371
372     <variablelist>
373
374       <varlistentry>
375         <term>
376           <option>-dcore-lint</option>
377           <indexterm><primary><option>-dcore-lint</option></primary></indexterm>
378         </term>
379         <listitem>
380           <para>Turn on heavyweight intra-pass sanity-checking within
381           GHC, at Core level.  (It checks GHC's sanity, not yours.)</para>
382         </listitem>
383       </varlistentry>
384
385       <varlistentry>
386         <term>
387           <option>-dstg-lint</option>:
388           <indexterm><primary><option>-dstg-lint</option></primary></indexterm>
389         </term>
390         <listitem>
391           <para>Ditto for STG level. (NOTE: currently doesn't work).</para>
392         </listitem>
393       </varlistentry>
394
395     </variablelist>
396   </sect2>
397
398   <sect2>
399     <title>How to read Core syntax (from some <option>-ddump</option>
400     flags)</title>
401
402     <indexterm><primary>reading Core syntax</primary></indexterm>
403     <indexterm><primary>Core syntax, how to read</primary></indexterm>
404
405     <para>Let's do this by commenting an example.  It's from doing
406     <option>-ddump-ds</option> on this code:
407
408 <programlisting>
409 skip2 m = m : skip2 (m+2)
410 </programlisting>
411
412     Before we jump in, a word about names of things.  Within GHC,
413     variables, type constructors, etc., are identified by their
414     &ldquo;Uniques.&rdquo; These are of the form `letter' plus
415     `number' (both loosely interpreted).  The `letter' gives some idea
416     of where the Unique came from; e.g., <literal>&lowbar;</literal>
417     means &ldquo;built-in type variable&rdquo;; <literal>t</literal>
418     means &ldquo;from the typechecker&rdquo;; <literal>s</literal>
419     means &ldquo;from the simplifier&rdquo;; and so on.  The `number'
420     is printed fairly compactly in a `base-62' format, which everyone
421     hates except me (WDP).</para>
422
423     <para>Remember, everything has a &ldquo;Unique&rdquo; and it is
424     usually printed out when debugging, in some form or another.  So
425     here we go&hellip;</para>
426
427 <programlisting>
428 Desugared:
429 Main.skip2{-r1L6-} :: _forall_ a$_4 =&#62;{{Num a$_4}} -&#62; a$_4 -&#62; [a$_4]
430
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
434
435 _NI_
436
437 --# `_NI_' means "no (pragmatic) information" yet; it will later
438 --# evolve into the GHC_PRAGMA info that goes into interface files.
439
440 Main.skip2{-r1L6-} =
441     /\ _4 -&#62; \ d.Num.t4Gt -&#62;
442         let {
443           {- CoRec -}
444           +.t4Hg :: _4 -&#62; _4 -&#62; _4
445           _NI_
446           +.t4Hg = (+{-r3JH-} _4) d.Num.t4Gt
447
448           fromInt.t4GS :: Int{-2i-} -&#62; _4
449           _NI_
450           fromInt.t4GS = (fromInt{-r3JX-} _4) d.Num.t4Gt
451
452 --# The `+' class method (Unique: r3JH) selects the addition code
453 --# from a `Num' dictionary (now an explicit lambda'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...
458
459 --# We play the exact same game with the (non-standard) class method
460 --# `fromInt'.  Unsurprisingly, the type `Int' is wired into the
461 --# compiler.
462
463           lit.t4Hb :: _4
464           _NI_
465           lit.t4Hb =
466               let {
467                 ds.d4Qz :: Int{-2i-}
468                 _NI_
469                 ds.d4Qz = I#! 2#
470               } in  fromInt.t4GS ds.d4Qz
471
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...)
475
476 --# The `!' after `I#' indicates that this is a *saturated*
477 --# application of the `I#' data constructor (i.e., not partially
478 --# applied).
479
480           skip2.t3Ja :: _4 -&#62; [_4]
481           _NI_
482           skip2.t3Ja =
483               \ m.r1H4 -&#62;
484                   let { ds.d4QQ :: [_4]
485                         _NI_
486                         ds.d4QQ =
487                     let {
488                       ds.d4QY :: _4
489                       _NI_
490                       ds.d4QY = +.t4Hg m.r1H4 lit.t4Hb
491                     } in  skip2.t3Ja ds.d4QY
492                   } in
493                   :! _4 m.r1H4 ds.d4QQ
494
495           {- end CoRec -}
496         } in  skip2.t3Ja
497 </programlisting>
498
499     <para>(&ldquo;It's just a simple functional language&rdquo; is an
500     unregisterised trademark of Peyton Jones Enterprises, plc.)</para>
501
502   </sect2>
503
504   <sect2 id="unreg">
505     <title>Unregisterised compilation</title>
506     <indexterm><primary>unregisterised compilation</primary></indexterm>
507
508     <para>The term "unregisterised" really means "compile via vanilla
509     C", disabling some of the platform-specific tricks that GHC
510     normally uses to make programs go faster.  When compiling
511     unregisterised, GHC simply generates a C file which is compiled
512     via gcc.</para>
513
514     <para>Unregisterised compilation can be useful when porting GHC to
515     a new machine, since it reduces the prerequisite tools to
516     <command>gcc</command>, <command>as</command>, and
517     <command>ld</command> and nothing more, and furthermore the amount
518     of platform-specific code that needs to be written in order to get
519     unregisterised compilation going is usually fairly small.</para>
520
521     <variablelist>
522       <varlistentry>
523         <term>
524           <option>-unreg</option>:
525           <indexterm><primary><option>-unreg</option></primary></indexterm>
526         </term>
527         <listitem>
528           <para>Compile via vanilla ANSI C only, turning off
529           platform-specific optimisations.  NOTE: in order to use
530           <option>-unreg</option>, you need to have a set of libraries
531           (including the RTS) built for unregisterised compilation.
532           This amounts to building GHC with way "u" enabled.</para>
533         </listitem>
534       </varlistentry>
535     </variablelist>
536   </sect2>
537
538 </sect1>
539
540 <!-- Emacs stuff:
541      ;;; Local Variables: ***
542      ;;; mode: xml ***
543      ;;; sgml-parent-document: ("users_guide.xml" "book" "chapter" "sect1") ***
544      ;;; End: ***
545  -->