+
+#ifdef DEBUG
+import Outputable
+#endif
+\end{code}
+
+\begin{code}
+codeGen :: DynFlags
+ -> Module -- Module name
+ -> [Module] -- Import names
+ -> CollectedCCs -- (Local/global) cost-centres needing declaring/registering.
+ -> [Id] -- foreign-exported binders
+ -> [TyCon] -- Local tycons, including ones from classes
+ -> [(StgBinding,[Id])] -- Bindings to convert, with SRTs
+ -> IO AbstractC -- Output
+
+codeGen dflags mod_name imported_modules cost_centre_info fe_binders
+ tycons stg_binds
+ = do { showPass dflags "CodeGen"
+ ; fl_uniqs <- mkSplitUniqSupply 'f'
+ ; dumpIfSet_dyn dflags Opt_D_dump_absC "Abstract C" (dumpRealC abstractC)
+ ; let flat_abstractC = flattenAbsC fl_uniqs abstractC
+ ; return flat_abstractC
+ }
+ where
+ data_tycons = filter isDataTyCon tycons
+ cinfo = MkCompInfo mod_name
+
+ datatype_stuff = genStaticConBits cinfo data_tycons
+ code_stuff = initC cinfo (mapCs cgTopBinding stg_binds)
+ init_stuff = mkModuleInit fe_binders mod_name imported_modules
+ cost_centre_info
+
+ abstractC = mkAbstractCs [ maybeSplitCode,
+ init_stuff,
+ code_stuff,
+ datatype_stuff]
+ -- Put datatype_stuff after code_stuff, because the
+ -- datatype closure table (for enumeration types)
+ -- to (say) PrelBase_True_closure, which is defined in code_stuff
+