3aa75c070f2fa2d26470938acf60117416bdd65c
[ghc-hetmet.git] / compiler / codeGen / CodeGen.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 The Code Generator
7
8 This module says how things get going at the top level.
9
10 @codeGen@ is the interface to the outside world.  The \tr{cgTop*}
11 functions drive the mangling of top-level bindings.
12
13 \begin{code}
14 {-# OPTIONS_GHC -w #-}
15 -- The above warning supression flag is a temporary kludge.
16 -- While working on this module you are encouraged to remove it and fix
17 -- any warnings in the module. See
18 --     http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
19 -- for details
20
21 module CodeGen ( codeGen ) where
22
23 #include "HsVersions.h"
24
25 -- Kludge (??) so that CgExpr is reached via at least one non-SOURCE
26 -- import.  Before, that wasn't the case, and CM therefore didn't 
27 -- bother to compile it.
28 import CgExpr           ( {-NOTHING!-} )        -- DO NOT DELETE THIS IMPORT
29 import CgProf
30 import CgMonad
31 import CgBindery
32 import CgClosure
33 import CgCon
34 import CgUtils
35 import CgHpc
36
37 import CLabel
38 import Cmm
39 import CmmUtils
40 import PprCmm
41 import MachOp
42
43 import StgSyn
44 import PrelNames
45 import DynFlags
46 import StaticFlags
47
48 import PackageConfig
49 import HscTypes
50 import CostCentre
51 import Id
52 import Name
53 import OccName
54 import TyCon
55 import Module
56 import ErrUtils
57
58 #ifdef DEBUG
59 import Panic
60 #endif
61 \end{code}
62
63 \begin{code}
64 codeGen :: DynFlags
65         -> Module
66         -> [TyCon]
67         -> [Module]             -- directly-imported modules
68         -> CollectedCCs         -- (Local/global) cost-centres needing declaring/registering.
69         -> [(StgBinding,[(Id,[Id])])]   -- Bindings to convert, with SRTs
70         -> HpcInfo
71         -> IO [Cmm]             -- Output
72
73 codeGen dflags this_mod data_tycons imported_mods 
74         cost_centre_info stg_binds hpc_info
75   = do  
76   { showPass dflags "CodeGen"
77   ; let way = buildTag dflags
78         main_mod = mainModIs dflags
79
80 -- Why?
81 --   ; mapM_ (\x -> seq x (return ())) data_tycons
82
83   ; code_stuff <- initC dflags this_mod $ do 
84                 { cmm_binds  <- mapM (getCmm . cgTopBinding dflags) stg_binds
85                 ; cmm_tycons <- mapM cgTyCon data_tycons
86                 ; cmm_init   <- getCmm (mkModuleInit way cost_centre_info 
87                                              this_mod main_mod
88                                              imported_mods hpc_info)
89                 ; return (cmm_binds ++ concat cmm_tycons ++ [cmm_init])
90                 }
91                 -- Put datatype_stuff after code_stuff, because the
92                 -- datatype closure table (for enumeration types) to
93                 -- (say) PrelBase_True_closure, which is defined in
94                 -- code_stuff
95
96   ; dumpIfSet_dyn dflags Opt_D_dump_cmm "Cmm" (pprCmms code_stuff)
97
98   ; return code_stuff }
99 \end{code}
100
101 %************************************************************************
102 %*                                                                      *
103 \subsection[codegen-init]{Module initialisation code}
104 %*                                                                      *
105 %************************************************************************
106
107 /* -----------------------------------------------------------------------------
108    Module initialisation
109
110    The module initialisation code looks like this, roughly:
111
112         FN(__stginit_Foo) {
113           JMP_(__stginit_Foo_1_p)
114         }
115
116         FN(__stginit_Foo_1_p) {
117         ...
118         }
119
120    We have one version of the init code with a module version and the
121    'way' attached to it.  The version number helps to catch cases
122    where modules are not compiled in dependency order before being
123    linked: if a module has been compiled since any modules which depend on
124    it, then the latter modules will refer to a different version in their
125    init blocks and a link error will ensue.
126
127    The 'way' suffix helps to catch cases where modules compiled in different
128    ways are linked together (eg. profiled and non-profiled).
129
130    We provide a plain, unadorned, version of the module init code
131    which just jumps to the version with the label and way attached.  The
132    reason for this is that when using foreign exports, the caller of
133    startupHaskell() must supply the name of the init function for the "top"
134    module in the program, and we don't want to require that this name
135    has the version and way info appended to it.
136    --------------------------------------------------------------------------  */
137
138 We initialise the module tree by keeping a work-stack, 
139         * pointed to by Sp
140         * that grows downward
141         * Sp points to the last occupied slot
142
143
144 \begin{code}
145 mkModuleInit 
146         :: String               -- the "way"
147         -> CollectedCCs         -- cost centre info
148         -> Module
149         -> Module               -- name of the Main module
150         -> [Module]
151         -> HpcInfo
152         -> Code
153 mkModuleInit way cost_centre_info this_mod main_mod imported_mods hpc_info
154   = do  { -- Allocate the static boolean that records if this
155           -- module has been registered already
156           emitData Data [CmmDataLabel moduleRegdLabel, 
157                          CmmStaticLit zeroCLit]
158
159         ; whenC (opt_Hpc) $
160               hpcTable this_mod hpc_info
161
162           -- we emit a recursive descent module search for all modules
163           -- and *choose* to chase it in :Main, below.
164           -- In this way, Hpc enabled modules can interact seamlessly with
165           -- not Hpc enabled moduled, provided Main is compiled with Hpc.
166
167         ; emitSimpleProc real_init_lbl $ do
168                        { ret_blk <- forkLabelledCode ret_code
169
170                         ; init_blk <- forkLabelledCode $ do
171                                         { mod_init_code; stmtC (CmmBranch ret_blk) }
172                                     
173                         ; stmtC (CmmCondBranch (cmmNeWord (CmmLit zeroCLit) mod_reg_val)
174                                     ret_blk)
175                         ; stmtC (CmmBranch init_blk)        
176                         }
177
178             -- Make the "plain" procedure jump to the "real" init procedure
179         ; emitSimpleProc plain_init_lbl jump_to_init
180
181         -- When compiling the module in which the 'main' function lives,
182         -- (that is, this_mod == main_mod)
183         -- we inject an extra stg_init procedure for stg_init_ZCMain, for the 
184         -- RTS to invoke.  We must consult the -main-is flag in case the
185         -- user specified a different function to Main.main
186  
187         -- Notice that the recursive descent is optional, depending on what options
188         -- are enabled.
189
190         ; whenC (this_mod == main_mod)
191                 (emitSimpleProc plain_main_init_lbl rec_descent_init)
192     }
193   where
194     plain_init_lbl = mkPlainModuleInitLabel this_mod
195     real_init_lbl  = mkModuleInitLabel this_mod way
196     plain_main_init_lbl = mkPlainModuleInitLabel rOOT_MAIN
197
198     jump_to_init = stmtC (CmmJump (mkLblExpr real_init_lbl) [])
199
200     mod_reg_val = CmmLoad (mkLblExpr moduleRegdLabel) wordRep
201
202     -- Main refers to GHC.TopHandler.runIO, so make sure we call the
203     -- init function for GHC.TopHandler.
204     extra_imported_mods
205         | this_mod == main_mod = [gHC_TOP_HANDLER]
206         | otherwise            = []
207
208     mod_init_code = do
209         {       -- Set mod_reg to 1 to record that we've been here
210           stmtC (CmmStore (mkLblExpr moduleRegdLabel) (CmmLit (mkIntCLit 1)))
211
212         ; whenC (opt_SccProfilingOn) $ do 
213             initCostCentres cost_centre_info
214
215         ; whenC (opt_Hpc) $
216             initHpc this_mod hpc_info
217          
218         ; mapCs (registerModuleImport way)
219                 (imported_mods++extra_imported_mods)
220
221         } 
222
223                     -- The return-code pops the work stack by 
224                     -- incrementing Sp, and then jumpd to the popped item
225     ret_code = stmtsC [ CmmAssign spReg (cmmRegOffW spReg 1)
226                       , CmmJump (CmmLoad (cmmRegOffW spReg (-1)) wordRep) [] ]
227
228
229     rec_descent_init = if opt_SccProfilingOn || isHpcUsed hpc_info
230                        then jump_to_init
231                        else ret_code
232
233 -----------------------
234 registerModuleImport :: String -> Module -> Code
235 registerModuleImport way mod
236   | mod == gHC_PRIM
237   = nopC 
238   | otherwise   -- Push the init procedure onto the work stack
239   = stmtsC [ CmmAssign spReg (cmmRegOffW spReg (-1))
240            , CmmStore (CmmReg spReg) (mkLblExpr (mkModuleInitLabel mod way)) ]
241 \end{code}
242
243
244
245 Cost-centre profiling: Besides the usual stuff, we must produce
246 declarations for the cost-centres defined in this module;
247
248 (The local cost-centres involved in this are passed into the
249 code-generator.)
250
251 \begin{code}
252 initCostCentres :: CollectedCCs -> Code
253 -- Emit the declarations, and return code to register them
254 initCostCentres (local_CCs, ___extern_CCs, singleton_CCSs)
255   | not opt_SccProfilingOn = nopC
256   | otherwise
257   = do  { mapM_ emitCostCentreDecl       local_CCs
258         ; mapM_ emitCostCentreStackDecl  singleton_CCSs
259         ; mapM_ emitRegisterCC           local_CCs
260         ; mapM_ emitRegisterCCS          singleton_CCSs
261         }
262 \end{code}
263
264 %************************************************************************
265 %*                                                                      *
266 \subsection[codegen-top-bindings]{Converting top-level STG bindings}
267 %*                                                                      *
268 %************************************************************************
269
270 @cgTopBinding@ is only used for top-level bindings, since they need
271 to be allocated statically (not in the heap) and need to be labelled.
272 No unboxed bindings can happen at top level.
273
274 In the code below, the static bindings are accumulated in the
275 @MkCgState@, and transferred into the ``statics'' slot by @forkStatics@.
276 This is so that we can write the top level processing in a compositional
277 style, with the increasing static environment being plumbed as a state
278 variable.
279
280 \begin{code}
281 cgTopBinding :: DynFlags -> (StgBinding,[(Id,[Id])]) -> Code
282 cgTopBinding dflags (StgNonRec id rhs, srts)
283   = do  { id' <- maybeExternaliseId dflags id
284         ; mapM_ (mkSRT [id']) srts
285         ; (id,info) <- cgTopRhs id' rhs
286         ; addBindC id info      -- Add the *un-externalised* Id to the envt,
287                                 -- so we find it when we look up occurrences
288         }
289
290 cgTopBinding dflags (StgRec pairs, srts)
291   = do  { let (bndrs, rhss) = unzip pairs
292         ; bndrs' <- mapFCs (maybeExternaliseId dflags) bndrs
293         ; let pairs' = zip bndrs' rhss
294         ; mapM_ (mkSRT bndrs')  srts
295         ; _new_binds <- fixC (\ new_binds -> do 
296                 { addBindsC new_binds
297                 ; mapFCs ( \ (b,e) -> cgTopRhs b e ) pairs' })
298         ; nopC }
299
300 mkSRT :: [Id] -> (Id,[Id]) -> Code
301 mkSRT these (id,[])  = nopC
302 mkSRT these (id,ids)
303   = do  { ids <- mapFCs remap ids
304         ; id  <- remap id
305         ; emitRODataLits (mkSRTLabel (idName id)) 
306                        (map (CmmLabel . mkClosureLabel . idName) ids)
307         }
308   where
309         -- Sigh, better map all the ids against the environment in 
310         -- case they've been externalised (see maybeExternaliseId below).
311     remap id = case filter (==id) these of
312                 (id':_) -> returnFC id'
313                 [] -> do { info <- getCgIdInfo id; return (cgIdInfoId info) }
314
315 -- Urgh!  I tried moving the forkStatics call from the rhss of cgTopRhs
316 -- to enclose the listFCs in cgTopBinding, but that tickled the
317 -- statics "error" call in initC.  I DON'T UNDERSTAND WHY!
318
319 cgTopRhs :: Id -> StgRhs -> FCode (Id, CgIdInfo)
320         -- The Id is passed along for setting up a binding...
321         -- It's already been externalised if necessary
322
323 cgTopRhs bndr (StgRhsCon cc con args)
324   = forkStatics (cgTopRhsCon bndr con args)
325
326 cgTopRhs bndr (StgRhsClosure cc bi fvs upd_flag srt args body)
327   = ASSERT(null fvs)    -- There should be no free variables
328     setSRTLabel (mkSRTLabel (idName bndr)) $
329     setSRT srt $
330     forkStatics (cgTopRhsClosure bndr cc bi upd_flag args body)
331 \end{code}
332
333
334 %************************************************************************
335 %*                                                                      *
336 \subsection{Stuff to support splitting}
337 %*                                                                      *
338 %************************************************************************
339
340 If we're splitting the object, we need to externalise all the top-level names
341 (and then make sure we only use the externalised one in any C label we use
342 which refers to this name).
343
344 \begin{code}
345 maybeExternaliseId :: DynFlags -> Id -> FCode Id
346 maybeExternaliseId dflags id
347   | dopt Opt_SplitObjs dflags,  -- Externalise the name for -split-objs
348     isInternalName name = do { mod <- getModuleName
349                              ; returnFC (setIdName id (externalise mod)) }
350   | otherwise           = returnFC id
351   where
352     externalise mod = mkExternalName uniq mod new_occ loc
353     name    = idName id
354     uniq    = nameUnique name
355     new_occ = mkLocalOcc uniq (nameOccName name)
356     loc     = nameSrcSpan name
357         -- We want to conjure up a name that can't clash with any
358         -- existing name.  So we generate
359         --      Mod_$L243foo
360         -- where 243 is the unique.
361 \end{code}