[project @ 2005-03-07 15:59:27 by simonmar]
authorsimonmar <unknown>
Mon, 7 Mar 2005 15:59:27 +0000 (15:59 +0000)
committersimonmar <unknown>
Mon, 7 Mar 2005 15:59:27 +0000 (15:59 +0000)
Include WORD_SIZE_IN_BITS in the interface header, and test it when
reading.  Fixes a problem whereby GHC on a 64-bit platform will crash
if it tries to read an interface file generated by the same version of
GHC on a 32-bit platform.

ghc/compiler/iface/BinIface.hs

index b809e3a..402ba1f 100644 (file)
@@ -8,6 +8,7 @@
 module BinIface ( writeBinIface, readBinIface, v_IgnoreHiWay ) where
 
 #include "HsVersions.h"
+#include "MachDeps.h"
 
 import HscTypes
 import BasicTypes
@@ -25,12 +26,11 @@ import Binary
 import Util
 
 import DATA_IOREF
+import DATA_WORD       ( Word8 )
 import EXCEPTION       ( throwDyn )
 import Monad           ( when )
 import Outputable
 
-#include "HsVersions.h"
-
 -- ---------------------------------------------------------------------------
 writeBinIface :: FilePath -> ModIface -> IO ()
 writeBinIface hi_path mod_iface
@@ -111,6 +111,7 @@ instance Binary ModIface where
        put_ bh (show opt_HiVersion)
        build_tag <- readIORef v_Build_tag
        put  bh build_tag
+        put_ bh (WORD_SIZE_IN_BITS :: Word8)
        put_ bh mod
        put_ bh is_boot
        put_ bh mod_vers
@@ -146,6 +147,15 @@ instance Binary ModIface where
                "mismatched interface file ways: expected "
                ++ build_tag ++ ", found " ++ check_way))
 
+       check_ws <- get bh
+       let our_ws = WORD_SIZE_IN_BITS :: Word8
+        when (check_ws /= our_ws) $
+          -- use userError because this will be caught by readIface
+          -- which will emit an error msg containing the iface module name.
+          throwDyn (ProgramError (
+               "mismatched word size: expected "
+               ++ show our_ws ++ ", found " ++ show check_ws))
+
        mod_name  <- get bh
        is_boot   <- get bh
        mod_vers  <- get bh