From f53056962c6d5d465001560a5b2afd8edf67517b Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Mon, 17 Mar 2008 18:50:32 +0000 Subject: [PATCH] Print some extra debugging info when doing --show-iface --- compiler/iface/BinIface.hs | 30 ++++++++++++++++++++++++------ compiler/iface/LoadIface.lhs | 6 ++++-- compiler/utils/Outputable.lhs | 3 +++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/compiler/iface/BinIface.hs b/compiler/iface/BinIface.hs index 5b94dd6..d2c4083 100644 --- a/compiler/iface/BinIface.hs +++ b/compiler/iface/BinIface.hs @@ -10,7 +10,8 @@ -- -- Binary interface file support. -module BinIface ( writeBinIface, readBinIface, CheckHiWay(..) ) where +module BinIface ( writeBinIface, readBinIface, + CheckHiWay(..), TraceBinIFaceReading(..) ) where #include "HsVersions.h" @@ -51,25 +52,40 @@ import Control.Monad data CheckHiWay = CheckHiWay | IgnoreHiWay deriving Eq +data TraceBinIFaceReading = TraceBinIFaceReading | QuietBinIFaceReading + deriving Eq + -- --------------------------------------------------------------------------- -- Reading and writing binary interface files -readBinIface :: CheckHiWay -> FilePath -> TcRnIf a b ModIface -readBinIface checkHiWay hi_path = do +readBinIface :: CheckHiWay -> TraceBinIFaceReading -> FilePath + -> TcRnIf a b ModIface +readBinIface checkHiWay traceBinIFaceReading hi_path = do nc <- getNameCache - (new_nc, iface) <- liftIO $ readBinIface_ checkHiWay hi_path nc + (new_nc, iface) <- liftIO $ + readBinIface_ checkHiWay traceBinIFaceReading hi_path nc setNameCache new_nc return iface -readBinIface_ :: CheckHiWay -> FilePath -> NameCache +readBinIface_ :: CheckHiWay -> TraceBinIFaceReading -> FilePath -> NameCache -> IO (NameCache, ModIface) -readBinIface_ checkHiWay hi_path nc = do +readBinIface_ checkHiWay traceBinIFaceReading hi_path nc = do + let printer :: SDoc -> IO () + printer = case traceBinIFaceReading of + TraceBinIFaceReading -> \sd -> printSDoc sd defaultDumpStyle + QuietBinIFaceReading -> \_ -> return () + wantedGot :: Outputable a => String -> a -> a -> IO () + wantedGot what wanted got + = printer (text what <> text ": " <> + vcat [text "Wanted " <> ppr wanted <> text ",", + text "got " <> ppr got]) bh <- Binary.readBinMem hi_path -- Read the magic number to check that this really is a GHC .hi file -- (This magic number does not change when we change -- GHC interface file format) magic <- get bh + wantedGot "Magic" binaryInterfaceMagic magic when (magic /= binaryInterfaceMagic) $ throwDyn (ProgramError ( "magic number mismatch: old/corrupt interface file?")) @@ -84,6 +100,7 @@ readBinIface_ checkHiWay hi_path nc = do -- Check the interface file version and ways. check_ver <- get bh let our_ver = show opt_HiVersion + wantedGot "Version" our_ver check_ver when (check_ver /= our_ver) $ -- This will be caught by readIface which will emit an error -- msg containing the iface module name. @@ -93,6 +110,7 @@ readBinIface_ checkHiWay hi_path nc = do check_way <- get bh way_descr <- getWayDescr + wantedGot "Way" way_descr check_way when (checkHiWay == CheckHiWay && check_way /= way_descr) $ -- This will be caught by readIface -- which will emit an error msg containing the iface module name. diff --git a/compiler/iface/LoadIface.lhs b/compiler/iface/LoadIface.lhs index f41f5da..3d8e498 100644 --- a/compiler/iface/LoadIface.lhs +++ b/compiler/iface/LoadIface.lhs @@ -515,7 +515,8 @@ readIface :: Module -> FilePath -> IsBootInterface readIface wanted_mod file_path is_hi_boot_file = do { dflags <- getDOpts - ; res <- tryMostM $ readBinIface CheckHiWay file_path + ; res <- tryMostM $ + readBinIface CheckHiWay QuietBinIFaceReading file_path ; case res of Right iface | wanted_mod == actual_mod -> return (Succeeded iface) @@ -612,7 +613,8 @@ showIface :: HscEnv -> FilePath -> IO () showIface hsc_env filename = do -- skip the hi way check; we don't want to worry about profiled vs. -- non-profiled interfaces, for example. - iface <- initTcRnIf 's' hsc_env () () $ readBinIface IgnoreHiWay filename + iface <- initTcRnIf 's' hsc_env () () $ + readBinIface IgnoreHiWay TraceBinIFaceReading filename printDump (pprModIface iface) \end{code} diff --git a/compiler/utils/Outputable.lhs b/compiler/utils/Outputable.lhs index ef856d0..8380c76 100644 --- a/compiler/utils/Outputable.lhs +++ b/compiler/utils/Outputable.lhs @@ -445,6 +445,9 @@ instance Outputable Bool where instance Outputable Int where ppr n = int n +instance Outputable Word32 where + ppr n = integer $ fromIntegral n + instance Outputable () where ppr _ = text "()" -- 1.7.10.4