root/compiler/nativeGen/NCGMonad.hs

Revision b442c077593b10d5226edf2afd60918a90a23315, 4.0 KB (checked in by Ian Lynagh <igloo@…>, 5 months ago)

Make getDynFlags* functions use HasDynFlags?/getDynFlags too

  • Property mode set to 100644
Line 
1-- -----------------------------------------------------------------------------
2--
3-- (c) The University of Glasgow 1993-2004
4--
5-- The native code generator's monad.
6--
7-- -----------------------------------------------------------------------------
8
9{-# OPTIONS -fno-warn-tabs #-}
10-- The above warning supression flag is a temporary kludge.
11-- While working on this module you are encouraged to remove it and
12-- detab the module (please do the detabbing in a separate patch). See
13--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#TabsvsSpaces
14-- for details
15
16module NCGMonad (
17        NatM_State(..), mkNatM_State,
18
19        NatM, -- instance Monad
20        initNat, 
21        addImportNat, 
22        getUniqueNat,
23        mapAccumLNat, 
24        setDeltaNat, 
25        getDeltaNat,
26        getBlockIdNat, 
27        getNewLabelNat, 
28        getNewRegNat, 
29        getNewRegPairNat,
30        getPicBaseMaybeNat, 
31        getPicBaseNat, 
32        getDynFlags
33) 
34 
35where
36 
37#include "HsVersions.h"
38
39import Reg
40import Size
41import TargetReg
42
43import BlockId
44import CLabel           ( CLabel, mkAsmTempLabel )
45import UniqSupply
46import Unique           ( Unique )
47import DynFlags
48
49data NatM_State 
50        = NatM_State {
51                natm_us      :: UniqSupply,
52                natm_delta   :: Int,
53                natm_imports :: [(CLabel)],
54                natm_pic     :: Maybe Reg,
55                natm_dflags  :: DynFlags
56        }
57
58newtype NatM result = NatM (NatM_State -> (result, NatM_State))
59
60unNat :: NatM a -> NatM_State -> (a, NatM_State)
61unNat (NatM a) = a
62
63mkNatM_State :: UniqSupply -> Int -> DynFlags -> NatM_State
64mkNatM_State us delta dflags
65        = NatM_State us delta [] Nothing dflags
66
67initNat :: NatM_State -> NatM a -> (a, NatM_State)
68initNat init_st m
69        = case unNat m init_st of { (r,st) -> (r,st) }
70
71
72instance Monad NatM where
73  (>>=) = thenNat
74  return = returnNat
75
76
77thenNat :: NatM a -> (a -> NatM b) -> NatM b
78thenNat expr cont
79        = NatM $ \st -> case unNat expr st of
80                        (result, st') -> unNat (cont result) st'
81
82returnNat :: a -> NatM a
83returnNat result
84        = NatM $ \st ->  (result, st)
85
86mapAccumLNat :: (acc -> x -> NatM (acc, y))
87                -> acc
88                -> [x]
89                -> NatM (acc, [y])
90
91mapAccumLNat _ b []
92  = return (b, [])
93mapAccumLNat f b (x:xs)
94  = do (b__2, x__2)  <- f b x
95       (b__3, xs__2) <- mapAccumLNat f b__2 xs
96       return (b__3, x__2:xs__2)
97
98getUniqueNat :: NatM Unique
99getUniqueNat = NatM $ \ (NatM_State us delta imports pic dflags) ->
100    case takeUniqFromSupply us of
101         (uniq, us') -> (uniq, (NatM_State us' delta imports pic dflags))
102
103instance HasDynFlags NatM where
104    getDynFlags = NatM $ \ (NatM_State us delta imports pic dflags) ->
105                             (dflags, (NatM_State us delta imports pic dflags))
106
107
108getDeltaNat :: NatM Int
109getDeltaNat 
110        = NatM $ \ st -> (natm_delta st, st)
111
112
113setDeltaNat :: Int -> NatM ()
114setDeltaNat delta
115        = NatM $ \ (NatM_State us _ imports pic dflags) ->
116                   ((), NatM_State us delta imports pic dflags)
117
118
119addImportNat :: CLabel -> NatM ()
120addImportNat imp
121        = NatM $ \ (NatM_State us delta imports pic dflags) ->
122                   ((), NatM_State us delta (imp:imports) pic dflags)
123
124
125getBlockIdNat :: NatM BlockId
126getBlockIdNat 
127 = do   u <- getUniqueNat
128        return (mkBlockId u)
129
130
131getNewLabelNat :: NatM CLabel
132getNewLabelNat 
133 = do   u <- getUniqueNat
134        return (mkAsmTempLabel u)
135
136
137getNewRegNat :: Size -> NatM Reg
138getNewRegNat rep
139 = do u <- getUniqueNat
140      dflags <- getDynFlags
141      return (RegVirtual $ targetMkVirtualReg (targetPlatform dflags) u rep)
142
143
144getNewRegPairNat :: Size -> NatM (Reg,Reg)
145getNewRegPairNat rep
146 = do u <- getUniqueNat
147      dflags <- getDynFlags
148      let vLo = targetMkVirtualReg (targetPlatform dflags) u rep
149      let lo  = RegVirtual $ targetMkVirtualReg (targetPlatform dflags) u rep
150      let hi  = RegVirtual $ getHiVirtualRegFromLo vLo
151      return (lo, hi)
152
153
154getPicBaseMaybeNat :: NatM (Maybe Reg)
155getPicBaseMaybeNat 
156        = NatM (\state -> (natm_pic state, state))
157
158
159getPicBaseNat :: Size -> NatM Reg
160getPicBaseNat rep
161 = do   mbPicBase <- getPicBaseMaybeNat
162        case mbPicBase of
163                Just picBase -> return picBase
164                Nothing 
165                 -> do
166                        reg <- getNewRegNat rep
167                        NatM (\state -> (reg, state { natm_pic = Just reg }))
Note: See TracBrowser for help on using the browser.