2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1996
4 \section[GHC_Main]{Main driver for Glasgow Haskell compiler}
7 #include "HsVersions.h"
9 module Main ( main ) where
12 IMPORT_1_3(IO(hGetContents,stdin,stderr,hPutStr,hClose,openFile,IOMode(..)))
15 import RdrHsSyn ( RdrName )
17 import ReadPrefix ( rdModule )
18 import Rename ( renameModule )
19 import RnMonad ( ExportEnv )
21 import MkIface -- several functions
22 import TcModule ( typecheckModule )
23 import Desugar ( deSugar, DsMatchContext, pprDsWarnings )
24 import SimplCore ( core2core )
25 import CoreToStg ( topCoreBindsToStg )
26 import StgSyn ( collectFinalStgBinders )
27 import SimplStg ( stg2stg )
28 import CodeGen ( codeGen )
29 #if ! OMIT_NATIVE_CODEGEN
30 import AsmCodeGen ( dumpRealAsm, writeRealAsm )
33 import AbsCSyn ( absCNop, AbstractC )
34 import AbsCUtils ( flattenAbsC )
35 import CoreUnfold ( Unfolding )
36 import Bag ( emptyBag, isEmptyBag )
38 import ErrUtils ( pprBagOfErrors, ghcExit )
39 import Maybes ( maybeToBool, MaybeErr(..) )
40 import Specialise ( SpecialiseData(..) )
41 import StgSyn ( pprPlainStgBinding, GenStgBinding )
42 import TcInstUtil ( InstInfo )
43 import TyCon ( isDataTyCon )
44 import UniqSupply ( mkSplitUniqSupply )
46 import PprAbsC ( dumpRealC, writeRealC )
47 import PprCore ( pprCoreBinding )
48 import PprStyle ( PprStyle(..) )
51 import Id ( GenId ) -- instances
52 import Name ( Name ) -- instances
53 import PprType ( GenType, GenTyVar ) -- instances
54 import TyVar ( GenTyVar ) -- instances
55 import Unique ( Unique ) -- instances
60 = hGetContents stdin >>= \ input_pgm ->
62 cmd_line_info = classifyOpts
64 doIt cmd_line_info input_pgm
68 doIt :: ([CoreToDo], [StgToDo]) -> String -> IO ()
70 doIt (core_cmds, stg_cmds) input_pgm
71 = doDump opt_Verbose "Glasgow Haskell Compiler, version 2.02, for Haskell 1.3" "" >>
76 rdModule >>= \ (mod_name, rdr_module) ->
78 doDump opt_D_dump_rdr "Reader:"
79 (pp_show (ppr pprStyle rdr_module)) >>
81 doDump opt_D_source_stats "\nSource Statistics:"
82 (pp_show (ppSourceStats rdr_module)) >>
84 -- UniqueSupplies for later use (these are the only lower case uniques)
85 mkSplitUniqSupply 'r' >>= \ rn_uniqs -> -- renamer
86 mkSplitUniqSupply 'a' >>= \ tc_uniqs -> -- typechecker
87 mkSplitUniqSupply 'd' >>= \ ds_uniqs -> -- desugarer
88 mkSplitUniqSupply 's' >>= \ sm_uniqs -> -- core-to-core simplifier
89 mkSplitUniqSupply 'c' >>= \ c2s_uniqs -> -- core-to-stg
90 mkSplitUniqSupply 'g' >>= \ st_uniqs -> -- stg-to-stg passes
91 mkSplitUniqSupply 'f' >>= \ fl_uniqs -> -- absC flattener
92 mkSplitUniqSupply 'n' >>= \ ncg_uniqs -> -- native-code generator
95 show_pass "Renamer" >>
98 renameModule rn_uniqs rdr_module >>=
99 \ (maybe_rn_stuff, rn_errs_bag, rn_warns_bag) ->
101 checkErrors rn_errs_bag rn_warns_bag >>
102 case maybe_rn_stuff of {
103 Nothing -> -- Hurrah! Renamer reckons that there's no need to
105 hPutStr stderr "No recompilation required!\n" >>
108 -- Oh well, we've got to recompile for real
109 Just (rn_mod, iface_file_stuff, rn_name_supply, imported_modules) ->
113 doDump opt_D_dump_rn "Renamer:"
114 (pp_show (ppr pprStyle rn_mod)) >>
116 -- Safely past renaming: we can start the interface file:
117 -- (the iface file is produced incrementally, as we have
118 -- the information that we need...; we use "iface<blah>")
119 -- "endIface" finishes the job.
120 startIface mod_name >>= \ if_handle ->
121 ifaceMain if_handle iface_file_stuff >>
124 -- ******* TYPECHECKER
125 show_pass "TypeCheck" >>
127 case (case (typecheckModule tc_uniqs {-idinfo_fm-} rn_name_supply rn_mod) of
128 Succeeded (stuff, warns)
129 -> (emptyBag, warns, stuff)
131 -> (errs, warns, error "tc_results"))
133 of { (tc_errs_bag, tc_warns_bag, tc_results) ->
135 checkErrors tc_errs_bag tc_warns_bag >>
138 of { (typechecked_quint@(recsel_binds, class_binds, inst_binds, val_binds, const_binds),
139 local_tycons, inst_info, pragma_tycon_specs,
142 doDump opt_D_dump_tc "Typechecked:"
144 ppr pprStyle recsel_binds,
145 ppr pprStyle class_binds,
146 ppr pprStyle inst_binds,
147 ppAboves (map (\ (i,e) -> ppr pprStyle (VarMonoBind i e)) const_binds),
148 ppr pprStyle val_binds])) >>
150 doDump opt_D_dump_deriv "Derived instances:"
151 (pp_show (ddump_deriv pprStyle)) >>
154 show_pass "DeSugar " >>
157 (desugared,ds_warnings)
158 = deSugar ds_uniqs mod_name typechecked_quint
160 (if isEmptyBag ds_warnings then
163 hPutStr stderr (ppShow pprCols (pprDsWarnings pprErrorsStyle ds_warnings))
164 >> hPutStr stderr "\n"
167 doDump opt_D_dump_ds "Desugared:" (pp_show (ppAboves
168 (map (pprCoreBinding pprStyle) desugared)))
171 -- ******* CORE-TO-CORE SIMPLIFICATION (NB: I/O op)
172 show_pass "Core2Core" >>
175 local_data_tycons = filter isDataTyCon local_tycons
177 core2core core_cmds mod_name pprStyle
178 sm_uniqs local_data_tycons pragma_tycon_specs desugared
182 SpecData _ _ _ gen_tycons all_tycon_specs _ _ _) ->
184 doDump opt_D_dump_simpl "Simplified:" (pp_show (ppAboves
185 (map (pprCoreBinding pprStyle) simplified)))
188 -- ******* STG-TO-STG SIMPLIFICATION
189 show_pass "Core2Stg" >>
192 stg_binds = topCoreBindsToStg c2s_uniqs simplified
195 show_pass "Stg2Stg" >>
197 stg2stg stg_cmds mod_name pprStyle st_uniqs stg_binds
200 \ (stg_binds2, cost_centre_info) ->
202 doDump opt_D_dump_stg "STG syntax:"
203 (pp_show (ppAboves (map (pprPlainStgBinding pprStyle) stg_binds2)))
206 -- Dump instance decls and type signatures into the interface file
208 final_ids = collectFinalStgBinders stg_binds2
210 ifaceDecls if_handle rn_mod inst_info final_ids simplified >>
211 endIface if_handle >>
212 -- We are definitely done w/ interface-file stuff at this point:
213 -- (See comments near call to "startIface".)
216 -- ******* "ABSTRACT", THEN "FLAT", THEN *REAL* C!
217 show_pass "CodeGen" >>
220 abstractC = codeGen mod_name -- module name for CC labelling
222 imported_modules -- import names for CC registering
223 gen_tycons -- type constructors generated locally
224 all_tycon_specs -- tycon specialisations
227 flat_abstractC = flattenAbsC fl_uniqs abstractC
229 doDump opt_D_dump_absC "Abstract C:"
230 (dumpRealC abstractC) >>
232 doDump opt_D_dump_flatC "Flat Abstract C:"
233 (dumpRealC flat_abstractC) >>
235 -- You can have C (c_output) or assembly-language (ncg_output),
236 -- but not both. [Allowing for both gives a space leak on
237 -- flat_abstractC. WDP 94/10]
239 (flat_absC_c, flat_absC_ncg) =
240 case (maybeToBool opt_ProduceC || opt_D_dump_realC,
241 maybeToBool opt_ProduceS || opt_D_dump_asm) of
242 (True, False) -> (flat_abstractC, absCNop)
243 (False, True) -> (absCNop, flat_abstractC)
244 (False, False) -> (absCNop, absCNop)
245 (True, True) -> error "ERROR: Can't do both .hc and .s at the same time"
247 c_output_d = dumpRealC flat_absC_c
248 c_output_w = (\ f -> writeRealC f flat_absC_c)
250 #if OMIT_NATIVE_CODEGEN
251 ncg_output_d = error "*** GHC not built with a native-code generator ***"
252 ncg_output_w = ncg_output_d
254 ncg_output_d = dumpRealAsm flat_absC_ncg ncg_uniqs
255 ncg_output_w = (\ f -> writeRealAsm f flat_absC_ncg ncg_uniqs)
259 doDump opt_D_dump_asm "" ncg_output_d >>
260 doOutput opt_ProduceS ncg_output_w >>
262 doDump opt_D_dump_realC "" c_output_d >>
263 doOutput opt_ProduceC c_output_w >>
268 -------------------------------------------------------------
269 -- ****** printing styles and column width:
272 -------------------------------------------------------------
273 -- ****** help functions:
276 = if opt_D_show_passes
277 then \ what -> hPutStr stderr ("*** "++what++":\n")
278 else \ what -> return ()
280 doOutput switch io_action
284 openFile fname WriteMode >>= \ handle ->
288 doDump switch hdr string
290 then hPutStr stderr hdr >>
291 hPutStr stderr ('\n': string) >>
296 pprCols = (80 :: Int) -- could make configurable
298 (pprStyle, pprErrorsStyle)
299 | opt_PprStyle_All = (PprShowAll, PprShowAll)
300 | opt_PprStyle_Debug = (PprDebug, PprDebug)
301 | opt_PprStyle_User = (PprForUser, PprForUser)
302 | otherwise = (PprDebug, PprForUser)
304 pp_show p = ppShow {-WAS:pprCols-}10000{-random-} p
306 checkErrors errs_bag warns_bag
307 | not (isEmptyBag errs_bag)
308 = hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle errs_bag))
309 >> hPutStr stderr "\n" >>
310 hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle warns_bag))
311 >> hPutStr stderr "\n" >>
314 | not (isEmptyBag warns_bag)
315 = hPutStr stderr (ppShow pprCols (pprBagOfErrors pprErrorsStyle warns_bag)) >>
318 | otherwise = return ()
321 ppSourceStats (HsModule name version exports imports fixities decls src_loc)
322 = ppAboves (map pp_val
323 [("ExportAll ", export_all), -- 1 if no export list
324 ("ExportDecls ", export_ds),
325 ("ExportModules ", export_ms),
326 ("Imports ", import_no),
327 (" ImpQual ", import_qual),
328 (" ImpAs ", import_as),
329 (" ImpAll ", import_all),
330 (" ImpPartial ", import_partial),
331 (" ImpHiding ", import_hiding),
332 ("FixityDecls ", fixity_ds),
333 ("DefaultDecls ", default_ds),
334 ("TypeDecls ", type_ds),
335 ("DataDecls ", data_ds),
336 ("NewTypeDecls ", newt_ds),
337 ("DataConstrs ", data_constrs),
338 ("DataDerivings ", data_derivs),
339 ("ClassDecls ", class_ds),
340 ("ClassMethods ", class_method_ds),
341 ("DefaultMethods ", default_method_ds),
342 ("InstDecls ", inst_ds),
343 ("InstMethods ", inst_method_ds),
344 ("TypeSigs ", bind_tys),
345 ("ValBinds ", val_bind_ds),
346 ("FunBinds ", fn_bind_ds),
347 ("InlineMeths ", method_inlines),
348 ("InlineBinds ", bind_inlines),
349 -- ("SpecialisedData ", data_specs),
350 -- ("SpecialisedInsts ", inst_specs),
351 ("SpecialisedMeths ", method_specs),
352 ("SpecialisedBinds ", bind_specs)
355 pp_val (str, 0) = ppNil
356 pp_val (str, n) = ppBesides [ppStr str, ppInt n]
358 fixity_ds = length fixities
359 type_decls = [d | TyD d@(TySynonym _ _ _ _) <- decls]
360 data_decls = [d | TyD d@(TyData _ _ _ _ _ _ _) <- decls]
361 newt_decls = [d | TyD d@(TyNew _ _ _ _ _ _ _) <- decls]
362 type_ds = length type_decls
363 data_ds = length data_decls
364 newt_ds = length newt_decls
365 class_decls = [d | ClD d <- decls]
366 class_ds = length class_decls
367 inst_decls = [d | InstD d <- decls]
368 inst_ds = length inst_decls
369 default_ds = length [() | DefD _ <- decls]
370 val_decls = [d | ValD d <- decls]
372 real_exports = case exports of { Nothing -> []; Just es -> es }
373 n_exports = length real_exports
374 export_ms = length [() | IEModuleContents _ <- real_exports]
375 export_ds = n_exports - export_ms
376 export_all = case exports of { Nothing -> 1; other -> 0 }
378 (val_bind_ds, fn_bind_ds, bind_tys, bind_specs, bind_inlines)
379 = count_binds (foldr ThenBinds EmptyBinds val_decls)
381 (import_no, import_qual, import_as, import_all, import_partial, import_hiding)
382 = foldr add6 (0,0,0,0,0,0) (map import_info imports)
383 (data_constrs, data_derivs)
384 = foldr add2 (0,0) (map data_info (newt_decls ++ data_decls))
385 (class_method_ds, default_method_ds)
386 = foldr add2 (0,0) (map class_info class_decls)
387 (inst_method_ds, method_specs, method_inlines)
388 = foldr add3 (0,0,0) (map inst_info inst_decls)
391 count_binds EmptyBinds = (0,0,0,0,0)
392 count_binds (ThenBinds b1 b2) = count_binds b1 `add5` count_binds b2
393 count_binds (SingleBind b) = case count_bind b of
394 (vs,fs) -> (vs,fs,0,0,0)
395 count_binds (BindWith b sigs) = case (count_bind b, count_sigs sigs) of
396 ((vs,fs),(ts,_,ss,is)) -> (vs,fs,ts,ss,is)
398 count_bind EmptyBind = (0,0)
399 count_bind (NonRecBind b) = count_monobinds b
400 count_bind (RecBind b) = count_monobinds b
402 count_monobinds EmptyMonoBinds = (0,0)
403 count_monobinds (AndMonoBinds b1 b2) = count_monobinds b1 `add2` count_monobinds b2
404 count_monobinds (PatMonoBind (VarPatIn n) r _) = (1,0)
405 count_monobinds (PatMonoBind p r _) = (0,1)
406 count_monobinds (FunMonoBind f _ m _) = (0,1)
408 count_sigs sigs = foldr add4 (0,0,0,0) (map sig_info sigs)
410 sig_info (Sig _ _ _) = (1,0,0,0)
411 sig_info (ClassOpSig _ _ _ _) = (0,1,0,0)
412 sig_info (SpecSig _ _ _ _) = (0,0,1,0)
413 sig_info (InlineSig _ _) = (0,0,0,1)
414 sig_info _ = (0,0,0,0)
416 import_info (ImportDecl _ qual as spec _)
417 = add6 (1, qual_info qual, as_info as, 0,0,0) (spec_info spec)
422 spec_info Nothing = (0,0,0,1,0,0)
423 spec_info (Just (False, _)) = (0,0,0,0,1,0)
424 spec_info (Just (True, _)) = (0,0,0,0,0,1)
426 data_info (TyData _ _ _ constrs derivs _ _)
427 = (length constrs, case derivs of {Nothing -> 0; Just ds -> length ds})
428 data_info (TyNew _ _ _ constr derivs _ _)
429 = (1, case derivs of {Nothing -> 0; Just ds -> length ds})
431 class_info (ClassDecl _ _ _ meth_sigs def_meths _ _)
432 = case count_sigs meth_sigs of
434 (classops, addpr (count_monobinds def_meths))
436 inst_info (InstDecl _ inst_meths inst_sigs _ _)
437 = case count_sigs inst_sigs of
439 (addpr (count_monobinds inst_meths), ss, is)
443 add2 (x1,x2) (y1,y2) = (x1+y1,x2+y2)
444 add3 (x1,x2,x3) (y1,y2,y3) = (x1+y1,x2+y2,x3+y3)
445 add4 (x1,x2,x3,x4) (y1,y2,y3,y4) = (x1+y1,x2+y2,x3+y3,x4+y4)
446 add5 (x1,x2,x3,x4,x5) (y1,y2,y3,y4,y5) = (x1+y1,x2+y2,x3+y3,x4+y4,x5+y5)
447 add6 (x1,x2,x3,x4,x5,x6) (y1,y2,y3,y4,y5,y6) = (x1+y1,x2+y2,x3+y3,x4+y4,x5+y5,x6+y6)