- core_prs <- dsTopLHsBinds auto_scc binds_cvr
- (ds_fords, foreign_prs) <- dsForeigns fords
- let all_prs = foreign_prs ++ core_prs
- ds_rules <- mapM dsRule rules
- return (all_prs, catMaybes ds_rules, ds_fords, ds_hpc_info, modBreaks)
-
- ; case mb_res of {
- Nothing -> return (msgs, Nothing) ;
- Just (all_prs, ds_rules, ds_fords,ds_hpc_info, modBreaks) -> do
-
- { -- Add export flags to bindings
- keep_alive <- readIORef keep_var
- ; let final_prs = addExportFlags target export_set
- keep_alive all_prs ds_rules
- ds_binds = [Rec final_prs]
- -- Notice that we put the whole lot in a big Rec, even the foreign binds
- -- When compiling PrelFloat, which defines data Float = F# Float#
- -- we want F# to be in scope in the foreign marshalling code!
- -- You might think it doesn't matter, but the simplifier brings all top-level
- -- things into the in-scope set before simplifying; so we get no unfolding for F#!
-
- -- Lint result if necessary
- ; endPass dflags "Desugar" Opt_D_dump_ds ds_binds
-
- -- Dump output
- ; doIfSet (dopt Opt_D_dump_ds dflags)
- (printDump (ppr_ds_rules ds_rules))
-
- ; used_names <- mkUsedNames tcg_env
- ; deps <- mkDependencies tcg_env
+ do { ds_ev_binds <- dsEvBinds ev_binds
+ ; core_prs <- dsTopLHsBinds auto_scc binds_cvr
+ ; (spec_prs, spec_rules) <- dsImpSpecs imp_specs
+ ; (ds_fords, foreign_prs) <- dsForeigns fords
+ ; ds_rules <- mapMaybeM dsRule rules
+ ; ds_vects <- mapM dsVect vects
+ ; let hpc_init
+ | opt_Hpc = hpcInitCode mod ds_hpc_info
+ | otherwise = empty
+ ; return ( ds_ev_binds
+ , foreign_prs `appOL` core_prs `appOL` spec_prs
+ , spec_rules ++ ds_rules, ds_vects
+ , ds_fords `appendStubC` hpc_init
+ , ds_hpc_info, modBreaks) }
+
+ ; case mb_res of {
+ Nothing -> return (msgs, Nothing) ;
+ Just (ds_ev_binds, all_prs, all_rules, vects0, ds_fords, ds_hpc_info, modBreaks) -> do
+
+ { -- Add export flags to bindings
+ keep_alive <- readIORef keep_var
+ ; let (rules_for_locals, rules_for_imps)
+ = partition isLocalRule all_rules
+ final_prs = addExportFlagsAndRules target
+ export_set keep_alive rules_for_locals (fromOL all_prs)
+
+ final_pgm = combineEvBinds ds_ev_binds final_prs
+ -- Notice that we put the whole lot in a big Rec, even the foreign binds
+ -- When compiling PrelFloat, which defines data Float = F# Float#
+ -- we want F# to be in scope in the foreign marshalling code!
+ -- You might think it doesn't matter, but the simplifier brings all top-level
+ -- things into the in-scope set before simplifying; so we get no unfolding for F#!
+
+ -- Lint result if necessary, and print
+ ; dumpIfSet_dyn dflags Opt_D_dump_ds "Desugared, before opt" $
+ (vcat [ pprCoreBindings final_pgm
+ , pprRules rules_for_imps ])
+
+ ; (ds_binds, ds_rules_for_imps, ds_vects)
+ <- simpleOptPgm dflags final_pgm rules_for_imps vects0
+ -- The simpleOptPgm gets rid of type
+ -- bindings plus any stupid dead code
+
+ ; endPass dflags CoreDesugar ds_binds ds_rules_for_imps
+
+ ; let used_names = mkUsedNames tcg_env
+ ; deps <- mkDependencies tcg_env