X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FdeSugar%2FDsForeign.lhs;h=b0c82f85916739785c80eca4d8ee5722f54543a9;hb=620531f5074b189bd04d10c88196493b1e2fa692;hp=751c5042ee2135b85a5c477bbf8af7445e274f8c;hpb=bca74f3e6bde807d688e39e6de28112ebcb4fa49;p=ghc-hetmet.git diff --git a/compiler/deSugar/DsForeign.lhs b/compiler/deSugar/DsForeign.lhs index 751c504..b0c82f8 100644 --- a/compiler/deSugar/DsForeign.lhs +++ b/compiler/deSugar/DsForeign.lhs @@ -6,13 +6,6 @@ Desugaring foreign declarations (see also DsCCall). \begin{code} -{-# OPTIONS -w #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module DsForeign ( dsForeigns ) where #include "HsVersions.h" @@ -36,6 +29,7 @@ import Type import TyCon import Coercion import TcType +import Var import HscTypes import ForeignCall @@ -97,6 +91,8 @@ dsForeigns fos = do do_decl (ForeignExport (L _ id) _ (CExport (CExportStatic ext_nm cconv))) = do (h, c, _, _) <- dsFExport id (idType id) ext_nm cconv False return (h, c, [id], []) + + do_decl d = pprPanic "dsForeigns/do_decl" (ppr d) \end{code} @@ -128,7 +124,7 @@ because it exposes the boxing to the call site. dsFImport :: Id -> ForeignImport -> DsM ([Binding], SDoc, SDoc) -dsFImport id (CImport cconv safety header lib spec) = do +dsFImport id (CImport cconv safety _ _ spec) = do (ids, h, c) <- dsCImport id spec cconv safety return (ids, h, c) @@ -149,7 +145,7 @@ dsCImport id (CLabel cid) cconv _ = do (resTy, foRhs) <- resultWrapper ty ASSERT(fromJust resTy `coreEqType` addrPrimTy) -- typechecker ensures this let - rhs = foRhs (mkLit (MachLabel cid stdcall_info)) + rhs = foRhs (Lit (MachLabel cid stdcall_info)) stdcall_info = fun_type_arg_stdcall_info cconv ty in return ([(id, rhs)], empty, empty) @@ -167,8 +163,8 @@ fun_type_arg_stdcall_info StdCallConv ty | Just (tc,[arg_ty]) <- splitTyConApp_maybe (repType ty), tyConUnique tc == funPtrTyConKey = let - (_tvs,sans_foralls) = tcSplitForAllTys arg_ty - (fe_arg_tys, orig_res_ty) = tcSplitFunTys sans_foralls + (_tvs,sans_foralls) = tcSplitForAllTys arg_ty + (fe_arg_tys, _orig_res_ty) = tcSplitFunTys sans_foralls in Just $ sum (map (machRepByteWidth . typeMachRep . getPrimTyOf) fe_arg_tys) fun_type_arg_stdcall_info _other_conv _ @@ -183,6 +179,7 @@ fun_type_arg_stdcall_info _other_conv _ %************************************************************************ \begin{code} +dsFCall :: Id -> ForeignCall -> DsM ([(Id, Expr TyVar)], SDoc, SDoc) dsFCall fn_id fcall = do let ty = idType fn_id @@ -208,7 +205,6 @@ dsFCall fn_id fcall = do augmentResultDs | forDotnet = do - err_res <- newSysLocalDs addrPrimTy return (\ (mb_res_ty, resWrap) -> case mb_res_ty of Nothing -> (Just (mkTyConApp (tupleTyCon Unboxed 1) @@ -254,7 +250,7 @@ The function that does most of the work for `@foreign export@' declarations. For each `@foreign export foo@' in a module M we generate: \begin{itemize} \item a C function `@foo@', which calls -\item a Haskell stub `@M.$ffoo@', which calls +\item a Haskell stub `@M.\$ffoo@', which calls \end{itemize} the user-written Haskell function `@M.foo@'. @@ -288,7 +284,7 @@ dsFExport fn_id ty ext_name cconv isDyn= do (res_ty, -- t is_IO_res_ty) <- -- Bool case tcSplitIOType_maybe orig_res_ty of - Just (ioTyCon, res_ty, co) -> return (res_ty, True) + Just (_ioTyCon, res_ty, _co) -> return (res_ty, True) -- The function already returns IO t -- ToDo: what about the coercion? Nothing -> return (orig_res_ty, False) @@ -360,8 +356,8 @@ dsFExportDynamic id cconv = do -} adj_args = [ mkIntLitInt (ccallConvToInt cconv) , Var stbl_value - , mkLit (MachLabel fe_nm mb_sz_args) - , mkLit (mkStringLit typestring) + , Lit (MachLabel fe_nm mb_sz_args) + , Lit (mkMachString typestring) ] -- name of external entry point providing these services. -- (probably in the RTS.) @@ -480,6 +476,7 @@ mkFExportCBits c_nm maybe_target arg_htys res_hty is_IO_res_ty cc pprCconv = case cc of CCallConv -> empty StdCallConv -> text (ccallConvAttribute cc) + CmmCallConv -> panic "mkFExportCBits/pprCconv CmmCallConv" header_bits = ptext (sLit "extern") <+> fun_proto <> semi @@ -592,6 +589,7 @@ foreignExportInitialiser hs_fn = -- this information to hand, but we know what GHC's conventions -- are for passing around the primitive Haskell types, so we -- use that instead. I hope the two coincide --SDM +typeMachRep :: Type -> MachRep typeMachRep ty = argMachRep (typeCgRep ty) mkHObj :: Type -> SDoc @@ -610,6 +608,8 @@ showFFIType t = getOccString (getName tc) Just (tc,_) -> tc Nothing -> pprPanic "showFFIType" (ppr t) +insertRetAddr :: CCallConv -> [(SDoc, SDoc, Type, MachRep)] + -> [(SDoc, SDoc, Type, MachRep)] #if !defined(x86_64_TARGET_ARCH) insertRetAddr CCallConv args = ret_addr_arg : args insertRetAddr _ args = args @@ -619,14 +619,17 @@ insertRetAddr _ args = args -- need to flush a register argument to the stack (See rts/Adjustor.c for -- details). insertRetAddr CCallConv args = go 0 args - where go 6 args = ret_addr_arg : args + where go :: Int -> [(SDoc, SDoc, Type, MachRep)] + -> [(SDoc, SDoc, Type, MachRep)] + go 6 args = ret_addr_arg : args go n (arg@(_,_,_,rep):args) | I64 <- rep = arg : go (n+1) args | otherwise = arg : go n args - go n [] = [] + go _ [] = [] insertRetAddr _ args = args #endif +ret_addr_arg :: (SDoc, SDoc, Type, MachRep) ret_addr_arg = (text "original_return_addr", text "void*", undefined, typeMachRep addrPrimTy)