X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcodeGen%2FCgForeignCall.hs;h=822a04366c702472172adf2700fe0f5cdc6f2e13;hb=d78d04173296841b5949ebce640f444dcfb026f2;hp=e66e1b8ead6af5d860396e3541c93ddcd4e34aa8;hpb=61d2625ae2e6a4cdae2ffc92df828905e81c24cc;p=ghc-hetmet.git 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