Fix segfault in array copy primops on 32-bit
authorJohan Tibell <johan.tibell@gmail.com>
Tue, 7 Jun 2011 12:44:23 +0000 (14:44 +0200)
committerDavid Terei <davidterei@gmail.com>
Tue, 7 Jun 2011 18:58:06 +0000 (11:58 -0700)
The second argument to C's memset was passed as a W8 while memset
expects an int.

Signed-off-by: David Terei <davidterei@gmail.com>

compiler/codeGen/CgPrimOp.hs

index c5a6644..fa7287d 100644 (file)
@@ -733,7 +733,7 @@ emitCloneArray info_p res_r src0 src_off0 n0 live = do
     emitMemcpyCall dst_p src_p (n `cmmMulWord` wordSize) live
 
     emitMemsetCall (cmmOffsetExprW dst_p n)
-        (CmmLit (CmmInt (toInteger (1 :: Int)) W8))
+        (CmmLit (mkIntCLit 1))
         (card_words `cmmMulWord` wordSize)
         live
     stmtC $ CmmAssign (CmmLocal res_r) arr
@@ -751,7 +751,7 @@ emitSetCards :: CmmExpr -> CmmExpr -> CmmExpr -> StgLiveVars -> Code
 emitSetCards dst_start dst_cards_start n live = do
     start_card <- assignTemp $ card dst_start
     emitMemsetCall (dst_cards_start `cmmAddWord` start_card)
-        (CmmLit (CmmInt (toInteger (1 :: Int)) W8))
+        (CmmLit (mkIntCLit 1))
         ((card (dst_start `cmmAddWord` n) `cmmSubWord` start_card)
          `cmmAddWord` CmmLit (mkIntCLit 1))
         live
@@ -795,8 +795,8 @@ emitMemmoveCall dst src n live = do
     memmove = CmmLit (CmmLabel (mkForeignLabel (fsLit "memmove") Nothing
                                ForeignLabelInExternalPackage IsFunction))
 
--- | Emit a call to @memset@.  The second argument must be of type
--- 'W8'.
+-- | Emit a call to @memset@.  The second argument must fit inside an
+-- unsigned char.
 emitMemsetCall :: CmmExpr -> CmmExpr -> CmmExpr -> StgLiveVars -> Code
 emitMemsetCall dst c n live = do
     vols <- getVolatileRegs live