ghc-9.6.1: GHC/HsToCore/Foreign/Prim.hs
-- | Foreign primitive calls
--
-- This is for `@foreign import prim@' declarations.
--
-- Currently, at the core level we pretend that these primitive calls are
-- foreign calls. It may make more sense in future to have them as a distinct
-- kind of Id, or perhaps to bundle them with PrimOps since semantically and for
-- calling convention they are really prim ops.
module GHC.HsToCore.Foreign.Prim
( dsPrimCall
)
where
import GHC.Prelude
import GHC.Tc.Utils.Monad -- temp
import GHC.Tc.Utils.TcType
import GHC.Core
import GHC.Core.Type
import GHC.Core.Coercion
import GHC.HsToCore.Monad
import GHC.HsToCore.Foreign.Call
import GHC.Types.Id
import GHC.Types.ForeignStubs
import GHC.Types.ForeignCall
dsPrimCall :: Id -> Coercion -> ForeignCall
-> DsM ([(Id, Expr TyVar)], CHeader, CStub)
dsPrimCall fn_id co fcall = do
let
ty = coercionLKind co
(tvs, fun_ty) = tcSplitForAllInvisTyVars ty
(arg_tys, io_res_ty) = tcSplitFunTys fun_ty
args <- newSysLocalsDs arg_tys -- no FFI representation polymorphism
ccall_uniq <- newUnique
let
call_app = mkFCall ccall_uniq fcall (map Var args) io_res_ty
rhs = mkLams tvs (mkLams args call_app)
rhs' = Cast rhs co
return ([(fn_id, rhs')], mempty, mempty)