2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[CodeGen]{@CodeGen@: main module of the code generator}
6 This module says how things get going at the top level.
8 @codeGen@ is the interface to the outside world. The \tr{cgTop*}
9 functions drive the mangling of top-level bindings.
11 %************************************************************************
13 \subsection[codeGen-outside-interface]{The code generator's offering to the world}
15 %************************************************************************
18 module CodeGen ( codeGen ) where
20 #include "HsVersions.h"
25 import CLabel ( CLabel, mkSRTLabel, mkClosureLabel, mkModuleInitLabel )
27 import PprAbsC ( dumpRealC )
28 import AbsCUtils ( mkAbstractCs, flattenAbsC )
29 import CgBindery ( CgIdInfo, addBindC, addBindsC )
30 import CgClosure ( cgTopRhsClosure )
31 import CgCon ( cgTopRhsCon )
32 import CgConTbls ( genStaticConBits )
33 import ClosureInfo ( mkClosureLFInfo )
34 import CmdLineOpts ( opt_SccProfilingOn, opt_EnsureSplittableC,
37 import CostCentre ( CostCentre, CostCentreStack )
38 import Id ( Id, idName )
39 import Module ( Module, moduleString, moduleName,
41 import PrimRep ( getPrimRepSize, PrimRep(..) )
43 import TyCon ( TyCon, isDataTyCon )
44 import Class ( Class, classTyCon )
45 import BasicTypes ( TopLevelFlag(..) )
46 import UniqSupply ( mkSplitUniqSupply )
47 import ErrUtils ( dumpIfSet )
49 import Panic ( assertPanic )
55 codeGen :: Module -- Module name
56 -> [ModuleName] -- Import names
57 -> ([CostCentre], -- Local cost-centres needing declaring/registering
58 [CostCentre], -- "extern" cost-centres needing declaring
59 [CostCentreStack]) -- Pre-defined "singleton" cost centre stacks
60 -> [Id] -- foreign-exported binders
61 -> [TyCon] -> [Class] -- Local tycons and classes
62 -> [(StgBinding,[Id])] -- Bindings to convert, with SRTs
63 -> IO AbstractC -- Output
65 codeGen mod_name imported_modules cost_centre_info fe_binders
66 tycons classes stg_binds
67 = mkSplitUniqSupply 'f' >>= \ fl_uniqs -> -- absC flattener
69 datatype_stuff = genStaticConBits cinfo data_tycons
70 code_stuff = initC cinfo (cgTopBindings maybe_split stg_binds)
71 init_stuff = mkModuleInit fe_binders mod_name imported_modules
74 abstractC = mkAbstractCs [ maybe_split,
78 -- Put datatype_stuff after code_stuff, because the
79 -- datatype closure table (for enumeration types)
80 -- to (say) PrelBase_True_closure, which is defined in code_stuff
82 flat_abstractC = flattenAbsC fl_uniqs abstractC
84 dumpIfSet opt_D_dump_absC "Abstract C" (dumpRealC abstractC) >>
88 data_tycons = filter isDataTyCon (tycons ++ map classTyCon classes)
89 -- Generate info tables for the data constrs arising
90 -- from class decls as well
92 maybe_split = if opt_EnsureSplittableC
95 cinfo = MkCompInfo mod_name
98 %************************************************************************
100 \subsection[codegen-init]{Module initialisation code}
102 %************************************************************************
106 :: [Id] -- foreign exported functions
107 -> Module -- module name
108 -> [ModuleName] -- import names
109 -> ([CostCentre], -- cost centre info
113 mkModuleInit fe_binders mod imps cost_centre_info
116 map (\f -> CMacroStmt REGISTER_FOREIGN_EXPORT [f]) fe_labels
119 map (\f -> CLbl (mkClosureLabel (idName f)) PtrRep) fe_binders
121 (cc_decls, cc_regs) = mkCostCentreStuff cost_centre_info
123 mk_import_register import_name
124 = CMacroStmt REGISTER_IMPORT [
125 CLbl (mkModuleInitLabel import_name) AddrRep
128 register_imports = map mk_import_register imps
132 CModuleInitBlock (mkModuleInitLabel (Module.moduleName mod))
133 (mkAbstractCs (register_fes ++
139 Cost-centre profiling: Besides the usual stuff, we must produce
140 declarations for the cost-centres defined in this module;
142 (The local cost-centres involved in this are passed into the
146 mkCostCentreStuff (local_CCs, extern_CCs, singleton_CCSs)
147 | not opt_SccProfilingOn = (AbsCNop, AbsCNop)
150 map (CCostCentreDecl True) local_CCs ++
151 map (CCostCentreDecl False) extern_CCs ++
152 map CCostCentreStackDecl singleton_CCSs),
153 mkAbstractCs (mkCcRegister local_CCs singleton_CCSs)
156 mkCcRegister ccs cc_stacks
158 register_ccs = mkAbstractCs (map mk_register ccs)
159 register_cc_stacks = mkAbstractCs (map mk_register_ccs cc_stacks)
161 [ register_ccs, register_cc_stacks ]
164 = CCallProfCCMacro SLIT("REGISTER_CC") [mkCCostCentre cc]
167 = CCallProfCCMacro SLIT("REGISTER_CCS") [mkCCostCentreStack ccs]
170 %************************************************************************
172 \subsection[codegen-top-bindings]{Converting top-level STG bindings}
174 %************************************************************************
176 @cgTopBindings@ is only used for top-level bindings, since they need
177 to be allocated statically (not in the heap) and need to be labelled.
178 No unboxed bindings can happen at top level.
180 In the code below, the static bindings are accumulated in the
181 @MkCgState@, and transferred into the ``statics'' slot by @forkStatics@.
182 This is so that we can write the top level processing in a compositional
183 style, with the increasing static environment being plumbed as a state
187 cgTopBindings :: AbstractC -> [(StgBinding,[Id])] -> Code
189 cgTopBindings split bindings = mapCs (cgTopBinding split) bindings
191 cgTopBinding :: AbstractC -> (StgBinding,[Id]) -> Code
193 cgTopBinding split ((StgNonRec name rhs), srt)
195 absC (mkSRT srt_label srt) `thenC`
196 setSRTLabel srt_label (
197 cgTopRhs name rhs `thenFC` \ (name, info) ->
201 srt_label = mkSRTLabel (idName name)
203 cgTopBinding split ((StgRec pairs@((name,rhs):_)), srt)
205 absC (mkSRT srt_label srt) `thenC`
206 setSRTLabel srt_label (
207 fixC (\ new_binds -> addBindsC new_binds `thenC`
208 mapFCs ( \ (b,e) -> cgTopRhs b e ) pairs
209 ) `thenFC` \ new_binds ->
213 srt_label = mkSRTLabel (idName name)
215 mkSRT :: CLabel -> [Id] -> AbstractC
216 mkSRT lbl [] = AbsCNop
217 mkSRT lbl ids = CSRT lbl (map (mkClosureLabel . idName) ids)
219 -- Urgh! I tried moving the forkStatics call from the rhss of cgTopRhs
220 -- to enclose the listFCs in cgTopBinding, but that tickled the
221 -- statics "error" call in initC. I DON'T UNDERSTAND WHY!
223 cgTopRhs :: Id -> StgRhs -> FCode (Id, CgIdInfo)
224 -- the Id is passed along for setting up a binding...
226 cgTopRhs bndr (StgRhsCon cc con args)
227 = forkStatics (cgTopRhsCon bndr con args)
229 cgTopRhs bndr (StgRhsClosure cc bi srt fvs upd_flag args body)
230 = ASSERT(null fvs) -- There should be no free variables
231 getSRTLabel `thenFC` \srt_label ->
233 mkClosureLFInfo bndr TopLevel [{-no fvs-}] upd_flag args srt_label srt
235 forkStatics (cgTopRhsClosure bndr cc bi args body lf_info)