diff options
-rw-r--r-- | compiler/iface/LoadIface.lhs | 28 | ||||
-rw-r--r-- | compiler/iface/MkIface.lhs | 5 | ||||
-rw-r--r-- | compiler/main/CodeOutput.lhs | 14 | ||||
-rw-r--r-- | compiler/main/DriverPipeline.hs | 15 | ||||
-rw-r--r-- | compiler/main/DynFlags.hs | 13 | ||||
-rw-r--r-- | compiler/main/HscMain.hs | 9 | ||||
-rw-r--r-- | compiler/nativeGen/AsmCodeGen.lhs | 64 |
7 files changed, 89 insertions, 59 deletions
diff --git a/compiler/iface/LoadIface.lhs b/compiler/iface/LoadIface.lhs index 2c36fa97f1..783a0e946c 100644 --- a/compiler/iface/LoadIface.lhs +++ b/compiler/iface/LoadIface.lhs @@ -558,22 +558,20 @@ findAndReadIface doc_str mod hi_boot_file -- Don't forget to fill in the package name... checkBuildDynamicToo (Succeeded (iface, filePath)) = do dflags <- getDynFlags - when (gopt Opt_BuildDynamicToo dflags) $ do + whenGeneratingDynamicToo dflags $ withDoDynamicToo $ do let ref = canGenerateDynamicToo dflags - b <- liftIO $ readIORef ref - when b $ withDoDynamicToo $ do - let dynFilePath = replaceExtension filePath (dynHiSuf dflags) - r <- read_file dynFilePath - case r of - Succeeded (dynIface, _) - | mi_mod_hash iface == mi_mod_hash dynIface -> - return () - | otherwise -> - do traceIf (text "Dynamic hash doesn't match") - liftIO $ writeIORef ref False - Failed err -> - do traceIf (text "Failed to load dynamic interface file:" $$ err) - liftIO $ writeIORef ref False + dynFilePath = replaceExtension filePath (dynHiSuf dflags) + r <- read_file dynFilePath + case r of + Succeeded (dynIface, _) + | mi_mod_hash iface == mi_mod_hash dynIface -> + return () + | otherwise -> + do traceIf (text "Dynamic hash doesn't match") + liftIO $ writeIORef ref False + Failed err -> + do traceIf (text "Failed to load dynamic interface file:" $$ err) + liftIO $ writeIORef ref False checkBuildDynamicToo _ = return () \end{code} diff --git a/compiler/iface/MkIface.lhs b/compiler/iface/MkIface.lhs index c410cd770f..74a5acdeaa 100644 --- a/compiler/iface/MkIface.lhs +++ b/compiler/iface/MkIface.lhs @@ -387,11 +387,10 @@ mkIface_ hsc_env maybe_old_fingerprint } ----------------------------- -writeIfaceFile :: DynFlags -> ModLocation -> ModIface -> IO () -writeIfaceFile dflags location new_iface +writeIfaceFile :: DynFlags -> FilePath -> ModIface -> IO () +writeIfaceFile dflags hi_file_path new_iface = do createDirectoryIfMissing True (takeDirectory hi_file_path) writeBinIface dflags hi_file_path new_iface - where hi_file_path = ml_hi_file location -- ----------------------------------------------------------------------------- diff --git a/compiler/main/CodeOutput.lhs b/compiler/main/CodeOutput.lhs index f76b0ef481..047cc018da 100644 --- a/compiler/main/CodeOutput.lhs +++ b/compiler/main/CodeOutput.lhs @@ -144,9 +144,17 @@ outputAsm dflags filenm cmm_stream | cGhcWithNativeCodeGen == "YES" = do ncg_uniqs <- mkSplitUniqSupply 'n' - _ <- {-# SCC "OutputAsm" #-} doOutput filenm $ - \f -> {-# SCC "NativeCodeGen" #-} - nativeCodeGen dflags f ncg_uniqs cmm_stream + let filenmDyn = filenm ++ "-dyn" + withHandles f = doOutput filenm $ \h -> + ifGeneratingDynamicToo dflags + (doOutput filenmDyn $ \dynH -> + f [(h, dflags), + (dynH, doDynamicToo dflags)]) + (f [(h, dflags)]) + + _ <- {-# SCC "OutputAsm" #-} withHandles $ + \hs -> {-# SCC "NativeCodeGen" #-} + nativeCodeGen dflags hs ncg_uniqs cmm_stream return () | otherwise diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs index 1fa36b5b5a..ac77f19191 100644 --- a/compiler/main/DriverPipeline.hs +++ b/compiler/main/DriverPipeline.hs @@ -1203,7 +1203,8 @@ runPhase As input_fn dflags -- might be a hierarchical module. liftIO $ createDirectoryIfMissing True (takeDirectory output_fn) - liftIO $ as_prog dflags + let runAssembler inputFilename outputFilename + = liftIO $ as_prog dflags (map SysTools.Option as_opts ++ [ SysTools.Option ("-I" ++ p) | p <- cmdline_include_paths ] @@ -1218,12 +1219,18 @@ runPhase As input_fn dflags then [SysTools.Option "-mcpu=v9"] else []) - ++ [ SysTools.Option "-c" - , SysTools.FileOption "" input_fn + ++ [ SysTools.Option "-x", SysTools.Option "assembler" + , SysTools.Option "-c" + , SysTools.FileOption "" inputFilename , SysTools.Option "-o" - , SysTools.FileOption "" output_fn + , SysTools.FileOption "" outputFilename ]) + runAssembler input_fn output_fn + whenGeneratingDynamicToo dflags $ + runAssembler (input_fn ++ "-dyn") + (replaceExtension output_fn (dynObjectSuf dflags)) + return (next_phase, output_fn) diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 5e2638c766..81d32fe54a 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -27,7 +27,7 @@ module DynFlags ( wopt, wopt_set, wopt_unset, xopt, xopt_set, xopt_unset, lang_set, - doDynamicToo, + whenGeneratingDynamicToo, ifGeneratingDynamicToo, doDynamicToo, DynFlags(..), HasDynFlags(..), ContainsDynFlags(..), RtsOptsEnabled(..), @@ -1112,6 +1112,17 @@ wayOptP _ WayPar = ["-D__PARALLEL_HASKELL__"] wayOptP _ WayGran = ["-D__GRANSIM__"] wayOptP _ WayNDP = [] +whenGeneratingDynamicToo :: MonadIO m => DynFlags -> m () -> m () +whenGeneratingDynamicToo dflags f = ifGeneratingDynamicToo dflags f (return ()) + +ifGeneratingDynamicToo :: MonadIO m => DynFlags -> m a -> m a -> m a +ifGeneratingDynamicToo dflags f g + = if gopt Opt_BuildDynamicToo dflags + then do let ref = canGenerateDynamicToo dflags + b <- liftIO $ readIORef ref + if b then f else g + else g + doDynamicToo :: DynFlags -> DynFlags doDynamicToo dflags0 = let dflags1 = unSetGeneralFlag' Opt_Static dflags0 dflags2 = addWay' WayDyn dflags1 diff --git a/compiler/main/HscMain.hs b/compiler/main/HscMain.hs index fe827e3cee..5e5bd53d26 100644 --- a/compiler/main/HscMain.hs +++ b/compiler/main/HscMain.hs @@ -1242,9 +1242,16 @@ hscNormalIface simpl_result mb_old_iface = do hscWriteIface :: ModIface -> Bool -> ModSummary -> Hsc () hscWriteIface iface no_change mod_summary = do dflags <- getDynFlags + let ifaceFile = ml_hi_file (ms_location mod_summary) unless no_change $ {-# SCC "writeIface" #-} - liftIO $ writeIfaceFile dflags (ms_location mod_summary) iface + liftIO $ writeIfaceFile dflags ifaceFile iface + whenGeneratingDynamicToo dflags $ liftIO $ do + -- TODO: We should do a no_change check for the dynamic + -- interface file too + let dynIfaceFile = replaceExtension ifaceFile (dynHiSuf dflags) + dynDflags = doDynamicToo dflags + writeIfaceFile dynDflags dynIfaceFile iface -- | Compile to hard-code. hscGenHardCode :: CgGuts -> ModSummary diff --git a/compiler/nativeGen/AsmCodeGen.lhs b/compiler/nativeGen/AsmCodeGen.lhs index ce62a64cec..05f7c3a06b 100644 --- a/compiler/nativeGen/AsmCodeGen.lhs +++ b/compiler/nativeGen/AsmCodeGen.lhs @@ -152,12 +152,12 @@ data NcgImpl statics instr jumpDest = NcgImpl { } -------------------- -nativeCodeGen :: DynFlags -> Handle -> UniqSupply -> Stream IO RawCmmGroup () +nativeCodeGen :: DynFlags -> [(Handle, DynFlags)] -> UniqSupply -> Stream IO RawCmmGroup () -> IO UniqSupply -nativeCodeGen dflags h us cmms +nativeCodeGen dflags hds us cmms = let platform = targetPlatform dflags nCG' :: (Outputable statics, Outputable instr, Instruction instr) => NcgImpl statics instr jumpDest -> IO UniqSupply - nCG' ncgImpl = nativeCodeGen' dflags ncgImpl h us cmms + nCG' ncgImpl = nativeCodeGen' dflags ncgImpl hds us cmms x86NcgImpl = NcgImpl { cmmTopCodeGen = X86.CodeGen.cmmTopCodeGen ,generateJumpTableForInstr = X86.CodeGen.generateJumpTableForInstr dflags @@ -238,7 +238,7 @@ noAllocMoreStack amount _ ++ " You can still file a bug report if you like.\n" -type NativeGenState statics instr = (BufHandle, NativeGenAcc statics instr) +type NativeGenState statics instr = (BufHandle, DynFlags, NativeGenAcc statics instr) type NativeGenAcc statics instr = ([[CLabel]], [([NatCmmDecl statics instr], @@ -248,17 +248,21 @@ type NativeGenAcc statics instr nativeCodeGen' :: (Outputable statics, Outputable instr, Instruction instr) => DynFlags -> NcgImpl statics instr jumpDest - -> Handle -> UniqSupply -> Stream IO RawCmmGroup () -> IO UniqSupply -nativeCodeGen' dflags ncgImpl h us cmms + -> [(Handle, DynFlags)] + -> UniqSupply + -> Stream IO RawCmmGroup () + -> IO UniqSupply +nativeCodeGen' dflags ncgImpl hds us cmms = do let split_cmms = Stream.map add_split cmms -- BufHandle is a performance hack. We could hide it inside -- Pretty if it weren't for the fact that we do lots of little -- printDocs here (in order to do codegen in constant space). - bufh <- newBufHandle h - let ngss = [(bufh, ([], []))] - (ngss', us') <- cmmNativeGenStream dflags ncgImpl us split_cmms ngss - mapM_ (finishNativeGen dflags ncgImpl) ngss' + let mkNgs (h, dflags) = do bufh <- newBufHandle h + return (bufh, dflags, ([], [])) + ngss <- mapM mkNgs hds + (ngss', us') <- cmmNativeGenStream ncgImpl us split_cmms ngss + mapM_ (finishNativeGen ncgImpl) ngss' return us' @@ -271,11 +275,10 @@ nativeCodeGen' dflags ncgImpl h us cmms finishNativeGen :: Instruction instr - => DynFlags - -> NcgImpl statics instr jumpDest + => NcgImpl statics instr jumpDest -> NativeGenState statics instr -> IO () -finishNativeGen dflags ncgImpl (bufh@(BufHandle _ _ h), (imports, prof)) +finishNativeGen ncgImpl (bufh@(BufHandle _ _ h), dflags, (imports, prof)) = do bFlush bufh @@ -323,55 +326,52 @@ finishNativeGen dflags ncgImpl (bufh@(BufHandle _ _ h), (imports, prof)) $ makeImportsDoc dflags (concat imports) cmmNativeGenStream :: (Outputable statics, Outputable instr, Instruction instr) - => DynFlags - -> NcgImpl statics instr jumpDest + => NcgImpl statics instr jumpDest -> UniqSupply -> Stream IO RawCmmGroup () -> [NativeGenState statics instr] -> IO ([NativeGenState statics instr], UniqSupply) -cmmNativeGenStream dflags ncgImpl us cmm_stream ngss +cmmNativeGenStream ncgImpl us cmm_stream ngss = do r <- Stream.runStream cmm_stream case r of Left () -> - return ([ (h, (reverse impAcc, reverse profAcc)) - | (h, (impAcc, profAcc)) <- ngss ] + return ([ (h, dflags, (reverse impAcc, reverse profAcc)) + | (h, dflags, (impAcc, profAcc)) <- ngss ] , us) Right (cmms, cmm_stream') -> do - (ngss',us') <- cmmNativeGens dflags ncgImpl us cmms ngss - cmmNativeGenStream dflags ncgImpl us' cmm_stream' ngss' + (ngss',us') <- cmmNativeGens ncgImpl us cmms ngss + cmmNativeGenStream ncgImpl us' cmm_stream' ngss' -- | Do native code generation on all these cmms. -- cmmNativeGens :: (Outputable statics, Outputable instr, Instruction instr) - => DynFlags - -> NcgImpl statics instr jumpDest + => NcgImpl statics instr jumpDest -> UniqSupply -> [RawCmmDecl] -> [NativeGenState statics instr] -> IO ([NativeGenState statics instr], UniqSupply) -cmmNativeGens _ _ us _ [] = return ([], us) -cmmNativeGens dflags ncgImpl us cmms (ngs : ngss) - = do (ngs', us') <- cmmNativeGens' dflags ncgImpl us cmms ngs 0 - (ngss', us'') <- cmmNativeGens dflags ncgImpl us' cmms ngss +cmmNativeGens _ us _ [] = return ([], us) +cmmNativeGens ncgImpl us cmms (ngs : ngss) + = do (ngs', us') <- cmmNativeGens' ncgImpl us cmms ngs 0 + (ngss', us'') <- cmmNativeGens ncgImpl us' cmms ngss return (ngs' : ngss', us'') -- | Do native code generation on all these cmms. -- cmmNativeGens' :: (Outputable statics, Outputable instr, Instruction instr) - => DynFlags - -> NcgImpl statics instr jumpDest + => NcgImpl statics instr jumpDest -> UniqSupply -> [RawCmmDecl] -> NativeGenState statics instr -> Int -> IO (NativeGenState statics instr, UniqSupply) -cmmNativeGens' _ _ us [] ngs _ +cmmNativeGens' _ us [] ngs _ = return (ngs, us) -cmmNativeGens' dflags ncgImpl us (cmm : cmms) (h, (impAcc, profAcc)) count +cmmNativeGens' ncgImpl us (cmm : cmms) (h, dflags, (impAcc, profAcc)) count = do (us', native, imports, colorStats, linearStats) <- {-# SCC "cmmNativeGen" #-} cmmNativeGen dflags ncgImpl us cmm count @@ -391,8 +391,8 @@ cmmNativeGens' dflags ncgImpl us (cmm : cmms) (h, (impAcc, profAcc)) count -- force evaulation all this stuff to avoid space leaks {-# SCC "seqString" #-} evaluate $ seqString (showSDoc dflags $ vcat $ map ppr imports) - cmmNativeGens' dflags ncgImpl - us' cmms (h, + cmmNativeGens' ncgImpl + us' cmms (h, dflags, ((imports : impAcc), ((lsPprNative, colorStats, linearStats) : profAcc))) count' |