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