I've committed fixes for both of these, slightly different to the ones
you suggest. (Your first is wrong because the args and arg_exprs1 would
be mis-matched.)

Check to see if you agree with my fixes.

Sounds as if you may have an NCG before Simon does for x86 :-)  
(Simon's away today in Kent)

Simon


| -----Original Message-----
| From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
On Behalf Of Wolfgang
| Thaller
| Sent: 09 February 2004 14:15
| To: [EMAIL PROTECTED]
| Subject: Two more bugfixes
| 
| Hi Everyone,
| 
| I've tracked down two more bugs...
| 
| Number one is about passing void arguments to foreign calls. We
| definitely don't want to do that, and I guess this is the right place
| to filter them out, but I'm not entirely sure:
| 
| diff -c -r1.56.4.11 CgExpr.lhs
| *** codeGen/CgExpr.lhs  5 Feb 2004 12:23:47 -0000       1.56.4.11
| --- codeGen/CgExpr.lhs  9 Feb 2004 14:01:13 -0000
| ***************
| *** 129,135 ****
|        -}
|        reps_n_amodes <- getArgAmodes args
|        let
| !       (_reps, arg_exprs1) = unzip reps_n_amodes
|            arg_exprs = zipWith shimForeignCallArg args arg_exprs1
|        -- in
|        arg_tmps <- mapM assignTemp arg_exprs
| --- 129,135 ----
|        -}
|        reps_n_amodes <- getArgAmodes args
|        let
| !       (_reps, arg_exprs1) = unzip $ filter (nonVoidArg . fst)
| reps_n_amodes
|            arg_exprs = zipWith shimForeignCallArg args arg_exprs1
|        -- in
|        arg_tmps <- mapM assignTemp arg_exprs
| 
| 
| The second one has to do with inline primops returning void:
| 
| diff -c -r1.66.4.16 CgCase.lhs
| *** codeGen/CgCase.lhs  5 Feb 2004 12:23:34 -0000       1.66.4.16
| --- codeGen/CgCase.lhs  9 Feb 2004 14:04:58 -0000
| ***************
| *** 271,279 ****
|    \begin{code}
|    cgInlinePrimOp primop args bndr (PrimAlt tycon) live_in_alts alts
|      = do        {       -- PRIMITIVE ALTS
| !       ; tmp_reg <- bindNewToTemp bndr
| !       ; let res | isVoidArg (idCgRep bndr) = []
| !                 | otherwise                = [tmp_reg]
|          ; cgPrimOp res primop args live_in_alts
|          ; cgPrimAlts NoGC (PrimAlt tycon) tmp_reg alts }
| 
| --- 271,280 ----
|    \begin{code}
|    cgInlinePrimOp primop args bndr (PrimAlt tycon) live_in_alts alts
|      = do        {       -- PRIMITIVE ALTS
| !         ; (res, tmp_reg) <- if isVoidArg (idCgRep bndr)
| !               then return ([], panic "cgInlinePrimOp")
| !               else do { tmp_reg <- bindNewToTemp bndr
| !                       ; return ([tmp_reg], tmp_reg) }
|          ; cgPrimOp res primop args live_in_alts
|          ; cgPrimAlts NoGC (PrimAlt tycon) tmp_reg alts }
| 
| Is passing bottom as tmp_reg a good idea?
| 
| I'm now up to GHC.ForeignPtr - I've already got 46 modules compiled!
:-)
| 
| Cheers,
| 
| Wolfgang
| 
| _______________________________________________
| Cvs-ghc mailing list
| [EMAIL PROTECTED]
| http://www.haskell.org/mailman/listinfo/cvs-ghc
_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to