- ; (maybe_stub_h_filename, maybe_stub_c_filename, maybe_ibinds)
- <- restOfCodeGeneration dflags toInterp this_mod
- (map ideclName (hsModuleImports rdr_module))
- cost_centre_info foreign_stuff env_tc stg_binds oa_tidy_binds
- hit (pcs_PIT pcs_tc)
-
- -- and the answer is ...
- ; return (HscRecomp pcs_tc new_details final_iface
- maybe_stub_h_filename maybe_stub_c_filename
- maybe_ibinds)
- }}}}}}}
-
-
-
-mkFinalIface ghci_mode dflags location maybe_old_iface new_iface new_details
- = case completeIface maybe_old_iface new_iface new_details of
- (new_iface, Nothing) -- no change in the interfacfe
- -> do when (dopt Opt_D_dump_hi_diffs dflags)
- (printDump (text "INTERFACE UNCHANGED"))
- dumpIfSet_dyn dflags Opt_D_dump_hi
- "UNCHANGED FINAL INTERFACE" (pprIface new_iface)
- return new_iface
- (new_iface, Just sdoc_diffs)
- -> do dumpIfSet_dyn dflags Opt_D_dump_hi_diffs "INTERFACE HAS CHANGED"
- sdoc_diffs
- dumpIfSet_dyn dflags Opt_D_dump_hi "NEW FINAL INTERFACE"
- (pprIface new_iface)
- -- Write the interface file
- when (ghci_mode /= Interactive)
- (writeIface (unJust "hscRecomp:hi" (ml_hi_file location))
- new_iface)
- return new_iface
-
-
-myParseModule dflags src_filename
- = do -------------------------- Parser ----------------
- showPass dflags "Parser"
- -- _scc_ "Parser"
-
- buf <- hGetStringBuffer True{-expand tabs-} src_filename
-
- let glaexts | dopt Opt_GlasgowExts dflags = 1#
- | otherwise = 0#
-
- case parse buf PState{ bol = 0#, atbol = 1#,
- context = [], glasgow_exts = glaexts,
- loc = mkSrcLoc (_PK_ src_filename) 1 } of {
-
- PFailed err -> do { hPutStrLn stderr (showSDoc err);
- return Nothing };
-
- POk _ (PModule rdr_module@(HsModule mod_name _ _ _ _ _ _)) -> do {
+ ; simpl_result <- {-# SCC "Core2Core" #-}
+ core2core hsc_env flat_result
+
+ -------------------
+ -- TIDY
+ -------------------
+ ; (cg_guts, details) <- {-# SCC "CoreTidy" #-}
+ tidyProgram hsc_env simpl_result
+
+ -- Alive at this point:
+ -- tidy_result, pcs_final
+ -- hsc_env
+
+ -------------------
+ -- BUILD THE NEW ModIface and ModDetails
+ -- and emit external core if necessary
+ -- This has to happen *after* code gen so that the back-end
+ -- info has been set. Not yet clear if it matters waiting
+ -- until after code output
+ ; (new_iface, no_change)
+ <- {-# SCC "MkFinalIface" #-}
+ mkIface hsc_env maybe_old_iface simpl_result details
+
+ ; writeIfaceFile hsc_env (ms_location mod_summary) new_iface no_change
+
+ -- Space leak reduction: throw away the new interface if
+ -- we're in one-shot mode; we won't be needing it any
+ -- more.
+ ; final_iface <- if one_shot then return (error "no final iface")
+ else return new_iface
+
+ -- Build the final ModDetails (except in one-shot mode, where
+ -- we won't need this information after compilation).
+ ; final_details <- if one_shot then return (error "no final details")
+ else return $! details
+
+ -- Emit external core
+ ; emitExternalCore dflags cg_guts
+
+ -------------------
+ -- CONVERT TO STG and COMPLETE CODE GENERATION
+ ; (stub_h_exists, stub_c_exists, maybe_bcos)
+ <- hscCodeGen dflags (ms_location mod_summary) cg_guts
+
+ -- And the answer is ...
+ ; dumpIfaceStats hsc_env
+
+ ; return (HscRecomp final_details
+ final_iface
+ stub_h_exists stub_c_exists
+ maybe_bcos)
+ }
+
+
+
+hscCodeGen dflags location
+ CgGuts{ -- This is the last use of the ModGuts in a compilation.
+ -- From now on, we just use the bits we need.
+ cg_module = this_mod,
+ cg_binds = core_binds,
+ cg_tycons = tycons,
+ cg_dir_imps = dir_imps,
+ cg_foreign = foreign_stubs,
+ cg_home_mods = home_mods,
+ cg_dep_pkgs = dependencies } = do {
+
+ let { data_tycons = filter isDataTyCon tycons } ;
+ -- cg_tycons includes newtypes, for the benefit of External Core,
+ -- but we don't generate any code for newtypes
+
+ -------------------
+ -- PREPARE FOR CODE GENERATION
+ -- Do saturation and convert to A-normal form
+ prepd_binds <- {-# SCC "CorePrep" #-}
+ corePrepPgm dflags core_binds data_tycons ;
+
+ case hscTarget dflags of
+ HscNothing -> return (False, False, Nothing)
+
+ HscInterpreted ->
+#ifdef GHCI
+ do ----------------- Generate byte code ------------------
+ comp_bc <- byteCodeGen dflags prepd_binds data_tycons
+
+ ------------------ Create f-x-dynamic C-side stuff ---
+ (istub_h_exists, istub_c_exists)
+ <- outputForeignStubs dflags this_mod location foreign_stubs
+
+ return ( istub_h_exists, istub_c_exists, Just comp_bc )
+#else
+ panic "GHC not compiled with interpreter"
+#endif
+
+ other ->
+ do
+ ----------------- Convert to STG ------------------
+ (stg_binds, cost_centre_info) <- {-# SCC "CoreToStg" #-}
+ myCoreToStg dflags home_mods this_mod prepd_binds
+
+ ------------------ Code generation ------------------
+ abstractC <- {-# SCC "CodeGen" #-}
+ codeGen dflags home_mods this_mod data_tycons
+ foreign_stubs dir_imps cost_centre_info
+ stg_binds
+
+ ------------------ Code output -----------------------
+ (stub_h_exists, stub_c_exists)
+ <- codeOutput dflags this_mod location foreign_stubs
+ dependencies abstractC
+
+ return (stub_h_exists, stub_c_exists, Nothing)
+ }
+
+
+hscCmmFile :: DynFlags -> FilePath -> IO Bool
+hscCmmFile dflags filename = do
+ maybe_cmm <- parseCmmFile dflags (mkHomeModules []) filename
+ case maybe_cmm of
+ Nothing -> return False
+ Just cmm -> do
+ codeOutput dflags no_mod no_loc NoStubs [] [cmm]
+ return True
+ where
+ no_mod = panic "hscCmmFile: no_mod"
+ no_loc = ModLocation{ ml_hs_file = Just filename,
+ ml_hi_file = panic "hscCmmFile: no hi file",
+ ml_obj_file = panic "hscCmmFile: no obj file" }
+
+
+myParseModule dflags src_filename maybe_src_buf
+ = -------------------------- Parser ----------------
+ showPass dflags "Parser" >>
+ {-# SCC "Parser" #-} do
+
+ -- sometimes we already have the buffer in memory, perhaps
+ -- because we needed to parse the imports out of it, or get the
+ -- module name.
+ buf <- case maybe_src_buf of
+ Just b -> return b
+ Nothing -> hGetStringBuffer src_filename
+
+ let loc = mkSrcLoc (mkFastString src_filename) 1 0
+
+ case unP parseModule (mkPState buf loc dflags) of {
+
+ PFailed span err -> return (Left (mkPlainErrMsg span err));
+
+ POk _ rdr_module -> do {