X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fcmm%2FBlockId.hs;h=c28201c92b491a55077104a32dcd32c5fbcecbf4;hp=fb9b7cab8fb495df7747b6c157e07cea7207bb22;hb=927df6486bc0dcb598b82702ca40c8fad0d9b25f;hpb=0d80489c9b9f2421f65d8dd86c1e50c6bb429715 diff --git a/compiler/cmm/BlockId.hs b/compiler/cmm/BlockId.hs index fb9b7ca..c28201c 100644 --- a/compiler/cmm/BlockId.hs +++ b/compiler/cmm/BlockId.hs @@ -1,13 +1,21 @@ +{- BlockId module should probably go away completely, being superseded by Label -} module BlockId - ( BlockId(..), mkBlockId -- ToDo: BlockId should be abstract, but it isn't yet - , BlockEnv, emptyBlockEnv, lookupBlockEnv, extendBlockEnv, mkBlockEnv - , BlockSet, emptyBlockSet, elemBlockSet, extendBlockSet, sizeBlockSet, mkBlockSet + ( BlockId, mkBlockId -- ToDo: BlockId should be abstract, but it isn't yet + , BlockSet, BlockEnv + , IsSet(..), setInsertList, setDeleteList, setUnions + , IsMap(..), mapInsertList, mapDeleteList, mapUnions + , emptyBlockSet, emptyBlockMap + , blockLbl, infoTblLbl, retPtLbl ) where +import CLabel +import IdInfo +import Name import Outputable -import UniqFM import Unique -import UniqSet + +import Compiler.Hoopl hiding (Unique) +import Compiler.Hoopl.GHC (uniqueToInt, uniqueToLbl, lblToUnique) ---------------------------------------------------------------- --- Block Ids, their environments, and their sets @@ -17,44 +25,44 @@ import UniqSet Although a 'BlockId' is a local label, for reasons of implementation, 'BlockId's must be unique within an entire compilation unit. The reason is that each local label is mapped to an assembly-language label, and in -most assembly languages allow, a label is visible throughout the enitre +most assembly languages allow, a label is visible throughout the entire compilation unit in which it appears. -} -newtype BlockId = BlockId Unique - deriving (Eq,Ord) +type BlockId = Label instance Uniquable BlockId where - getUnique (BlockId u) = u + getUnique label = getUnique (uniqueToInt $ lblToUnique label) mkBlockId :: Unique -> BlockId -mkBlockId uniq = BlockId uniq - -instance Show BlockId where - show (BlockId u) = show u +mkBlockId unique = uniqueToLbl $ intToUnique $ getKey unique instance Outputable BlockId where - ppr = ppr . getUnique + ppr label = ppr (getUnique label) + +retPtLbl :: BlockId -> CLabel +retPtLbl label = mkReturnPtLabel $ getUnique label + +blockLbl :: BlockId -> CLabel +blockLbl label = mkEntryLabel (mkFCallName (getUnique label) "block") NoCafRefs + +infoTblLbl :: BlockId -> CLabel +infoTblLbl label = mkInfoTableLabel (mkFCallName (getUnique label) "block") NoCafRefs + +-- Block environments: Id blocks +type BlockEnv a = LabelMap a + +instance Outputable a => Outputable (BlockEnv a) where + ppr = ppr . mapToList + +emptyBlockMap :: BlockEnv a +emptyBlockMap = mapEmpty +-- Block sets +type BlockSet = LabelSet -type BlockEnv a = UniqFM {- BlockId -} a -emptyBlockEnv :: BlockEnv a -emptyBlockEnv = emptyUFM -mkBlockEnv :: [(BlockId,a)] -> BlockEnv a -mkBlockEnv = listToUFM -lookupBlockEnv :: BlockEnv a -> BlockId -> Maybe a -lookupBlockEnv = lookupUFM -extendBlockEnv :: BlockEnv a -> BlockId -> a -> BlockEnv a -extendBlockEnv = addToUFM +instance Outputable BlockSet where + ppr = ppr . setElems -type BlockSet = UniqSet BlockId emptyBlockSet :: BlockSet -emptyBlockSet = emptyUniqSet -elemBlockSet :: BlockId -> BlockSet -> Bool -elemBlockSet = elementOfUniqSet -extendBlockSet :: BlockSet -> BlockId -> BlockSet -extendBlockSet = addOneToUniqSet -mkBlockSet :: [BlockId] -> BlockSet -mkBlockSet = mkUniqSet -sizeBlockSet :: BlockSet -> Int -sizeBlockSet = sizeUniqSet +emptyBlockSet = setEmpty