From: Simon Marlow Date: Fri, 25 Aug 2006 14:09:06 +0000 (+0000) Subject: Load the target of a dynamic foreign call into a temporary X-Git-Tag: Before_FC_branch_merge~119 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=123e4528172dc8fada65daa168cdb0175f56549f Load the target of a dynamic foreign call into a temporary Fixes ffi011(opt) on x86_64. I don't know why this has only just appeared today, it's apparently been broken for some time. --- diff --git a/compiler/codeGen/CgForeignCall.hs b/compiler/codeGen/CgForeignCall.hs index e66e1b8..822a043 100644 --- a/compiler/codeGen/CgForeignCall.hs +++ b/compiler/codeGen/CgForeignCall.hs @@ -110,13 +110,14 @@ emitForeignCall' safety results target args vols | otherwise = do id <- newTemp wordRep temp_args <- load_args_into_temps args + temp_target <- load_target_into_temp target emitSaveThreadState stmtC (CmmCall (CmmForeignCall suspendThread CCallConv) [(id,PtrHint)] [ (CmmReg (CmmGlobal BaseReg), PtrHint) ] vols ) - stmtC (CmmCall target results temp_args vols) + stmtC (CmmCall temp_target results temp_args vols) stmtC (CmmCall (CmmForeignCall resumeThread CCallConv) [ (CmmGlobal BaseReg, PtrHint) ] -- Assign the result to BaseReg: we @@ -139,16 +140,25 @@ resumeThread = CmmLit (CmmLabel (mkRtsCodeLabel SLIT("resumeThread"))) -- -- This is a HACK; really it should be done in the back end, but -- it's easier to generate the temporaries here. -load_args_into_temps args = mapM maybe_assignTemp args +load_args_into_temps = mapM arg_assign_temp + where arg_assign_temp (e,hint) = do + tmp <- maybe_assign_temp e + return (tmp,hint) -maybe_assignTemp (e, hint) - | hasNoGlobalRegs e = return (e, hint) +load_target_into_temp (CmmForeignCall expr conv) = do + tmp <- maybe_assign_temp expr + return (CmmForeignCall tmp conv) +load_target_info_temp other_target = + return other_target + +maybe_assign_temp e + | hasNoGlobalRegs e = return e | otherwise = do -- don't use assignTemp, it uses its own notion of "trivial" -- expressions, which are wrong here reg <- newTemp (cmmExprRep e) stmtC (CmmAssign reg e) - return (CmmReg reg, hint) + return (CmmReg reg) -- ----------------------------------------------------------------------------- -- Save/restore the thread state in the TSO