+
+codeGen :: DynFlags
+ -> Module -- Module name
+ -> [Module] -- Import names
+ -> ([CostCentre], -- Local cost-centres needing declaring/registering
+ [CostCentre], -- "extern" cost-centres needing declaring
+ [CostCentreStack]) -- Pre-defined "singleton" cost centre stacks
+ -> [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'
+ ; let
+ datatype_stuff = genStaticConBits cinfo data_tycons
+ code_stuff = initC cinfo (cgTopBindings maybe_split stg_binds)
+ init_stuff = mkModuleInit fe_binders mod_name imported_modules
+ cost_centre_info
+
+ abstractC = mkAbstractCs [ maybe_split,
+ 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
+
+ flat_abstractC = flattenAbsC fl_uniqs abstractC
+
+ ; dumpIfSet_dyn dflags Opt_D_dump_absC "Abstract C" (dumpRealC abstractC)
+ ; return flat_abstractC
+ }
+ where
+ data_tycons = filter isDataTyCon tycons
+
+ maybe_split = if opt_EnsureSplittableC
+ then CSplitMarker
+ else AbsCNop
+ cinfo = MkCompInfo mod_name
+\end{code}
+
+%************************************************************************
+%* *
+\subsection[codegen-init]{Module initialisation code}
+%* *
+%************************************************************************
+
+\begin{code}
+mkModuleInit
+ :: [Id] -- foreign exported functions
+ -> Module -- module name
+ -> [Module] -- import names
+ -> ([CostCentre], -- cost centre info
+ [CostCentre],
+ [CostCentreStack])
+ -> AbstractC
+mkModuleInit fe_binders mod imps cost_centre_info