X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcodeGen%2FCgCallConv.hs;h=9f2c1bc19e1d5e7d87ff6439606a9a2f1a94369b;hb=9bbcd77cf9b66940058dbea1827db594e8ff6d7f;hp=f463255807ac2580ca2702d7b0a8debce94996dc;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/compiler/codeGen/CgCallConv.hs b/compiler/codeGen/CgCallConv.hs index f463255..9f2c1bc 100644 --- a/compiler/codeGen/CgCallConv.hs +++ b/compiler/codeGen/CgCallConv.hs @@ -1,12 +1,12 @@ ----------------------------------------------------------------------------- -- --- CgCallConv +-- (c) The University of Glasgow 2004-2006 +-- +-- CgCallConv -- -- The datatypes and functions here encapsulate the -- calling and return conventions used by the code generator. -- --- (c) The University of Glasgow 2004 --- ----------------------------------------------------------------------------- @@ -25,44 +25,34 @@ module CgCallConv ( constructSlowCall, slowArgs, slowCallPattern, -- Returns - CtrlReturnConvention(..), - ctrlReturnConvAlg, dataReturnConvPrim, getSequelAmode ) where #include "HsVersions.h" -import CgUtils ( emitRODataLits, mkWordCLit ) +import CgUtils import CgMonad - -import Constants ( mAX_FAMILY_SIZE_FOR_VEC_RETURNS, - mAX_Vanilla_REG, mAX_Float_REG, - mAX_Double_REG, mAX_Long_REG, - mAX_Real_Vanilla_REG, mAX_Real_Float_REG, - mAX_Real_Double_REG, mAX_Real_Long_REG, - bITMAP_BITS_SHIFT - ) - -import ClosureInfo ( ArgDescr(..), Liveness(..) ) -import CgStackery ( getSpRelOffset ) import SMRep -import MachOp ( wordRep ) -import Cmm ( CmmExpr(..), GlobalReg(..), CmmLit(..), CmmReg(..), node ) -import CmmUtils ( mkLblExpr ) + +import MachOp +import Cmm import CLabel -import Maybes ( mapCatMaybes ) -import Id ( Id ) -import Name ( Name ) -import TyCon ( TyCon, tyConFamilySize ) -import Bitmap ( Bitmap, mAX_SMALL_BITMAP_SIZE, - mkBitmap, intsToReverseBitmap ) -import Util ( isn'tIn, sortLe ) -import StaticFlags ( opt_Unregisterised ) -import FastString ( LitString ) + +import Constants +import ClosureInfo +import CgStackery +import CmmUtils +import Maybes +import Id +import Name +import Bitmap +import Util +import StaticFlags +import FastString import Outputable -import DATA_BITS +import Data.Bits ------------------------------------------------------------------------- -- @@ -222,10 +212,6 @@ constructSlowCall amodes stg_ap_pat = mkRtsApFastLabel arg_pat (arg_pat, these, rest) = matchSlowPattern amodes -enterRtsRetLabel arg_pat - | tablesNextToCode = mkRtsRetInfoLabel arg_pat - | otherwise = mkRtsRetLabel arg_pat - -- | 'slowArgs' takes a list of function arguments and prepares them for -- pushing on the stack for "extra" arguments to a function which requires -- fewer arguments than we currently have. @@ -264,26 +250,6 @@ slowCallPattern _ = panic "CgStackery.slowCallPattern" -- ------------------------------------------------------------------------- --- A @CtrlReturnConvention@ says how {\em control} is returned. - -data CtrlReturnConvention - = VectoredReturn Int -- size of the vector table (family size) - | UnvectoredReturn Int -- family size - -ctrlReturnConvAlg :: TyCon -> CtrlReturnConvention -ctrlReturnConvAlg tycon - = case (tyConFamilySize tycon) of - size -> -- we're supposed to know... - if (size > (1::Int) && size <= mAX_FAMILY_SIZE_FOR_VEC_RETURNS) then - VectoredReturn size - else - UnvectoredReturn size - -- NB: unvectored returns Include size 0 (no constructors), so that - -- the following perverse code compiles (it crashed GHC in 5.02) - -- data T1 - -- data T2 = T2 !T1 Int - -- The only value of type T1 is bottom, which never returns anyway. - dataReturnConvPrim :: CgRep -> CmmReg dataReturnConvPrim PtrArg = CmmGlobal (VanillaReg 1) dataReturnConvPrim NonPtrArg = CmmGlobal (VanillaReg 1) @@ -294,7 +260,7 @@ dataReturnConvPrim VoidArg = panic "dataReturnConvPrim: void" -- getSequelAmode returns an amode which refers to an info table. The info --- table will always be of the RET(_VEC)?_(BIG|SMALL) kind. We're careful +-- table will always be of the RET_(BIG|SMALL) kind. We're careful -- not to handle real code pointers, just in case we're compiling for -- an unregisterised/untailcallish architecture, where info pointers and -- code pointers aren't the same. @@ -311,9 +277,8 @@ getSequelAmode OnStack -> do { sp_rel <- getSpRelOffset virt_sp ; returnFC (CmmLoad sp_rel wordRep) } - UpdateCode -> returnFC (CmmLit (CmmLabel mkUpdInfoLabel)) - CaseAlts lbl _ _ True -> returnFC (CmmLit (CmmLabel mkSeqInfoLabel)) - CaseAlts lbl _ _ False -> returnFC (CmmLit (CmmLabel lbl)) + UpdateCode -> returnFC (CmmLit (CmmLabel mkUpdInfoLabel)) + CaseAlts lbl _ _ -> returnFC (CmmLit (CmmLabel lbl)) } -------------------------------------------------------------------------