PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/ghc-7.0.4/compiler/cmm/BlockId.hs

http://picorec.googlecode.com/
Haskell | 159 lines | 102 code | 43 blank | 14 comment | 0 complexity | 78a503b29dca4a144ad5791ecdee840a MD5 | raw file
Possible License(s): BSD-3-Clause, BSD-2-Clause
  1. module BlockId
  2. ( BlockId(..), mkBlockId -- ToDo: BlockId should be abstract, but it isn't yet
  3. , BlockEnv, emptyBlockEnv, elemBlockEnv, lookupBlockEnv, extendBlockEnv
  4. , mkBlockEnv, mapBlockEnv
  5. , eltsBlockEnv, plusBlockEnv, delFromBlockEnv, blockEnvToList, lookupWithDefaultBEnv
  6. , isNullBEnv, sizeBEnv, foldBlockEnv, foldBlockEnv', addToBEnv_Acc
  7. , BlockSet, emptyBlockSet, unitBlockSet, isEmptyBlockSet
  8. , elemBlockSet, extendBlockSet, sizeBlockSet, unionBlockSets
  9. , removeBlockSet, mkBlockSet, blockSetToList, foldBlockSet
  10. , blockLbl, infoTblLbl, retPtLbl
  11. ) where
  12. import CLabel
  13. import IdInfo
  14. import Maybes
  15. import Name
  16. import Outputable
  17. import UniqFM
  18. import Unique
  19. import UniqSet
  20. ----------------------------------------------------------------
  21. --- Block Ids, their environments, and their sets
  22. {- Note [Unique BlockId]
  23. ~~~~~~~~~~~~~~~~~~~~~~~~
  24. Although a 'BlockId' is a local label, for reasons of implementation,
  25. 'BlockId's must be unique within an entire compilation unit. The reason
  26. is that each local label is mapped to an assembly-language label, and in
  27. most assembly languages allow, a label is visible throughout the entire
  28. compilation unit in which it appears.
  29. -}
  30. data BlockId = BlockId Unique
  31. deriving (Eq,Ord)
  32. instance Uniquable BlockId where
  33. getUnique (BlockId id) = id
  34. mkBlockId :: Unique -> BlockId
  35. mkBlockId uniq = BlockId uniq
  36. instance Show BlockId where
  37. show (BlockId u) = show u
  38. instance Outputable BlockId where
  39. ppr (BlockId id) = ppr id
  40. retPtLbl :: BlockId -> CLabel
  41. retPtLbl (BlockId id) = mkReturnPtLabel id
  42. blockLbl :: BlockId -> CLabel
  43. blockLbl (BlockId id) = mkEntryLabel (mkFCallName id "block") NoCafRefs
  44. infoTblLbl :: BlockId -> CLabel
  45. infoTblLbl (BlockId id) = mkInfoTableLabel (mkFCallName id "block") NoCafRefs
  46. -- Block environments: Id blocks
  47. newtype BlockEnv a = BlockEnv (UniqFM {- id -} a)
  48. instance Outputable a => Outputable (BlockEnv a) where
  49. ppr (BlockEnv env) = ppr env
  50. -- This is pretty horrid. There must be common patterns here that can be
  51. -- abstracted into wrappers.
  52. emptyBlockEnv :: BlockEnv a
  53. emptyBlockEnv = BlockEnv emptyUFM
  54. isNullBEnv :: BlockEnv a -> Bool
  55. isNullBEnv (BlockEnv env) = isNullUFM env
  56. sizeBEnv :: BlockEnv a -> Int
  57. sizeBEnv (BlockEnv env) = sizeUFM env
  58. mkBlockEnv :: [(BlockId,a)] -> BlockEnv a
  59. mkBlockEnv = foldl (uncurry . extendBlockEnv) emptyBlockEnv
  60. eltsBlockEnv :: BlockEnv elt -> [elt]
  61. eltsBlockEnv (BlockEnv env) = eltsUFM env
  62. delFromBlockEnv :: BlockEnv elt -> BlockId -> BlockEnv elt
  63. delFromBlockEnv (BlockEnv env) (BlockId id) = BlockEnv (delFromUFM env id)
  64. lookupBlockEnv :: BlockEnv a -> BlockId -> Maybe a
  65. lookupBlockEnv (BlockEnv env) (BlockId id) = lookupUFM env id
  66. elemBlockEnv :: BlockEnv a -> BlockId -> Bool
  67. elemBlockEnv (BlockEnv env) (BlockId id) = isJust $ lookupUFM env id
  68. lookupWithDefaultBEnv :: BlockEnv a -> a -> BlockId -> a
  69. lookupWithDefaultBEnv env x id = lookupBlockEnv env id `orElse` x
  70. extendBlockEnv :: BlockEnv a -> BlockId -> a -> BlockEnv a
  71. extendBlockEnv (BlockEnv env) (BlockId id) x = BlockEnv (addToUFM env id x)
  72. mapBlockEnv :: (a -> b) -> BlockEnv a -> BlockEnv b
  73. mapBlockEnv f (BlockEnv env) = BlockEnv (mapUFM f env)
  74. foldBlockEnv :: (BlockId -> a -> b -> b) -> b -> BlockEnv a -> b
  75. foldBlockEnv f b (BlockEnv env) =
  76. foldUFM_Directly (\u x y -> f (mkBlockId u) x y) b env
  77. foldBlockEnv' :: (a -> b -> b) -> b -> BlockEnv a -> b
  78. foldBlockEnv' f b (BlockEnv env) = foldUFM f b env
  79. plusBlockEnv :: BlockEnv elt -> BlockEnv elt -> BlockEnv elt
  80. plusBlockEnv (BlockEnv x) (BlockEnv y) = BlockEnv (plusUFM x y)
  81. blockEnvToList :: BlockEnv elt -> [(BlockId, elt)]
  82. blockEnvToList (BlockEnv env) =
  83. map (\ (id, elt) -> (BlockId id, elt)) $ ufmToList env
  84. addToBEnv_Acc :: (elt -> elts -> elts) -- Add to existing
  85. -> (elt -> elts) -- New element
  86. -> BlockEnv elts -- old
  87. -> BlockId -> elt -- new
  88. -> BlockEnv elts -- result
  89. addToBEnv_Acc add new (BlockEnv old) (BlockId k) v =
  90. BlockEnv (addToUFM_Acc add new old k v)
  91. -- I believe this is only used by obsolete code.
  92. newtype BlockSet = BlockSet (UniqSet Unique)
  93. instance Outputable BlockSet where
  94. ppr (BlockSet set) = ppr set
  95. emptyBlockSet :: BlockSet
  96. emptyBlockSet = BlockSet emptyUniqSet
  97. isEmptyBlockSet :: BlockSet -> Bool
  98. isEmptyBlockSet (BlockSet s) = isEmptyUniqSet s
  99. unitBlockSet :: BlockId -> BlockSet
  100. unitBlockSet = extendBlockSet emptyBlockSet
  101. elemBlockSet :: BlockId -> BlockSet -> Bool
  102. elemBlockSet (BlockId id) (BlockSet set) = elementOfUniqSet id set
  103. extendBlockSet :: BlockSet -> BlockId -> BlockSet
  104. extendBlockSet (BlockSet set) (BlockId id) = BlockSet (addOneToUniqSet set id)
  105. removeBlockSet :: BlockSet -> BlockId -> BlockSet
  106. removeBlockSet (BlockSet set) (BlockId id) = BlockSet (delOneFromUniqSet set id)
  107. mkBlockSet :: [BlockId] -> BlockSet
  108. mkBlockSet = foldl extendBlockSet emptyBlockSet
  109. unionBlockSets :: BlockSet -> BlockSet -> BlockSet
  110. unionBlockSets (BlockSet s) (BlockSet s') = BlockSet (unionUniqSets s s')
  111. sizeBlockSet :: BlockSet -> Int
  112. sizeBlockSet (BlockSet set) = sizeUniqSet set
  113. blockSetToList :: BlockSet -> [BlockId]
  114. blockSetToList (BlockSet set) = map BlockId $ uniqSetToList set
  115. foldBlockSet :: (BlockId -> b -> b) -> b -> BlockSet -> b
  116. foldBlockSet f z (BlockSet set) = foldUniqSet (f . BlockId) z set