ghc-heap: Fix writing closures on big endian
authorPeter Trommler <ptrommler@acm.org>
Mon, 15 Oct 2018 17:51:53 +0000 (13:51 -0400)
committerBen Gamari <ben@smart-cactus.org>
Mon, 15 Oct 2018 22:34:17 +0000 (18:34 -0400)
We need to write the closure type as a HalfWord not
an Int. On big endian systems the closure type ends up being zero
(the upper word of the Int) making the closure an invalid object.

Test Plan: validate (preferably on a big endian system)

Reviewers: bgamari, hvr, erikd, simonmar

Reviewed By: simonmar

Subscribers: rwbarton, carter

Differential Revision: https://phabricator.haskell.org/D5212

libraries/ghc-heap/GHC/Exts/Heap/InfoTable.hsc

index 25fe498..95151b4 100644 (file)
@@ -59,7 +59,7 @@ pokeItbl a0 itbl = do
 #endif
   (#poke StgInfoTable, layout.payload.ptrs) a0 (ptrs itbl)
   (#poke StgInfoTable, layout.payload.nptrs) a0 (nptrs itbl)
 #endif
   (#poke StgInfoTable, layout.payload.ptrs) a0 (ptrs itbl)
   (#poke StgInfoTable, layout.payload.nptrs) a0 (nptrs itbl)
-  (#poke StgInfoTable, type) a0 (fromEnum (tipe itbl))
+  (#poke StgInfoTable, type) a0 (toHalfWord (fromEnum (tipe itbl)))
 #if __GLASGOW_HASKELL__ > 804
   (#poke StgInfoTable, srt) a0 (srtlen itbl)
 #else
 #if __GLASGOW_HASKELL__ > 804
   (#poke StgInfoTable, srt) a0 (srtlen itbl)
 #else
@@ -72,6 +72,9 @@ pokeItbl a0 itbl = do
     Just (Left xs) -> pokeArray code_offset xs
     Just (Right xs) -> pokeArray code_offset xs
 #endif
     Just (Left xs) -> pokeArray code_offset xs
     Just (Right xs) -> pokeArray code_offset xs
 #endif
+  where
+    toHalfWord :: Int -> HalfWord
+    toHalfWord i = fromIntegral i
 
 -- | Size in bytes of a standard InfoTable
 itblSize :: Int
 
 -- | Size in bytes of a standard InfoTable
 itblSize :: Int