Merging in the new codegen branch
[ghc-hetmet.git] / compiler / nativeGen / NCGMonad.hs
index 8fdcd44..a8283ea 100644 (file)
@@ -1,3 +1,10 @@
+{-# 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
+
 -- -----------------------------------------------------------------------------
 --
 -- (c) The University of Glasgow 1993-2004
@@ -13,32 +20,32 @@ module NCGMonad (
        initNat, addImportNat, getUniqueNat,
        mapAccumLNat, setDeltaNat, getDeltaNat,
        getBlockIdNat, getNewLabelNat, getNewRegNat, getNewRegPairNat,
-       getPicBaseMaybeNat, getPicBaseNat
+       getPicBaseMaybeNat, getPicBaseNat, getDynFlagsNat
  ) where
   
 #include "HsVersions.h"
 
-import Cmm             ( BlockId(..) )
+import BlockId
 import CLabel          ( CLabel, mkAsmTempLabel )
 import MachRegs
-import MachOp          ( MachRep )
 import UniqSupply
 import Unique          ( Unique )
-
+import DynFlags
 
 data NatM_State = NatM_State {
                        natm_us      :: UniqSupply,
                        natm_delta   :: Int,
                        natm_imports :: [(CLabel)],
-                       natm_pic     :: Maybe Reg
+                       natm_pic     :: Maybe Reg,
+                       natm_dflags  :: DynFlags
                }
 
 newtype NatM result = NatM (NatM_State -> (result, NatM_State))
 
 unNat (NatM a) = a
 
-mkNatM_State :: UniqSupply -> Int -> NatM_State
-mkNatM_State us delta = NatM_State us delta [] Nothing
+mkNatM_State :: UniqSupply -> Int -> DynFlags -> NatM_State
+mkNatM_State us delta dflags = NatM_State us delta [] Nothing dflags
 
 initNat :: NatM_State -> NatM a -> (a, NatM_State)
 initNat init_st m = case unNat m init_st of { (r,st) -> (r,st) }
@@ -68,20 +75,25 @@ mapAccumLNat f b (x:xs)
        return (b__3, x__2:xs__2)
 
 getUniqueNat :: NatM Unique
-getUniqueNat = NatM $ \ (NatM_State us delta imports pic) ->
+getUniqueNat = NatM $ \ (NatM_State us delta imports pic dflags) ->
     case splitUniqSupply us of
-         (us1,us2) -> (uniqFromSupply us1, (NatM_State us2 delta imports pic))
+         (us1,us2) -> (uniqFromSupply us1, (NatM_State us2 delta imports pic dflags))
+
+
+getDynFlagsNat :: NatM DynFlags
+getDynFlagsNat = NatM $ \ (NatM_State us delta imports pic dflags) ->
+                         (dflags, (NatM_State us delta imports pic dflags))
 
 getDeltaNat :: NatM Int
 getDeltaNat = NatM $ \ st -> (natm_delta st, st)
 
 setDeltaNat :: Int -> NatM ()
-setDeltaNat delta = NatM $ \ (NatM_State us _ imports pic) ->
-   ((), NatM_State us delta imports pic)
+setDeltaNat delta = NatM $ \ (NatM_State us _ imports pic dflags) ->
+   ((), NatM_State us delta imports pic dflags)
 
 addImportNat :: CLabel -> NatM ()
-addImportNat imp = NatM $ \ (NatM_State us delta imports pic) -> 
-   ((), NatM_State us delta (imp:imports) pic)
+addImportNat imp = NatM $ \ (NatM_State us delta imports pic dflags) ->
+   ((), NatM_State us delta (imp:imports) pic dflags)
 
 getBlockIdNat :: NatM BlockId
 getBlockIdNat = do u <- getUniqueNat; return (BlockId u)
@@ -89,10 +101,10 @@ getBlockIdNat = do u <- getUniqueNat; return (BlockId u)
 getNewLabelNat :: NatM CLabel
 getNewLabelNat = do u <- getUniqueNat; return (mkAsmTempLabel u)
 
-getNewRegNat :: MachRep -> NatM Reg
+getNewRegNat :: Size -> NatM Reg
 getNewRegNat rep = do u <- getUniqueNat; return (mkVReg u rep)
 
-getNewRegPairNat :: MachRep -> NatM (Reg,Reg)
+getNewRegPairNat :: Size -> NatM (Reg,Reg)
 getNewRegPairNat rep = do 
   u <- getUniqueNat
   let lo = mkVReg u rep; hi = getHiVRegFromLo lo
@@ -101,7 +113,7 @@ getNewRegPairNat rep = do
 getPicBaseMaybeNat :: NatM (Maybe Reg)
 getPicBaseMaybeNat = NatM (\state -> (natm_pic state, state))
 
-getPicBaseNat :: MachRep -> NatM Reg
+getPicBaseNat :: Size -> NatM Reg
 getPicBaseNat rep = do
   mbPicBase <- getPicBaseMaybeNat
   case mbPicBase of